On Tuesday, 17 January 2023 at 23:08:19 UTC, Siarhei Siamashka wrote:
On Tuesday, 17 January 2023 at 21:50:06 UTC, matheus wrote:
Question: Have you compared the timings between this way (With ranges) and a normal way (Without ranges)?

If you are intensively using ranges, UFCS or the other convenient high level language features, then the compiler choice does matter a lot. And only LDC compiler is able to produce fast binaries from such source code.
...

I ran in two sites: https://onecompiler.com/d and then https://godbolt.org/, with the latter I set LDC with -O2.

My version (Source in the end) ran about 2x faster than the version with ranges.

...

I'm using D Online Compiler from different platforms but unfortunately I can't loop too much because they don't accept, but anyway a normal version runs almost twice faster than this version (With ranges).

Can you try to run the following diagnostics program on this D Online Compiler platform? https://gist.github.com/ssvb/5c926ed9bc755900fdaac3b71a0f7cfd

https://onecompiler.com/d/3yv7t9ap9

Gives me:

HelloWorld.d(43): Error: undefined identifier `volatileStore`
HelloWorld.d(44): Error: undefined identifier `volatileLoad`



If you like I could send or post here a version without ranges to try out.

Please post it. This is interesting.

Like I said above I ran my version against the one with ranges (From: https://github.com/quickfur/dcal/blob/master/dcal.d), and I modified to just print the calendar for some year.

With godbolt.org LDC -O2 my version ran 2x faster, and here is the source:

import std.stdio, std.string, std.conv, std.range, std.datetime;
import std.datetime.stopwatch : benchmark, StopWatch;

void draw_months(int year ,int month, int columns){
  int i;

  if(month>12){return;}

  auto columspace = " ".replicate(columns);

  write("\n");
  for(i=0;i<columns;++i){
    if(month+i>12){break;}
write(" " ~ " ".replicate(11*(i>0)) ~ columspace,capitalize(to!string(Date(year,month+i,1).month)));
  }

  write("\n");
  auto m = new string[][](columns);
  for(int j=0;j<columns;++j){
    if(month+j>12){return;}
    for(i=1;i<8;++i){
        write(to!string(Date(1899,1,i).dayOfWeek)[0..2], " ");
    }

    int c = DW[to!string(Date(year,month+j,1).dayOfWeek)];
    auto dm = Date(2023,month+j,1).daysInMonth;

    for(i=0;i<c;++i){ m[j] ~= " "; }
    for(i=1;i<dm+1;++i){ m[j] ~= i.to!string; }
    for(;i<36;++i){ m[j] ~= " "; }

    write(columspace);
  }

  //write("\n\n",m[0].length,"\n");
  writeln();
  for(int k=0;k<5;++k){
    for(int j=0;j<columns;++j){
      for(i=k*7;i<(k+1)*7;++i){
        writef("%2s ",m[j][i]);
      }
      write(columspace);
    }
    writeln();
  }
}

void draw_year(int year, int columns){
  int steps = 12/columns;

  for(int i=0;i<steps;++i){
    draw_months(2023,(i*columns)+1,columns);
  }
}

int[string] DW;

void main(){
    int[string] dow;
    int i, y = 2023, m = 1, d = 1;

    auto sw = StopWatch();
    sw.start();

    for(i=1;i<8;++i){
      DW[to!string(Date(1899,1,i).dayOfWeek)]=i-1;
    }

    for(i=0;i<10;++i){
      draw_year(2023,3);
    }
    sw.stop();
    writeln(sw.peek.total!"usecs");
}

Matheus.

Reply via email to