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.

Reply via email to