This should do the job:
import std.stdio, std.perf, core.atomic;
// Cut and pasted from ParallelFuture.
void atomicIncUint(ref uint num) {
asm {
mov EAX, num;
lock;
inc int ptr [EAX];
mov EAX, [EAX];
}
}
void main() {
auto pc = new PerformanceCounter;
pc.start;
shared uint num = 0;
while(num < 100_000_000) {
atomicIncUint(num);
}
pc.stop;
writeln(pc.milliseconds); // 1772 ms
pc.start;
num = 0;
while(num < 100_000_000) {
atomicOp!"+="(num, 1U); // 2539 ms
}
pc.stop;
writeln(pc.milliseconds);
}
So the difference is there, but it's not huge. In addition, the lack of
anything like atomicOp!"++"(num); seems kind of weird.
Also, atomicOp shouldn't be so picky about types. For example, atomically
adding an int to a uint should work.
On Fri, Aug 27, 2010 at 11:43 AM, Andrei Alexandrescu <[email protected]>wrote:
> This should be validated by benchmarking.
>
> Andrei
>
>
> On 8/27/10 7:45 PDT, David Simcha wrote:
>
>> IIRC (maybe this has changed recently) atomic increments in core.atomic
>> are based on CAS instructions in a while loop, which is how more generic
>> lock free primitives are made. Atomic increment should be special cased
>> to directly use lock; inc [someRegister];.
>>
>> On Fri, Aug 27, 2010 at 10:40 AM, Sean Kelly <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> On Aug 27, 2010, at 7:11 AM, David Simcha wrote:
>> >
>> >>
>> >> I see you have some CAS instructions. Sean, I think it's a good
>> time to collaborate with David to put them into druntime or
>> std.concurrency.
>> >
>> > Yeah, D needs a real atomics library. core.atomic is a good
>> start, but I won't use it until it can efficiently do things like
>> atomic increment.
>>
>> How could it be made more efficient?
>> _______________________________________________
>> phobos mailing list
>> [email protected] <mailto:[email protected]>
>>
>> http://lists.puremagic.com/mailman/listinfo/phobos
>>
>>
>>
>>
>> _______________________________________________
>> phobos mailing list
>> [email protected]
>> http://lists.puremagic.com/mailman/listinfo/phobos
>>
> _______________________________________________
> phobos mailing list
> [email protected]
> http://lists.puremagic.com/mailman/listinfo/phobos
>
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos