hot path optimizations in uma_zalloc() & uma_zfree()
Andriy Tkachuk
andrit at ukr.net
Sat Jul 2 10:29:18 GMT 2005
I have doubts it will works:
- item = bucket->ub_bucket[--bucket->ub_cnt];
- 1bbe: 66 ff 49 08 decw 0x8(%ecx)
- 1bc2: 0f bf 41 08 movswl 0x8(%ecx),%eax
- 1bc6: 8b 44 81 14 mov 0x14(%ecx,%eax,4),%eax
- 1bca: 89 45 f0 mov %eax,0xfffffff0(%ebp)
+ item = *(--bucket->ub_last);
+ 1bbe: 8b 51 0c mov 0xc(%ecx),%edx
+ 1bc1: 8d 42 fc lea 0xfffffffc(%edx),%eax
+ 1bc4: 89 41 0c mov %eax,0xc(%ecx)
+ 1bc7: 8b 52 fc mov 0xfffffffc(%edx),%edx
+ 1bca: 89 55 f0 mov %edx,0xfffffff0(%ebp)
here even more refereces to memory in your variant.
- bucket->ub_bucket[bucket->ub_cnt++] = item;
- 22b9: 0f bf c2 movswl %dx,%eax
- 22bc: 8b 4d 0c mov 0xc(%ebp),%ecx
- 22bf: 89 4c 83 14 mov %ecx,0x14(%ebx,%eax,4)
- 22c3: 8d 42 01 lea 0x1(%edx),%eax
- 22c6: 66 89 43 08 mov %ax,0x8(%ebx)
+ *(bucket->ub_last++) = item;
+ 22b9: 8b 43 0c mov 0xc(%ebx),%eax
+ 22bc: 8b 55 0c mov 0xc(%ebp),%edx
+ 22bf: 89 10 mov %edx,(%eax)
+ 22c1: 83 43 0c 04 addl $0x4,0xc(%ebx)
----- Original Message -----
From: "Nikos Ntarmos" <ntarmos at ceid.upatras.gr>
To: "ant" <andrit at ukr.net>
Cc: <hackers at freebsd.org>
Sent: Thursday, June 30, 2005 7:31 PM
Subject: Re: hot path optimizations in uma_zalloc() & uma_zfree()
> Hi there.
>
> I wouldn't have gone into this if ant hadn't produced that 10% figure
> for the speed improvement with simply reordering of increments and
> dereferences (although jhb@ reported the speed-up he noticed was much
> less than that).
>
> I attach* a patch that: (i) incorporates ant's exchange of uc_freebucket
> for uc_allocbucket, and (ii) throws away the uma_bucket.ub_cnt counter
> of free bucket entries, in favor of a pointer -- uma_bucket.ub_last --
> to the last free bucket entry. If a simple reordering is capable of
> producing a 10% improvement, this change should do much better, since it
> saves the 'add-' in the 'add-and-dereference' process of using arrays
> and counters. The semantics of the pointer closely follow those of the
> ub_cnt counter: ub_last - ub_bucket should equal the old value of
> ub_cnt.
>
> I grep'ed through the whole source repository and the uses of
> uma_bucket.ub_cnt seem confined within sys/vm/uma_core.c, so this change
> must be quite self-contained -- i.e. the change in the fields of
> uma_bucket doesn't seem to affect any other part of the system. One
> could argue that it may make the code a bit less readable, but it only
> affects uma_core.c, so it may be worth the "inconvenience".
>
> I don't have a FreeBSD box around any more, so I can't test this patch.
> Heck, I can't either check it for syntax errors and such, so don't throw
> things at me if this doesn't even compile. Can somebody with the time
> and resources give it a try?
>
> \n\n
>
> * Also online at http://noth.ceid.upatras.gr/Misc/uma_bucket.diff
> to avoid being bitten by mailers auto{wrapp,indent}ing the diff
> content.
>
More information about the freebsd-hackers
mailing list