[core.reflect] showcase fqn

Stefan Koch uplink.coder at googlemail.com
Thu Oct 7 10:36:42 UTC 2021


TLDR; a non-optimized fqn using core.reflect is roughly 4 times 
faster than the phobos version.

I have had issues with the fullyQualifiedName template in 
std.phobos for a while.
So I have implemented a version of it for `core.reflect.utils` 
which uses the core.reflect transitive parent reflection.

For those how are not interested in the code. First comes the 
little performance comparison.

First with an ldc optimized -O3 build of the compiler, which is 
what you should use in a commercial setting:
```
Benchmark #1: generated/linux/release/64/dmd 
-version=core_reflect -c fqn_reflect.d
   Time (mean ± σ):      19.6 ms ±   2.9 ms    [User: 14.5 ms, 
System: 5.3 ms]
   Range (min … max):    12.6 ms …  27.3 ms    142 runs

Benchmark #2: generated/linux/release/64/dmd -version=phobos_fqn 
-c fqn_reflect.d
   Time (mean ± σ):      73.9 ms ±   2.5 ms    [User: 57.1 ms, 
System: 16.9 ms]
   Range (min … max):    64.9 ms …  80.7 ms    38 runs

Summary
   'generated/linux/release/64/dmd -version=core_reflect -c 
fqn_reflect.d' ran
     3.78 ± 0.57 times faster than 'generated/linux/release/64/dmd 
-version=phobos_fqn -c fqn_reflect.d'
```

And now with a dmd debug build of the compiler that I use for 
faster iteration when working on compiler features.

```
Benchmark #1: generated/linux/release/64/dmd 
-version=core_reflect -c fqn_reflect.d
   Time (mean ± σ):      30.3 ms ±   2.4 ms    [User: 25.5 ms, 
System: 4.7 ms]
   Range (min … max):    22.7 ms …  40.9 ms    98 runs

Benchmark #2: generated/linux/release/64/dmd -version=phobos_fqn 
-c fqn_reflect.d
   Time (mean ± σ):     120.2 ms ±   2.4 ms    [User: 104.9 ms, 
System: 15.1 ms]
   Range (min … max):   116.9 ms … 125.9 ms    24 runs

Summary
   'generated/linux/release/64/dmd -version=core_reflect -c 
fqn_reflect.d' ran
     3.97 ± 0.32 times faster than 'generated/linux/release/64/dmd 
-version=phobos_fqn -c fqn_reflect.d'
```

Now comes the source of `fqn_reflect.d` unedited this time to 
avoid typos.

```
module 
reflect.showcases.nicer.java.like.package_.structure.fqn_reflect;

struct U
{
     struct V
     {
         struct W{
             class C
             { int x;  }
         }
     }
}

version (core_reflect)
{
         import core.reflect.utils;
         static assert(fqn!(U.V.W.C) == 
"reflect.showcases.nicer.java.like.package_.structure.fqn_reflect.U.V.W.C");
}
version (phobos_fqn)
{
     import std.traits;
     static assert(fullyQualifiedName!(U.V.W.C) == 
"reflect.showcases.nicer.java.like.package_.structure.fqn_reflect.U.V.W.C");
}
```

What about memory usage?

I am glad you asked. Memory usage is around 3 times lower.

Cheers,

Stefan


More information about the Digitalmars-d mailing list