Performance of loops

Baz via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 24 06:27:15 PDT 2015


On Friday, 24 April 2015 at 11:00:23 UTC, Chris wrote:
> I tested the performance of three types of loops (see code 
> below). It turns out that the fastest loop is the "plainLoop". 
> Unless my examples are completely screwed up, the difference 
> between "plainLoop" and the other two loops is gigantic (e.g.):
>
> 9 ms, 149 μs, and 4 hnsecs  // foreach (const ref w)
> 9 ms, 77 μs, and 8 hnsecs   // foreach (ref w)
> 1 ms, 183 μs, and 6 hnsecs  // foreach (w)
>
> with -release -inline -O -boundscheck=off
>
> 8 ms, 492 μs, and 3 hnsecs
> 8 ms, 287 μs, and 1 hnsec
> 341 μs and 2 hnsecs
>
> [compiler dmd v2.067.0, Linux Ubuntu, 64bit]
>
>
> import std.datetime : benchmark, Duration;
> import std.string : format;
> import std.conv : to;
> import std.stdio : writeln;
>
> enum {
>   string[] words = ["Hello", "world", "Ola", "mundo"],
> }
>
> void main() {
>   auto result = benchmark!(constLoop, refLoop, 
> plainLoop)(100_000);
>   writeln(to!Duration(result[0]));
>   writeln(to!Duration(result[1]));
>   writeln(to!Duration(result[2]));
>
> }
>
> void constLoop() {
>   size_t cnt;
>   foreach (const ref w; words)
>     cnt += w.length;
> }
>
> void refLoop() {
>   size_t cnt;
>   foreach (ref w; words)
>     cnt += w.length;
> }
>
> void plainLoop() {
>   size_t cnt;
>   foreach (w; words)
>     cnt += w.length;
> }

You should temper the results because these kinds of tests are 
known not to represent well the reality. In a real program, the 
loops performances are affected by the instruction cache, the 
memory cache, the complexity of the operations inside the loop 
(nested TEST/CMP). Actually this kind of test represents an 
ideal, unreallisctic situation, that will never happend in a 
"IRL" program.


More information about the Digitalmars-d mailing list