Optimization fun
Dmitry Olshansky via Digitalmars-d
digitalmars-d at puremagic.com
Fri Nov 7 14:58:31 PST 2014
07-Nov-2014 09:05, H. S. Teoh via Digitalmars-d пишет:
> On Thu, Nov 06, 2014 at 02:58:16PM -0800, H. S. Teoh via Digitalmars-d wrote:
> [...]
>> 1) The GC could use some serious improvement: it just so happens that
>> the solver's algorithm only ever needs to allocate memory, never
>> release it (it keeps a hash of visited states that only grows, never
>> shrinks). The profiler indicated that one of the hotspots is the GC.
>> So I added an option to the program to call GC.disable() if a command
>> line option is given. The result is a 40%-50% reduction in running
>> time.
> [...]
>
> Yet more GC drama unfolded tonight: while testing my new GC-disabling
> option on several other puzzles, one instance ate up my PC's RAM at an
> astonishing rate, causing the system to almost freeze up from the
> ensuing thrashing. A little investigation revealed that there are
> several instances of excessive GC load caused by unnecessary
> (re)allocations.
That's the problem with profilers:
they say what takes time but not why :)
Often I find myself looking at memcpy at the top of the list, so obvious
the "textbook" answer is to optimize memcpy ;) In contrast it should be
read as "you seem to do excessive copying of data".
> The moral of the story, is that code like the following should raise big
> red warning flags:
>
> struct MyData(T) {
> T[] data;
> T pop() {
> ...
> data.length--; // <--- yikes
> ...
> }
> void push(T t) {
> ...
> data ~= t; // <--- yikes
> ...
> }
> }
Well known in the inner circles performance bug. Sadly most of D
programmers are bound to hit it once in the while.
Memory safety "by default" has its costs.
Though I'd just call mmap, far more predictable then these pesky memory
allocators + no need to reallocate if reserved range is large enough.
--
Dmitry Olshansky
More information about the Digitalmars-d
mailing list