Re: Why is for() less efficient than foreach?

2017-02-10 Thread Dukc via Digitalmars-d-learn

On Friday, 10 February 2017 at 13:33:55 UTC, Bastiaan Veelo wrote:

Thanks, I should have spotted that.

Bastiaan.


No, you don't even have to spot things like that. If you assert() 
the result that is. (Not a rant, half of us wouldn't probably 
have bothered).





Re: Why is for() less efficient than foreach?

2017-02-10 Thread Bastiaan Veelo via Digitalmars-d-learn

On Friday, 10 February 2017 at 12:58:19 UTC, Stefan Koch wrote:

If you want it to modify the array you have to use a ref elem.
If you do you will see that foreach is a little slower.


Thanks, I should have spotted that.

Bastiaan.


Re: Why is for() less efficient than foreach?

2017-02-10 Thread Bastiaan Veelo via Digitalmars-d-learn

On Friday, 10 February 2017 at 12:57:38 UTC, biozic wrote:
On Friday, 10 February 2017 at 12:39:50 UTC, Bastiaan Veelo 
wrote:

void foreach_loop()
{
foreach(n, elem; d[])
elem = a[n] * b[n] / c[n];
}


It's fast because the result of the operation (elem) is 
discarded on each iteration, so it is probably optimized away.

Try:
```
void foreach_loop()
{
foreach(n, ref elem; d[])
elem = a[n] * b[n] / c[n];
}
```


Hah, of course.


You can also do:
```
d = a[] * b[] / c[];
```
with no loop statement at all.


Nice.

Thanks.


Re: Why is for() less efficient than foreach?

2017-02-10 Thread evilrat via Digitalmars-d-learn

On Friday, 10 February 2017 at 13:13:24 UTC, evilrat wrote:


On my machine (AMD FX-8350) actually almost no difference



oops, it skips flags with -run -_-
sorry

dmd loops.d -release
Function 0 took: 16 ╬╝s and 5 hnsecs
Function 1 took: 55 secs, 262 ms, 844 ╬╝s, and 6 hnsecs
Function 2 took: 56 secs, 564 ms, 231 ╬╝s, and 6 hnsecs

ldc2 loops.d -release
Function 0 took: 25 ╬╝s and 5 hnsecs
Function 1 took: 46 secs, 757 ms, 889 ╬╝s, and 7 hnsecs
Function 2 took: 23 secs, 895 ms, 410 ╬╝s, and 3 hnsecs

dmd loops.d -m64 -release
Function 0 took: 24 ╬╝s and 7 hnsecs
Function 1 took: 27 secs, 752 ms, 952 ╬╝s, and 5 hnsecs
Function 2 took: 36 secs, 550 ms, 295 ╬╝s, and 4 hnsecs

ldc2 loops.d -m64 -release
Function 0 took: 25 ╬╝s
Function 1 took: 47 secs, 456 ms, 65 ╬╝s, and 4 hnsecs
Function 2 took: 26 secs, 583 ms, 880 ╬╝s, and 1 hnsec

setting LDC with any optimization flags completely removes empty 
call and for loop.


Re: Why is for() less efficient than foreach?

2017-02-10 Thread evilrat via Digitalmars-d-learn

On Friday, 10 February 2017 at 12:39:50 UTC, Bastiaan Veelo wrote:
Depending on the machine this is run on, for() performs a 
factor 3-8 slower than foreach(). Can someone explain this to 
me? Or, taking for() as the norm, how can foreach() be so 
blazingly fast?

Thanks!


On my machine (AMD FX-8350) actually almost no difference

DMD 2.073
dmd -run loops.d -release
Function 0 took: 16 ╬╝s and 5 hnsecs
Function 1 took: 57 secs, 424 ms, and 555 ╬╝s
Function 2 took: 53 secs, 494 ms, 709 ╬╝s, and 8 hnsecs


LDC 1.1.0-beta6
ldc2 -run loops.d  -release -o3
Using Visual C++: C:\Program Files (x86)\Microsoft Visual Studio 
14.0\VC

Function 0 took: 25 ╬╝s and 5 hnsecs
Function 1 took: 53 secs, 253 ╬╝s, and 8 hnsecs
Function 2 took: 56 secs, 76 ms, 656 ╬╝s, and 4 hnsecs


Re: Why is for() less efficient than foreach?

2017-02-10 Thread Stefan Koch via Digitalmars-d-learn

On Friday, 10 February 2017 at 12:39:50 UTC, Bastiaan Veelo wrote:

Benchmarking for() against foreach():

/
enum size_t maxarray = 500_000;

double[maxarray] a, b, c, d;

void main()
{
import std.stdio;
import std.datetime;

import std.random;
for (int n = 0; n < maxarray; n++)
{
a[n] = uniform01;
b[n] = uniform01;
c[n] = uniform01 + 0.1;
}

void overhead() {}

void foreach_loop()
{
foreach(n, elem; d[])
elem = a[n] * b[n] / c[n];
}

void for_loop()
{
for (int n = 0; n < maxarray; n++)
d[n] = a[n] * b[n] / c[n];
}

auto r = benchmark!(overhead,
foreach_loop,
for_loop)(10_000);

import std.conv : to;
foreach (i, d; r)
writeln("Function ", i, " took: ", d.to!Duration);
}
/


Depending on the machine this is run on, for() performs a 
factor 3-8 slower than foreach(). Can someone explain this to 
me? Or, taking for() as the norm, how can foreach() be so 
blazingly fast?

Thanks!


The foreach loop behaves differently.
It does not modify d.

If you want it to modify the array you have to use a ref elem.
If you do you will see that foreach is a little slower.


Re: Why is for() less efficient than foreach?

2017-02-10 Thread biozic via Digitalmars-d-learn

On Friday, 10 February 2017 at 12:39:50 UTC, Bastiaan Veelo wrote:

void foreach_loop()
{
foreach(n, elem; d[])
elem = a[n] * b[n] / c[n];
}


It's fast because the result of the operation (elem) is discarded 
on each iteration, so it is probably optimized away.

Try:
```
void foreach_loop()
{
foreach(n, ref elem; d[])
elem = a[n] * b[n] / c[n];
}
```

You can also do:
```
d = a[] * b[] / c[];
```
with no loop statement at all.



Why is for() less efficient than foreach?

2017-02-10 Thread Bastiaan Veelo via Digitalmars-d-learn

Benchmarking for() against foreach():

/
enum size_t maxarray = 500_000;

double[maxarray] a, b, c, d;

void main()
{
import std.stdio;
import std.datetime;

import std.random;
for (int n = 0; n < maxarray; n++)
{
a[n] = uniform01;
b[n] = uniform01;
c[n] = uniform01 + 0.1;
}

void overhead() {}

void foreach_loop()
{
foreach(n, elem; d[])
elem = a[n] * b[n] / c[n];
}

void for_loop()
{
for (int n = 0; n < maxarray; n++)
d[n] = a[n] * b[n] / c[n];
}

auto r = benchmark!(overhead,
foreach_loop,
for_loop)(10_000);

import std.conv : to;
foreach (i, d; r)
writeln("Function ", i, " took: ", d.to!Duration);
}
/


Depending on the machine this is run on, for() performs a factor 
3-8 slower than foreach(). Can someone explain this to me? Or, 
taking for() as the norm, how can foreach() be so blazingly fast?

Thanks!