range behaviour

Dicebot via Digitalmars-d digitalmars-d at puremagic.com
Wed May 14 06:29:33 PDT 2014


On Wednesday, 14 May 2014 at 06:00:33 UTC, Ola Fosheim Grøstad 
wrote:
> Besides, D ranges will never perform as well as an optimized 
> explicit loop, so you might as well aim for usability over 
> speed.

There is no single reason why this should be true. Actually 
ranges of medium complexity are already very close to explicit 
loops in D when you use something like LDC.

Consider sample program like this:

   1 void main()
   2 {
   3     import std.stdio;
   4     int max;
   5     readf("%d", &max);
   6     assert(foo1(max) == foo2(max));
   7 }
   8
   9 int foo1(int max)
  10 {
  11     int sum = 0;
  12     for (auto i = 0; i < max; ++i)
  13     {
  14         sum += i*2;
  15     }
  16     return sum;
  17 }
  18
  19 int foo2(int max)
  20 {
  21     import std.algorithm : reduce, map;
  22     import std.range : iota;
  23     return reduce!((a, b) => a + b)(0, iota(0, max).map!(a => 
a*2));
  24 }

Disassembly (ldmd2 -O -release -inline):

   765 0000000000402df0 <_D4test4foo1FiZi>:
   766   402df0:   31 c0                   xor    %eax,%eax
   767   402df2:   85 ff                   test   %edi,%edi
   768   402df4:   7e 10                   jle    402e06 
<_D4test4foo1FiZi+0x16>
   769   402df6:   8d 47 ff                lea    -0x1(%rdi),%eax
   770   402df9:   8d 4f fe                lea    -0x2(%rdi),%ecx
   771   402dfc:   0f af c8                imul   %eax,%ecx
   772   402dff:   83 e1 fe                and    $0xfffffffe,%ecx
   773   402e02:   8d 44 79 fe             lea    
-0x2(%rcx,%rdi,2),%eax
   774   402e06:   c3                      retq
   775   402e07:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
   776   402e0e:   00 00
   777
   778 0000000000402e10 <_D4test4foo2FiZi>:
   779   402e10:   31 c0                   xor    %eax,%eax
   780   402e12:   85 ff                   test   %edi,%edi
   781   402e14:   0f 48 f8                cmovs  %eax,%edi
   782   402e17:   85 ff                   test   %edi,%edi
   783   402e19:   74 10                   je     402e2b 
<_D4test4foo2FiZi+0x1b>
   784   402e1b:   8d 47 ff                lea    -0x1(%rdi),%eax
   785   402e1e:   8d 4f fe                lea    -0x2(%rdi),%ecx
   786   402e21:   0f af c8                imul   %eax,%ecx
   787   402e24:   83 e1 fe                and    $0xfffffffe,%ecx
   788   402e27:   8d 44 79 fe             lea    
-0x2(%rcx,%rdi,2),%eax
   789   402e2b:   c3                      retq
   790   402e2c:   0f 1f 40 00             nopl   0x0(%rax)

it is almost identical. I fully expect to be 100% identical at 
certain point of compiler maturity.


More information about the Digitalmars-d mailing list