While investigating std.regex performance in Phobos I've found that a
lot of stuff never gets inlined (contrary to my expectations).
Namely the 3 critical ones were declared like this:
struct Bytecode{
uint raw;
//bit twiddling helpers
@property uint data() const { return raw & 0x003f_ffff; }
//ditto
@property uint sequence() const { return 2 + (raw >> 22 & 0x3); }
//ditto
@property IR code() const { return cast(IR)(raw>>24); }
...
}
And my quick hack to get them inlined - 0-arg templates:
https://github.com/D-Programming-Language/phobos/pull/1553
The "stuff" in question turns out to be anything that is not a template
and (consequently) is compiled into library. At first I thought it's a
horrible bug somewhere in DMD's inliner, but this behavior is the same
regardless of compiler. (It could be a bug of the front-end in general)
Few days after filing the bug report with minimal test case:
http://d.puremagic.com/issues/show_bug.cgi?id=10985
I'm not so sure if that's not an issue of separate compilation to begin
with. I *thought* that the intended behavior is
a) Have source - compile from source
b) Don't have source (*.di files) - link in objects
But I don't have much to go on this. Somebody from compiler team could
probably shed some light on this. If I'm wrong then 0-arg templates is
actually the only way out to get 'explicitly inline' of C++.
In C++ that would look like this:
//header
struct A{
int foo();
}
//source
int A::foo(){ ... }
C++ explicitly inlined:
//header
struct A{
int foo(){ ... }
}
In D we don't have this distinction.
It has to be decided then if we adopt 0-arg as intended solution, or
tweak front-end to always peruse accessible source when inlining.
Anyhow as it stands you have one of the following:
a) Do nothing. Then using e.g. isAlpha from std.ascii (or pick your
favorite one-liner) is useless as it would never outperform a
hand-rolled version (that could be 1:1 the same) because the latter will
be inlined.
b) Pass all of the interesting files from Phobos on the command line to
get them fully scanned for inlining (and get compiled anew each time I
guess).
c) For code under your control - add an empty pair of brackets to
anything that has to be inlined.
None of the above options is nice.
--
Dmitry Olshansky