size_t for length on x64 will make app slower than on x86?
Marco Leise via Digitalmars-d
digitalmars-d at puremagic.com
Tue Nov 18 12:23:22 PST 2014
Am Sun, 16 Nov 2014 13:39:22 +0000
schrieb "FrankLike" <1150015857 at qq.com>:
> 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.
No, you will not get 'int' instead of 'size_t' in 2.067
because a dubious showed you it is faster. In fact when you
write the code like this and use 1000 times more iterations to
get a reading at all, it looks like this:
--------------------------
import std.stdio;
import std.datetime;
alias ℕ = size_t;
void ada()
{
foreach (ℕ i; 0 .. 1_000_000_000) {}
}
void main()
{
StopWatch sw;
sw.start();
ada();
sw.stop();
writefln("time is: %s secs", sw.peek().msecs/1000.0);
}
------------------------
And prints 0.461 secs for both
dmd -m32 -boundscheck=off -release -inline -O
and
dmd -m64 -boundscheck=off -release -inline -O
on my laptop.
When I change 'ada' to:
ℕ ada()
{
ℕ v;
foreach (ℕ i; 0 .. 1_000_000_000)
{
v = i+i;
}
return v;
}
the -m64 version becomes a lot slower (0.731 secs) compared to
the -m32 version (which stays at 0.461 secs). That does not
have to do with size_t though: If I change the definition of ℕ
to uint or int in the 64-bit version it stays slow. It is just
a difference in the generated code for the loop that makes the
64-bit version generally 270 ms slower.
Now to get some more interesting numbers let's chose an
operation that is inherently O(n) in regards to bit-width:
division
ℕ ada()
{
ℕ v;
foreach (ℕ i; 1 .. 1_000_000_001)
{
v = i/i;
}
return v;
}
Results:
alias ℕ = ulong: 17.07 secs
alias ℕ = uint: 5.80 secs
alias ℕ = int: 5.53 secs
The differences for uint and int are compiler dependent. With
LDC uint is faster than int by a similar amount.
--
Marco
More information about the Digitalmars-d
mailing list