📝

[misc] プログラミング言語の実行速度比較(2023/4)とJulia言語の計算結果を比較した

2023/04/21に公開

背景

このような記事を拝見しました。

https://twitter.com/RyJyx/status/1642428985840910338

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.jlDeque{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