On Tuesday, 22 December 2015 at 17:23:11 UTC, Andrew Chapman wrote:
On Tuesday, 22 December 2015 at 17:18:16 UTC, cym13 wrote:
On Tuesday, 22 December 2015 at 17:15:27 UTC, Andrew Chapman wrote:
Sorry if this is a silly question but is the to! method from the conv library the most efficient way of converting an integer value to a string?

e.g.
string s = to!string(100);

I'm seeing a pretty dramatic slow down in my code when I use a conversion like this (when looped over 10 million iterations for benchmarking).

Cheers!

Out of curiosity a slow down compared to what? No conversion at all?

Yeah, if I include a simple conversion in my loop:

        for({int i; i = 0;} i < num; i++) {
                //string s = to!string(i);
Customer c = Customer(i, "Customer", "99998888", i * 2);
                string result = objS.serialize(c);
        }

If I uncomment the "string s" line I'm seeing a 20% increase in running time, which given what's going on the rest of the code is quite surprising. I've tried compiling with both dmd and ldc2 - it's the same under both.

Cheers.

Dynamic memory allocation is expensive. If the string is short-lived, allocate it on the stack:

enum maxDigits = to!string(ulong.max).length;
foreach(i; 0 .. num) {
    char[maxDigits] buffer = void;
    auto c = Customer(sformat(buffer[], "%s", i));
    string result = objS.serialize(c);
}

Note that this is unsafe if the string (sformat's return value) outlives the loop iteration, as this is `buffer`'s scope.

Reply via email to