first numbers: type function vs template
Stefan Koch
uplink.coder at googlemail.com
Fri Aug 21 19:13:30 UTC 2020
Good Evening,
I have been talking about type functions for a while now, and
have claimed theoretical performance improvements when compared
to templates.
As well as nicer syntax.
Unfortunately, in the example I am about to present the type
function syntax is not going to look better than the template.
---
class C0{}
class C1 : C0{}
// 497 class definitions omitted for brevity
alias CX = C498;
version (templ)
{
template type_h_template(T)
{
static if (is(T S == super) && S.length)
{
enum type_h_template = ( T.stringof ~ " -> " ~
S[0].stringof ~ "\n" ~ .type_h_template!(S));
}
else
{
enum type_h_template = "";
}
}
static assert(type_h_template!(CX));
}
else
{
string type_hierachy(alias T)
{
string result;
alias base_class;
// for now this is a typefunction-only __trait
base_class = __traits(getBaseClass, T);
while(is(base_class))
{
result ~= T.stringof ~ " -> " ~ base_class.stringof ~
"\n";
T = base_class;
base_class = __traits(getBaseClass, T);
}
return result;
}
static assert(type_hierachy(CX));
}
---
Note: that the template recursion limit is 500 which is why we
can only go up to C498, the type function can work with virtually
infinitely deep hierarchies
I now run the following command to benchmark:
hyperfine "generated/linux/release/64/dmd test_getBaseClass.d
-sktf -o-" "generated/linux/release/64/dmd test_getBaseClass.d
-sktf -version=templ -o-" -w 20 -r 500
And it results in:
Benchmark #1: generated/linux/release/64/dmd test_getBaseClass.d
-sktf -o-
Time (mean ± σ): 21.4 ms ± 2.8 ms [User: 16.8 ms,
System: 4.9 ms]
Range (min … max): 14.0 ms … 29.3 ms 500 runs
Benchmark #2: generated/linux/release/64/dmd test_getBaseClass.d
-sktf -version=templ -o-
Time (mean ± σ): 33.0 ms ± 2.6 ms [User: 26.9 ms,
System: 6.3 ms]
Range (min … max): 24.9 ms … 41.6 ms 500 runs
Summary
'generated/linux/release/64/dmd test_getBaseClass.d -sktf -o-'
ran
1.54 ± 0.24 times faster than 'generated/linux/release/64/dmd
test_getBaseClass.d -sktf -version=templ -o-'
Which shows that the type function is 1.5x faster for the chosen
task, given naive implementations of both the type function and
the template.
In terms of memory a quick best out of three reveals:
19080k for the template and
14328k for the type function.
Which is a reduction by roughly 25%.
I am rather pleased by those numbers, given that type functions
are still very much proof of concept and rather unoptimized.
More information about the Digitalmars-d
mailing list