On Saturday, 23 April 2016 at 15:11:13 UTC, Suliman wrote:
Working:
void main()
{
 auto r = benchmark!(foo)(1);
}

[...]

Do not working:
void main()
{
 auto r = benchmark!(foo())(1);
}

[...]

Error: expression foo() is void and has no value

Do not working:
void main()
{
 auto r = benchmark!(4)(1);
}

[...]


Why I second two variants do not compile?

The first template argument to std.datetime.benchmark is the function you want to benchmark, which you have specified correctly in your first example. benchmark!(function)(times).

In the second one you're first calling foo() to pass *the value it returns* as template argument to benchmark. Since it returns void, you're essentially calling benchmark!(void)(1), not what you want. If foo() had returned a function pointer it would likely have worked.

In the third example you're providing an integer as the function to benchmark, and foo is never mentioned.

The documentation explicitly says that the function must not take any parameters. I'm not sure why, but that's how it was designed. That said, you can easily work around it by making an intermediate function/delegate that passes the arguments you want, or a lambda. Unsure whether this incurs any performance hits, if it doesn't inline.

You can make a wrapper like in http://dpaste.dzfl.pl/c856b9be53e9 but the extra argument has to be known during compilation.

Reply via email to