Skip to content

Instantly share code, notes, and snippets.

@alphaKAI
Last active February 12, 2016 10:09
Show Gist options
  • Select an option

  • Save alphaKAI/74a3b93aeea65424167b to your computer and use it in GitHub Desktop.

Select an option

Save alphaKAI/74a3b93aeea65424167b to your computer and use it in GitHub Desktop.
Multi Thread Benchmark in D
import std.parallelism,
std.algorithm,
std.datetime,
std.stdio,
std.range,
std.conv,
std.math;
enum times = 100;
bool sideEffectTask;
void singleThread() {
real[] cache;
writeln("BEGIN singleThread");
foreach(i; times.iota) {
foreach(j; times.iota) {
foreach(k; times.iota) {
if (sideEffectTask) {
cache ~= log(i + j + k + 1);
} else {
cast(void)(log(i + j + k + 1));
}
}
}
}
writeln("END singleThread");
}
void multiThread() {
real[] cache;
writeln("BEGIN multiThread");
foreach(i; times.iota.parallel) {
foreach(j; times.iota.parallel) {
foreach(k; times.iota.parallel) {
if (sideEffectTask) {
cache ~= log(i + j + k + 1);
} else {
cast(void)(log(i + j + k + 1));
}
}
}
}
writeln("END multiThread");
}
void main() {
writeln("---- NON SIDE EFFECT ----");
auto result1 = benchmark!(singleThread, multiThread)(1);
writeln("non-parallel: ", result1[0].length);
writeln("parallel: ", result1[1].length);
sideEffectTask = true;
writeln("---- SIDE EFFECT ----");
auto result2 = benchmark!(singleThread, multiThread)(1);
writeln("non-parallel: ", result2[0].length);
writeln("parallel: ", result2[1].length);
writeln("NON SIDE EFFECT / SIDE EFFECT");
writeln(" -> non-parallel / non-pararell :=> ", [result1[0], result2[0]].map!(x => x.length).reduce!"a/b");
writeln(" -> parallel / pararell :=> ", [result1[1], result2[1]].map!(x => x.length).reduce!"a/b");
writeln(" -> parallel / non-pararell :=> ", [result1[1], result2[0]].map!(x => x.length).reduce!"a/b");
writeln(" -> non-parallel / pararell :=> ", [result1[0], result2[1]].map!(x => x.length).reduce!"a/b");
}
/*
Example(My Environment is MacBook Pro Retina Mid 2014(i5 2.6GHz)):
---- NON SIDE EFFECT ----
BEGIN singleThread
END singleThread
BEGIN multiThread
END multiThread
non-parallel: 279135744
parallel: 149555610
---- SIDE EFFECT ----
BEGIN singleThread
END singleThread
BEGIN multiThread
END multiThread
non-parallel: 133004875
parallel: 116941918
NON SIDE EFFECT / SIDE EFFECT
-> non-parallel / non-pararell :=> 2
-> parallel / pararell :=> 1
-> parallel / non-pararell :=> 1
-> non-parallel / pararell :=> 2
rdmd bench 1.44s user 0.15s system 112% cpu 1.404 total
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment