Dynamic Closure + Lazy Arguments = Performance Killer?

Steven Schveighoffer schveiguy at yahoo.com
Tue Oct 28 21:45:27 PDT 2008


"Jason House" wrote
> Jason House Wrote:
>
>> Gregor Richards Wrote:
>>
>> > Jason House wrote:
>> > > I ported some monte carlo simulation code from Java to D2, and 
>> > > performance is horrible.
>> > >
>> > > 34% of the execution time is used by std.random.uniform. To my great 
>> > > surprise, 25% of the execution  time is memory allocation (and 
>> > > collection) from that random call. The only candidate source I see is 
>> > > a call to ensure with lazy arguments. The memory allocation occurs at 
>> > > the start of the UniformDistribution call. I assume this is dynamic 
>> > > closure kicking in.
>> > >
>> > > Can anyone verify that this is the case?
>> > >
>> > > 600000 memory allocations per second really kills performance!
>> >
>> > Java has a much better garbage collector than D, as it doesn't need to
>> > be conservative.
>> >
>> >   - Gregor Richards
>>
>> The code is written to explicitly avoid memory allocation, especially in 
>> tight loops. Without this dynamic closure, the garbage collecor would 
>> never run. This case is especially pathetic since the call to ensure will 
>> never trigger.
>>
>> This is part of a mini language shootout. The Java version I cloned runs 
>> 4x faster. This is only one piece of a much bigger problem.
>
> I was wrong about the 4x thing. I have bad hardware. After fixing the 
> accidental allocation and running both the D and Java version on the same 
> box, they're only 1% different.

When you say 'fixing the accidental allocation' you mean removing the case 
where a dynamic closure was allocated?

I just want to make sure that is clear.

-Steve 





More information about the Digitalmars-d mailing list