using BenchmarkTools
# sum(rand(N)) はメモリを大量消費
srand(2018)
a(N) = sum(rand(N))
@show a(10^8)
sleep(0.1)
@benchmark a(10^8)
a(10 ^ 8) = 4.999878401818617e7
BenchmarkTools.Trial: memory estimate: 762.94 MiB allocs estimate: 2 -------------- minimum time: 323.326 ms (2.13% GC) median time: 373.239 ms (14.14% GC) mean time: 378.576 ms (15.26% GC) maximum time: 431.282 ms (26.81% GC) -------------- samples: 14 evals/sample: 1
# sum(rand() for i in 1:N) はメモリは節約するが sum(rand(N)) より遅い.
srand(2018)
b(N) = sum(rand() for i in 1:N)
@show b(10^8)
sleep(0.1)
@benchmark b(10^8)
b(10 ^ 8) = 4.999878401820758e7
BenchmarkTools.Trial: memory estimate: 64 bytes allocs estimate: 3 -------------- minimum time: 635.041 ms (0.00% GC) median time: 648.737 ms (0.00% GC) mean time: 652.902 ms (0.00% GC) maximum time: 684.673 ms (0.00% GC) -------------- samples: 8 evals/sample: 1
# forループはメモリも消費ぜず速い
srand(2018)
c(N) = (s = 0.0; for i in 1:N s += rand() end; s)
@show c(10^8)
sleep(0.1)
@benchmark c(10^8)
c(10 ^ 8) = 4.999878401820758e7
BenchmarkTools.Trial: memory estimate: 0 bytes allocs estimate: 0 -------------- minimum time: 176.926 ms (0.00% GC) median time: 178.316 ms (0.00% GC) mean time: 178.863 ms (0.00% GC) maximum time: 181.458 ms (0.00% GC) -------------- samples: 28 evals/sample: 1
# forループをマクロにすると @sum(0.0, _, 1:N, rand()) と短く書ける
macro sum(init, i, iter, f)
quote
begin
s = $(esc(init))
for $(esc(i)) in $(esc(iter))
s += $(esc(f))
end
s
end
end
end
srand(2018)
c_macro(N) = @sum(0.0, _, 1:N, rand())
@show c_macro(10^8)
sleep(0.1)
@benchmark c_macro(10^8)
c_macro(10 ^ 8) = 4.999878401820758e7
BenchmarkTools.Trial: memory estimate: 0 bytes allocs estimate: 0 -------------- minimum time: 177.346 ms (0.00% GC) median time: 179.926 ms (0.00% GC) mean time: 181.864 ms (0.00% GC) maximum time: 203.309 ms (0.00% GC) -------------- samples: 28 evals/sample: 1
@show @sum(0, i, 1:10, @sum(0, j, 1:10, i*j))
@show sum(sum(i*j for j in 1:10) for i in 1:10)
@macroexpand @sum(0, i, 1:10, @sum(0, j, 1:10, i*j))
@sum(0, i, 1:10, @sum(0, j, 1:10, i * j)) = 3025 sum((sum((i * j for j = 1:10)) for i = 1:10)) = 3025
quote # In[5], line 5: begin # In[5], line 6: #20#s = 0 # In[5], line 7: for i = 1:10 # In[5], line 8: #20#s += begin # In[5], line 5: begin # In[5], line 6: #21#s = 0 # In[5], line 7: for j = 1:10 # In[5], line 8: #21#s += i * j end # In[5], line 10: #21#s end end end # In[5], line 10: #20#s end end
# 並列処理するとさらに速くなる
srand(2018)
d(N) = @parallel (+) for i in 1:N rand() end
@show d(10^8)
sleep(0.1)
@benchmark d(10^8)
d(10 ^ 8) = 5.000092105716484e7
BenchmarkTools.Trial: memory estimate: 88.80 KiB allocs estimate: 954 -------------- minimum time: 59.624 ms (0.00% GC) median time: 61.321 ms (0.00% GC) mean time: 62.525 ms (0.00% GC) maximum time: 82.463 ms (0.00% GC) -------------- samples: 80 evals/sample: 1
# 並列処理で和を計算するマクロ
macro sum_parallel(i, iter, f)
quote
@parallel (+) for $(esc(i)) in $(esc(iter)); $(esc(f)); end
end
end
srand(2018)
d_macro(N) = @sum_parallel(_, 1:N, rand())
@show d_macro(10^8)
sleep(0.1)
@benchmark d_macro(10^8)
d_macro(10 ^ 8) = 5.0003829685399316e7
BenchmarkTools.Trial: memory estimate: 88.45 KiB allocs estimate: 947 -------------- minimum time: 58.549 ms (0.00% GC) median time: 61.295 ms (0.00% GC) mean time: 61.791 ms (0.00% GC) maximum time: 69.428 ms (0.00% GC) -------------- samples: 82 evals/sample: 1
@show @sum_parallel(i, 1:10, @sum_parallel(j, 1:10, i*j))
@show sum(sum(i*j for j in 1:10) for i in 1:10);
@sum_parallel(i, 1:10, @sum_parallel(j, 1:10, i * j)) = 3025 sum((sum((i * j for j = 1:10)) for i = 1:10)) = 3025