Last active
February 12, 2016 10:09
-
-
Save alphaKAI/74a3b93aeea65424167b to your computer and use it in GitHub Desktop.
Multi Thread Benchmark in D
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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