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.