[misc] プログラミング言語の実行速度比較(2023/4)とJulia言語の計算結果を比較した
背景
このような記事を拝見しました。
Julia版の簡単な実装を動かしてみました。動かした環境は以下の通りです。
julia> versioninfo()
Julia Version 1.8.5
Commit 17cfb8e65ea (2023-01-08 06:45 UTC)
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 16 × AMD Ryzen 7 PRO 4750G with Radeon Graphics
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-13.0.1 (ORCJIT, znver2)
Threads: 1 on 16 virtual cores
やったこと
これだけです。
function main(upperlimit)
prime_numbers = Int[]
function is_prime_number(n)
for pn in prime_numbers
(pn * pn > n) && break
if n % pn == 0
return false
end
end
return true
end
for n in 2:upperlimit + 1
if is_prime_number(n)
push!(prime_numbers, n)
end
end
println("Count: $(length(prime_numbers))")
end
main(100000000)
timeで測定した結果です。
> time ~/bin/julia-1.8.5/bin/julia pn.jl
Count: 5761455
~/bin/julia-1.8.5/bin/julia pn.jl 31.04s user 1.05s system 103% cpu 30.975 total
メモリ使用量測定するためには、例えば @time
のマクロを使って実行すると見れます。
REPLで読み込むためにmain(100000000)
を消しておいてから、次のように打ち込みます。
julia> julia> using Revise; includet("pn.jl"); @time main(100000000)
Count: 5761455
30.952220 seconds (5.26 k allocations: 73.961 MiB, 0.08% gc time, 0.30% compilation time)
73.961 MiBらしいです。DataStructures.jl
の Deque{Int}()
に置き換えてみるとどうなるでしょうか。
julia> using Revise; includet("pn_ds.jl"); @time main_deque(100000000)
Count: 5761455
30.929192 seconds (11.27 k allocations: 44.992 MiB, 0.24% gc time)
少し改善しました。Dequeってどういうものを考えているのでしょうか?DataStructures.jl
によれば
A Deque (short for Double-ended Queue) is an abstract data type that generalizes a Queue for which elements can be added to or removed from both the front (head) and the back (tail) in O(1) time complexity.
The type Deque implements the Double-ended Queue as a list of fixed-size blocks using an unrolled linked list.
とのことでした。
追記 (C++)
コードを借りてきて。こちらです: https://github.com/kz0817/mylab/tree/prime-number-2023/prime-number/c%2B%2B
C++をコンパイルして動かしました。C++分からなくて適当ですいません。
# コンパイル
g++ -std=c++17 -O3 pn-c++.cc
# 実行
time ./a.out -u 10000000
結果です。
# -O3
Upper limit: 100000000
Count: 5761455
./a.out -u 100000000 30.72s user 0.01s system 99% cpu 30.731 total
上の-O3
を-O0
にした場合の結果です。何か怪しいですね。
# -O0
Upper limit: 100000000
Count: 5761455
./a.out -u 100000000 38.69s user 0.02s system 99% cpu 38.711 total
追記終わりです。
Discussion