Why is the enum to!string conversion so slow?

~~~slowenumtostringconversion.d
private enum S { A, B, C, D, };

version (fast) {
   string resolve (E) (E e)
   {
      static foreach (m; __traits (allMembers, E))
         if (e == __traits (getMember, E, m))
            return m;
      assert (false);
   }
}

class Expected : Exception {
   this (S s)
   {
      version (slow) {
         import std.conv : to;
super ("Expected " ~ s.to!string); // slows down compilation!
      }
      else version (fast) {
         super ("Expected " ~ resolve (s));
      }
   }
}

void main ()
{
   throw new Expected (S.C);
}
~~~

$ time dmd -version=slow slowenumtostringconversion.d

real    0m1.144s
user    0m0.820s
sys     0m0.140s

$ time dmd -version=fast slowenumtostringconversion.d

real    0m0.466s
user    0m0.290s
sys     0m0.067s


Reply via email to