C++版tarai

Pythonが速度改善に本気出すと聞いたので恒例のたらい回しベンチをとってみたら、RubyがYJITですごく速くなっていて驚いた話 - Smalltalkのtは小文字です

 本題からは外れますが、この記事の最初の版ではRust版がC版より速かったので、追試のために当方でC++で書いたコードを載せておきます。

 なお改訂後のCコードではclock()が使われてますが、これだとcpu timeだけの積算になるので実時間と比べてちょっと早めに出るはずで、他言語と公平ではないようです。以下のコードでは実時間で測っています。

#include <chrono>
#include <iostream>

int tarai(int x, int y, int z){
    return x > y ? tarai( tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y) ) : y;
}

int main(void){
    const auto start_time = std::chrono::steady_clock::now();
    const auto result = tarai(14, 7, 0);
    const auto end_time = std::chrono::steady_clock::now();

    std::cout << result << "\n";
    const auto d = std::chrono::duration_cast<std::chrono::nanoseconds>(end_time - start_time);
    std::cout << d.count() / 1000000000.0 << std::endl;

    return 0;
}

 WSL上での実行結果。

nakag@NAKA-XA7C:~/src/tarai$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

nakag@NAKA-XA7C:~/src/tarai$ clang++ --version
clang version 10.0.0-4ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
nakag@NAKA-XA7C:~/src/tarai$ g++ tarai.cc -O3 -o tarai_gpp
nakag@NAKA-XA7C:~/src/tarai$ clang++ tarai.cc -O3 -o tarai_cpp
nakag@NAKA-XA7C:~/src/tarai$ ./tarai_gpp
14
0.62791
nakag@NAKA-XA7C:~/src/tarai$ ./tarai_cpp
14
0.625775
nakag@NAKA-XA7C:~/src/tarai$ ./tarai_gpp
14
0.647384
nakag@NAKA-XA7C:~/src/tarai$ ./tarai_cpp
14
0.632788

 std::chrono::steady_clockの精度は数百ナノ秒とのことで、下の桁はあまり当てになりませんが、表示だけRust版に合わせました(といっても微妙に合ってないし、一々nanosecondsにキャストして割ったりする必要はなかった気もする)。

 比較のためそのRust版も実行。

nakag@NAKA-XA7C:~/src/tarai$ rustc --version
rustc 1.59.0
nakag@NAKA-XA7C:~/src/tarai$ rustc -C opt-level=3 -C debug_assertions=no tarai.rs -o tarai_rs
nakag@NAKA-XA7C:~/src/tarai$ ./tarai_rs
14
0.6260091
nakag@NAKA-XA7C:~/src/tarai$ ./tarai_rs
14
0.6391106
nakag@NAKA-XA7C:~/src/tarai$ ls -l
total 10488
-rw-r--r-- 1 nakag nakag      541 Sep  9 02:23 tarai.cc
-rw-r--r-- 1 nakag nakag      462 Sep  9 02:13 tarai.rs
-rwxr-xr-x 1 nakag nakag    17368 Sep  9 20:59 tarai_cpp
-rwxr-xr-x 1 nakag nakag    17368 Sep  9 20:59 tarai_gpp
-rwxr-xr-x 1 nakag nakag 10688896 Sep  9 21:01 tarai_rs

 ファイルサイズの違いがすごい。

 しかし過去のエントリ見たら昔から同じようなことやってるのね……自分……