Inherent code performance advantages of D over C?

John Colvin john.loughran.colvin at gmail.com
Sat Dec 7 02:14:52 PST 2013


On Saturday, 7 December 2013 at 09:46:11 UTC, Joseph Rushton 
Wakeling wrote:
> On 07/12/13 09:14, Walter Bright wrote:
>> There are several D projects which show faster runs than C. If 
>> your goal is to
>> pragmatically write faster D code than in C, you can do it 
>> without too much
>> effort. If your goal is to find problem(s) with D, you can 
>> certainly do that, too.
>
> Well, as the author of a D library which outperforms the C 
> library that inspired it (at least within the limits of its 
> much smaller range of functionality; it's been a bit neglected 
> of late and needs more input) ...
>
> ... the practical experience I've had is that more than an 
> outright performance comparison, what it often comes down to is 
> effort vs. results, and the cleanliness/maintainability of the 
> resulting code.  This is particularly true when it comes to C 
> code that is designed to be "safe", with all the resulting 
> boilerplate.  It's typically possible to match or exceed the 
> performance of a C program with much more concise and easy to 
> follow D code.
>
> Another factor that's important here is that C and D in general 
> seem to lead to different design solutions.  Even if one has an 
> exact example in C to compare to, the natural thing to do in D 
> is often something different, and that leads to subtle and 
> not-so-subtle implementation differences that in turn affect 
> performance.
>
> Example: in the C library that was my inspiration, there's a 
> function which requires the user to pass a buffer, to which it 
> writes a certain set of values which are calculated from the 
> underlying data.  I didn't much like the idea of compelling the 
> user to pass a buffer, so when I wrote my D equivalent I used 
> stuff from std.range and std.algorithm to make the function 
> return a lazily-evaluated range that would offer the same 
> values as the C code stored in the buffer array.
>
> I assumed this might lead to a small overall performance hit 
> because the C program could just write once to a buffer and 
> re-use the buffer, whereas I might be lazily calculating and 
> re-calculating.  Unfortunately it turned out that for whatever 
> reason, my lazily-calculated range was somehow responsible for 
> lots of micro allocations, which slowed things down a lot.  (I 
> tried it out again earlier this morning, just to refresh my 
> memory, and it looks like this may no longer be the case; so 
> perhaps something has been fixed here...)
>
> So, that in turn led me to another solution again, where 
> instead of an external buffer being passed in, I created an 
> internal cache which could be written to once and re-used again 
> and again and again, never needing to recalculate unless the 
> internal data was changed.
>
> Now, _that_ turned out to be significantly faster than the C 
> program, which was almost certainly doing unnecessary 
> recalculation of the buffer -- because it recalculated every 
> time the function was called, whereas my program could rely on 
> the cache, calculate once, and after that just return the slice 
> of calculated values.  On the other hand, if I tweaked the 
> internals of the function so that every call _always_ involved 
> recalculating and rewriting to the cache, it was slightly 
> slower than the C -- probably because now it was the C code 
> that was doing less recalculation, because code that was 
> calling the function was calling it once and then using the 
> buffer, rather than calling it multiple times.
>
> TL;DR the point is that writing in D gave me the opportunity to 
> spend mental and programming time exploring these different 
> choices and focusing on algorithms and data structures, rather 
> than all the effort and extra LOC required to get a 
> _particular_ idea running in C.  That's where the real edge 
> arises.

This is exactly how I see it too. Well said.


More information about the Digitalmars-d mailing list