Would you trade 0.1% in performance for a better debugging experience?

Vladimir Panteleev via Digitalmars-d digitalmars-d at puremagic.com
Mon Nov 17 15:14:31 PST 2014


I proposed to build Phobos and Druntime with stack frames enabled:

https://issues.dlang.org/show_bug.cgi?id=13726

Stack frames add three CPU instructions to each function (two in 
the prolog, and one in the epilog). This creates a linked list 
which debuggers, profilers, etc. can easily walk to find which 
function called which. They would allow debugging certain classes 
of bugs much more easily (e.g. the recurring 
InvalidMemoryOperationError - there's a thread about it in 
D.learn just today), and profiling your code with polling 
(non-instrumenting) profilers.

As I understood, in theory, debug information (DWARF and PDB, 
probably not CV) should also contain information allowing an 
accurate stack walk, but it doesn't look like we're currently 
emitting debug information to that level of accuracy. Not all 
debuggers/profilers understand this debug information, either 
(whereas walking the linked list emitted by the stack frames is 
trivial).

We could also start bundling debug builds of Phobos. However, 
these will not help in cases where the performance impact of 
using a full-blown debug build is not acceptable (e.g. if it'll 
skew the profiling results too much, or if you just want readable 
stack frames for your D web service in production).

How much will this cost in performance?

I've run two benchmarks, both show a figure around 0.1%. Many 
performance-sensitive parts of Phobos (std.algorithm) are 
templated and thus are not affected by the Makefile switches. The 
GC is built with -inline, which, although it causes the call 
stack to not contain inlined functions, doesn't cause it to 
abruptly break off like without stack frames.

Is D the first to build its release stdlib with stack frames?

Nope. Microsoft's C release runtime is built stack frames enabled.

Personally, I think the 0.1% is practically negligible 
considering the advantages. My proposal was rejected, so I'd like 
to hear more opinions about this. What do you think?

If you want to run some benchmarks yourself, here are the patches:

https://github.com/CyberShadow/phobos/compare/enable-stack-frames?expand=1
https://github.com/CyberShadow/druntime/compare/enable-stack-frames?expand=1

Or, using Digger:

digger build 
v2.065.0+CyberShadow/phobos/enable-stack-frames+CyberShadow/druntime/enable-stack-frames

Previous discussion from 2012:
http://forum.dlang.org/post/zebqmrhcigfuockcpsfa@forum.dlang.org


More information about the Digitalmars-d mailing list