foreach thoughts

Dicebot public at dicebot.lv
Tue Jan 14 08:30:59 PST 2014


Some experimental data.

---- test program ----

auto input()
{
     int[] arr;

     foreach (i; 0..6)
     {
         import std.stdio;
         int x;
         readf(" %d ", &x);
         arr ~= x;
     }

     return arr;
}

int main()
{
     import std.algorithm;

     auto arr = input();
     int sum;

     // version algo
     foreach (elem; arr.filter!( x => x % 2 ))
     {
         sum += elem;
     }

     // version raw
     foreach (elem; arr)
     {
         if (elem % 2)
             sum += elem;
     }

     return sum;
}

------

Disassemblies for latest LDC (ldmd2 -O -release -inline):

$ cat test-ldc-algo.dump
0000000000402eb0 <_Dmain>:
   402eb0:	50                   	push   %rax
   402eb1:	e8 fa fe ff ff       	callq  402db0 <_D4test5inputFZAi>
   402eb6:	48 89 c1             	mov    %rax,%rcx
   402eb9:	31 c0                	xor    %eax,%eax
   402ebb:	48 85 c9             	test   %rcx,%rcx
   402ebe:	74 4d                	je     402f0d <_Dmain+0x5d>
   402ec0:	f6 02 01             	testb  $0x1,(%rdx)
   402ec3:	75 0b                	jne    402ed0 <_Dmain+0x20>
   402ec5:	48 83 c2 04          	add    $0x4,%rdx
   402ec9:	48 ff c9             	dec    %rcx
   402ecc:	75 f2                	jne    402ec0 <_Dmain+0x10>
   402ece:	eb 3d                	jmp    402f0d <_Dmain+0x5d>
   402ed0:	31 c0                	xor    %eax,%eax
   402ed2:	eb 34                	jmp    402f08 <_Dmain+0x58>
   402ed4:	66 66 66 2e 0f 1f 84 	data32 data32 nopw 
%cs:0x0(%rax,%rax,1)
   402edb:	00 00 00 00 00
   402ee0:	03 02                	add    (%rdx),%eax
   402ee2:	66 66 66 66 66 2e 0f 	data32 data32 data32 data32 nopw 
%cs:0x0(%rax,%rax,1)
   402ee9:	1f 84 00 00 00 00 00
   402ef0:	48 85 c9             	test   %rcx,%rcx
   402ef3:	74 1a                	je     402f0f <_Dmain+0x5f>
   402ef5:	48 83 f9 01          	cmp    $0x1,%rcx
   402ef9:	74 12                	je     402f0d <_Dmain+0x5d>
   402efb:	48 ff c9             	dec    %rcx
   402efe:	f6 42 04 01          	testb  $0x1,0x4(%rdx)
   402f02:	48 8d 52 04          	lea    0x4(%rdx),%rdx
   402f06:	74 e8                	je     402ef0 <_Dmain+0x40>
   402f08:	48 85 c9             	test   %rcx,%rcx
   402f0b:	75 d3                	jne    402ee0 <_Dmain+0x30>
   402f0d:	5a                   	pop    %rdx
   402f0e:	c3                   	retq
   402f0f:	bf e0 0a 68 00       	mov    $0x680ae0,%edi
   402f14:	be 9e 01 00 00       	mov    $0x19e,%esi
   402f19:	e8 c2 c2 02 00       	callq  42f1e0 <_d_array_bounds>
   402f1e:	66 90                	xchg   %ax,%ax

$ cat test-ldc-raw.dump
0000000000402eb0 <_Dmain>:
   402eb0:	50                   	push   %rax
   402eb1:	e8 fa fe ff ff       	callq  402db0 <_D4test5inputFZAi>
   402eb6:	48 89 c1             	mov    %rax,%rcx
   402eb9:	31 c0                	xor    %eax,%eax
   402ebb:	48 85 c9             	test   %rcx,%rcx
   402ebe:	74 17                	je     402ed7 <_Dmain+0x27>
   402ec0:	8b 3a                	mov    (%rdx),%edi
   402ec2:	89 fe                	mov    %edi,%esi
   402ec4:	c1 e6 1f             	shl    $0x1f,%esi
   402ec7:	c1 fe 1f             	sar    $0x1f,%esi
   402eca:	21 fe                	and    %edi,%esi
   402ecc:	01 f0                	add    %esi,%eax
   402ece:	48 83 c2 04          	add    $0x4,%rdx
   402ed2:	48 ff c9             	dec    %rcx
   402ed5:	75 e9                	jne    402ec0 <_Dmain+0x10>
   402ed7:	5a                   	pop    %rdx
   402ed8:	c3                   	retq
   402ed9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)

So it does inline but end result is still less optimal 
assembly-wise.


More information about the Digitalmars-d mailing list