That's correct. Moving 64 bit values on a 32 bit machine results in at least 2 machine instructions.

However I noticed that calling Length on Array in C# is inlined whereas LongLenth is a function call even in release mode.


var length = array.Length;
000007FE8E453AF2  mov         rax,qword ptr [rsp+20h]
000007FE8E453AF7  mov         rax,qword ptr [rax+8]
000007FE8E453AFB  mov         dword ptr [rsp+30h],eax


var longLength = array.LongLength;
000007FE8E453B56  mov         rax,qword ptr [rsp+20h]
000007FE8E453B5B  cmp         byte ptr [rax],0
000007FE8E453B5E  mov         rcx,qword ptr [rsp+20h]
000007FE8E453B63  call        000007FEEE082AB4
000007FE8E453B68  mov         qword ptr [rsp+68h],rax
000007FE8E453B6D  mov         rax,qword ptr [rsp+68h]
000007FE8E453B72  mov         qword ptr [rsp+40h],rax



On Sunday, 16 November 2014 at 16:03:30 UTC, Xinok wrote:
On Sunday, 16 November 2014 at 13:39:24 UTC, FrankLike wrote:
Many old projects need move from x86 to x64,but the 'length' type is size_t,it will change on x64,so a lot of work must to do.but I find some info which is help for d:
http://www.dotnetperls.com/array-length.
it means:
test length and longlength, and found 'test longlength' is slower than 'test length'.

 0.64 ns   Length
 2.55 ns   LongLength

I love D.So I don't want my app on x64 slower than on x86.

Hope change in 2.067.

Thank you all.

We're missing too many details regarding how he ran his benchmark. If he compiled and ran his code as 32-bit, that could explain the discrepancy.

Reply via email to