collections-benchmark/source/app.d

133 lines
3.2 KiB
D

import util;
import std.stdio : stderr, writeln;
import std.datetime : Duration;
import std.meta : AliasSeq;
alias tests = AliasSeq!(testInsert, testDelete, testConcat);
alias setupFuns = AliasSeq!(noSetup, makeAndInsert, makeAndInsert);
alias containers = AliasSeq!(int[], StdArray!int, rcarray!int, EMSIArray!int, StdxArray!int);
enum times = 100000;
void testInsert(Container, size_t size = 100)()
{
auto container = make!Container();
//debug stderr.writeln("Testing inserts on ", typeof(container).stringof);
static foreach (i; 0 .. size)
{
container ~= 42;
}
assert(container.length == size && container[size - 1] == 42);
}
void testDelete(Container, size_t size = 100)(ref Container container)
{
//debug stderr.writeln("Testing inserts+deletes on ", typeof(container).stringof);
foreach (i; 0 .. size)
{
static if (is(Container : StdxArray!U, U))
{
container.forceLength(container.length - 1);
}
else static if (is(Container : EMSIArray!U, U))
{
container.removeBack();
}
else
{
container.length = container.length - 1;
}
}
assert(container.length == 0);
}
void testConcat(Container, size_t size = 100)(ref Container container)
{
auto c = container ~ container;
assert(c.length == size * 2);
}
auto testContainers(Containers...)()
{
import std.datetime.stopwatch : benchmark;
import std.meta : staticMap;
import std.array : array;
Duration[][string] results;
static foreach (i, test; tests)
{{
alias ts = staticMap!(test, Containers);
alias ss = staticMap!(setupFuns[i], Containers);
results[test.stringof] = benchmarkWithSetup!(Transpose!(2, ts, ss))(times).array;
}}
return results;
}
void printResults(Containers...)(Duration[][string] results)
{
static foreach (test; tests)
{
import std.stdio : writeln;
writeln(test.stringof, ":");
static foreach (i, Container; Containers)
{
writeln("\t", Container.stringof, ": ", results[test.stringof][i]);
}
}
}
void plotResults(Containers...)(Duration[][string] results)
{
import plt = matplotlibd.pyplot;
auto i = 0;
foreach (test; tests)
{
auto testResults = results[test.stringof];
import std.range : iota;
import std.algorithm : map;
import std.array : array;
import std.conv : to;
auto title = test.stringof ~ " (" ~ times.to!string ~ "x)";
auto x = iota(testResults.length);
auto height = testResults.map!(d => d.total!"msecs").array;
string[] names;
foreach (Container; Containers)
{
names ~= Container.stringof;
}
i++;
//plt.subplot(results.length, 1, i);
plt.clf();
plt.bar(x, height);
plt.xticks(x, names);
plt.ylabel("Time (ms)");
plt.ylim(0, 3000);
plt.title(title);
plt.savefig("out/" ~ i.to!string ~ ".png", ["dpi": 500]);
}
//plt.show();
}
void main()
{
auto results = testContainers!containers;
results.printResults!containers;
results.plotResults!containers;
}