On Thursday, 3 March 2022 at 23:46:49 UTC, H. S. Teoh wrote:
...
This version doesn't even allocate extra storage for the filtered digits, since no storage is actually needed (each digit is spooled directly to the output).

OK but there is another problem, I tested your version and mine and there is a HUGE difference in speed:

LDC 1.27.1, with -O2:

import std.datetime.stopwatch;
import std.stdio: write, writeln, writef, writefln;
import std;

void printStrTim(string s,StopWatch sw){
    writeln("\nstr: ", s
            ,"\nTim(ms): ", sw.peek.total!"msecs"
            ,"\nTim(us): ", sw.peek.total!"usecs"
           );
}

void main(){
    auto sw = StopWatch(AutoStart.no);
    string s, str = "4A0B1de!2C9~6";
    int j;

    sw.start();
    for(j=0;j<1_000_000;++j){
        s="";
        foreach(i;str){
            (i >= '0' && i <= '9') ? s~=i : null;
        }
    }
    sw.stop();
    printStrTim(s,sw);

    s = "";
    sw.reset();
    sw.start();
    for(j=0;j<1_000_000;++j){
        s="";
        s = str.filter!(ch => ch.isDigit).to!string;
    }
    sw.stop();
    printStrTim(s,sw);
}

Prints:

str: 401296
Tim(ms): 306
Tim(us): 306653

str: 401296
Tim(ms): 1112
Tim(us): 1112648

-------------------------------

Unless I did something wrong (If anything please tell). By the way on DMD was worse, it was like 5x slower in your version.

Matheus.

Reply via email to