On 24.02.2012 10:28, Caligo wrote:
----------------8<----------------8<----------------
import std.datetime : benchmark;
import std.stdio : writefln;
struct A(int r, int c){
public:
alias float[r * c] Data;
Data _data;
auto opBinary(A a){
float t;
foreach(i; 0..r*c)
foreach(j; 0..r*c)
t += this[i,j];
I guess that should be
foreach(i; 0..r)
foreach(j; 0..c)
t += this[i,j];
since you do row/col multiplication in opIndex?
return a;
}
pure float opIndex(size_t rr, size_t cc = 0) const{ return _data[cc
+ rr * c]; }
pure ref float opIndex(size_t rr, size_t cc = 0){ return _data[cc + rr * c];
}
}
void bench(alias fun)(string msg, uint n = 1_000_000){
auto b = benchmark!fun(n);
writefln(" %s %s ms", msg, b[0].to!("msecs", int));
}
unittest{
alias A!(3, 3) AA;
AA a;
bench!( {auto r = a * a;})("broken");
}
void main(){ }
---------------->8---------------->8----------------
Other parts of my code using bench() works fine, except in rare cases.
So I'm guessing this is a bug? I can't tell if it's in DMD or
std.datetime. Can anyone help?
I will bug report myself tomorrow if it turns out to be a bug for sure.
DMD 2.058, 64-bit GNU/Linux
--
Dmitry Olshansky