Clean up code and add mixed test
This commit is contained in:
parent
7b9a338b36
commit
d5c05749fc
92
source/app.d
92
source/app.d
|
@ -5,17 +5,19 @@ import std.datetime : Duration;
|
||||||
|
|
||||||
import std.meta : AliasSeq;
|
import std.meta : AliasSeq;
|
||||||
|
|
||||||
alias tests = AliasSeq!(testInsert, testDelete, testConcat);
|
alias tests = AliasSeq!(testInsert, testDelete, testConcat, testMixed);
|
||||||
alias setupFuns = AliasSeq!(noSetup, makeAndInsert, makeAndInsert);
|
alias setupFuns = AliasSeq!(noSetup, makeAndInsert, makeAndInsert, noSetup);
|
||||||
|
enum testNames = ["100 inserts", "100 deletes", "Concat", "Mixed"];
|
||||||
|
|
||||||
alias containers = AliasSeq!(int[], StdArray!int, rcarray!int, EMSIArray!int, StdxArray!int);
|
alias containers = AliasSeq!(int[], StdArray!int, rcarray!int, EMSIArray!int, StdxArray!int);
|
||||||
|
enum containerNames = ["[]", "Phobos Array", "rcarray", "EMSI Array", "stdx array"];
|
||||||
|
|
||||||
enum times = 100000;
|
enum times = 100000;
|
||||||
|
|
||||||
void testInsert(Container, size_t size = 100)()
|
void testInsert(Container, size_t size = 100)()
|
||||||
{
|
{
|
||||||
auto container = make!Container();
|
auto container = make!Container();
|
||||||
|
|
||||||
//debug stderr.writeln("Testing inserts on ", typeof(container).stringof);
|
|
||||||
|
|
||||||
static foreach (i; 0 .. size)
|
static foreach (i; 0 .. size)
|
||||||
{
|
{
|
||||||
container ~= 42;
|
container ~= 42;
|
||||||
|
@ -26,8 +28,6 @@ void testInsert(Container, size_t size = 100)()
|
||||||
|
|
||||||
void testDelete(Container, size_t size = 100)(ref Container container)
|
void testDelete(Container, size_t size = 100)(ref Container container)
|
||||||
{
|
{
|
||||||
//debug stderr.writeln("Testing inserts+deletes on ", typeof(container).stringof);
|
|
||||||
|
|
||||||
foreach (i; 0 .. size)
|
foreach (i; 0 .. size)
|
||||||
{
|
{
|
||||||
static if (is(Container : StdxArray!U, U))
|
static if (is(Container : StdxArray!U, U))
|
||||||
|
@ -54,73 +54,111 @@ void testConcat(Container, size_t size = 100)(ref Container container)
|
||||||
assert(c.length == size * 2);
|
assert(c.length == size * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testMixed(Container)()
|
||||||
|
{
|
||||||
|
auto container = make!Container();
|
||||||
|
|
||||||
|
static foreach (i; 0 .. 50)
|
||||||
|
{
|
||||||
|
container ~= 42;
|
||||||
|
}
|
||||||
|
|
||||||
|
static foreach (i; 0 .. 25)
|
||||||
|
{{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
static foreach (i; 0 .. 25)
|
||||||
|
{{
|
||||||
|
container ~= 42;
|
||||||
|
container ~= 42;
|
||||||
|
|
||||||
|
static if (is(Container : StdxArray!U, U))
|
||||||
|
{
|
||||||
|
container.forceLength(container.length - 2);
|
||||||
|
}
|
||||||
|
else static if (is(Container : EMSIArray!U, U))
|
||||||
|
{
|
||||||
|
container.removeBack();
|
||||||
|
container.removeBack();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
container.length = container.length - 2;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
assert(container.length == 25 && container[24 - 1] == 42);
|
||||||
|
}
|
||||||
|
|
||||||
auto testContainers(Containers...)()
|
auto testContainers(Containers...)()
|
||||||
{
|
{
|
||||||
import std.datetime.stopwatch : benchmark;
|
import std.datetime.stopwatch : benchmark;
|
||||||
import std.meta : staticMap;
|
import std.meta : staticMap;
|
||||||
import std.array : array;
|
import std.array : array;
|
||||||
|
|
||||||
Duration[][string] results;
|
Duration[][] results;
|
||||||
|
|
||||||
static foreach (i, test; tests)
|
static foreach (i, test; tests)
|
||||||
{{
|
{{
|
||||||
alias ts = staticMap!(test, Containers);
|
alias ts = staticMap!(test, Containers);
|
||||||
alias ss = staticMap!(setupFuns[i], Containers);
|
alias ss = staticMap!(setupFuns[i], Containers);
|
||||||
results[test.stringof] = benchmarkWithSetup!(Transpose!(2, ts, ss))(times).array;
|
results ~= benchmarkWithSetup!(Transpose!(2, ts, ss))(times).array;
|
||||||
}}
|
}}
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
void printResults(Containers...)(Duration[][string] results)
|
void printResults(Containers...)(Duration[][] results)
|
||||||
{
|
{
|
||||||
static foreach (test; tests)
|
static foreach (i, test; tests)
|
||||||
{
|
{
|
||||||
import std.stdio : writeln;
|
import std.stdio : writeln;
|
||||||
writeln(test.stringof, ":");
|
writeln(test.stringof, ":");
|
||||||
|
|
||||||
static foreach (i, Container; Containers)
|
static foreach (j, Container; Containers)
|
||||||
{
|
{
|
||||||
writeln("\t", Container.stringof, ": ", results[test.stringof][i]);
|
writeln("\t", Container.stringof, ": ", results[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void plotResults(Containers...)(Duration[][string] results)
|
void plotResults(Containers...)(Duration[][] results)
|
||||||
{
|
{
|
||||||
import plt = matplotlibd.pyplot;
|
import plt = matplotlibd.pyplot;
|
||||||
|
|
||||||
auto i = 0;
|
foreach (i, test; tests)
|
||||||
foreach (test; tests)
|
|
||||||
{
|
{
|
||||||
auto testResults = results[test.stringof];
|
auto testResults = results[i];
|
||||||
|
|
||||||
import std.range : iota;
|
import std.range : iota;
|
||||||
import std.algorithm : map;
|
import std.algorithm : map;
|
||||||
import std.array : array;
|
import std.array : array;
|
||||||
import std.conv : to;
|
import std.conv : to;
|
||||||
|
|
||||||
auto title = test.stringof ~ " (" ~ times.to!string ~ "x)";
|
auto title = testNames[i] ~ " (" ~ times.to!string ~ " runs)";
|
||||||
auto x = iota(testResults.length);
|
auto x = iota(testResults.length);
|
||||||
auto height = testResults.map!(d => d.total!"msecs").array;
|
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.clf();
|
||||||
plt.bar(x, height);
|
plt.bar(x, height);
|
||||||
plt.xticks(x, names);
|
plt.xticks(x, containerNames);
|
||||||
plt.ylabel("Time (ms)");
|
plt.ylabel("Time (ms)");
|
||||||
plt.ylim(0, 3000);
|
plt.ylim(0, 3000);
|
||||||
plt.title(title);
|
plt.title(title);
|
||||||
plt.savefig("out/" ~ i.to!string ~ ".png", ["dpi": 500]);
|
plt.savefig("out/" ~ i.to!string ~ ".png", ["dpi": 500]);
|
||||||
}
|
}
|
||||||
//plt.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
|
Loading…
Reference in New Issue