この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
mae3xx_tips:test_fib_benchmark:start [2014/09/17 19:49] admin [GCC] |
mae3xx_tips:test_fib_benchmark:start [2019/05/15 14:36] admin |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
+ | ====== フィボナッチ数列でベンチマーク ====== | ||
+ | MA-E3xxには、スクリプト言語として | ||
+ | * Python3.4 | ||
+ | * Python2.7 (v2.2.0 以降追加) | ||
+ | * Perl5.8 | ||
+ | * LuaJIT-2.0.2 | ||
+ | * nodejs-0.10 (v2.2.0 以降削除予定) | ||
+ | を導入してあります。 | ||
+ | |||
+ | せっかくなので、[[http://d.hatena.ne.jp/satosystems/20121228/1356655565|satosystemsの日記 - フィボナッチで各種言語をベンチマーク]] で行っている\\ | ||
+ | ベンチマークテストを、MA-E3xx上で各種言語でテストしてみました。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | |||
+ | ===== テスト ===== | ||
+ | |||
+ | ==== Python ==== | ||
+ | |||
+ | コードは下記になります。 | ||
+ | |||
+ | <sxh python toolbar:false; title:fib.py> | ||
+ | def fib(n): | ||
+ | if n < 2: return n | ||
+ | return fib(n - 2) + fib(n - 1) | ||
+ | |||
+ | print(fib(38)) | ||
+ | </sxh> | ||
+ | |||
+ | 実行結果はこのようになりました。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time python3 fib.py | ||
+ | 39088169 | ||
+ | |||
+ | real 2m35.226s | ||
+ | user 2m33.116s | ||
+ | sys 0m0.072s | ||
+ | </code> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== Perl ==== | ||
+ | |||
+ | <sxh perl toolbar:false; title:fib.pl> | ||
+ | sub fib($) { | ||
+ | return $_[0] if ($_[0] < 2); | ||
+ | return fib($_[0] - 2) + fib($_[0] - 1); | ||
+ | } | ||
+ | |||
+ | print fib(38), "\n"; | ||
+ | </sxh> | ||
+ | |||
+ | 実行結果はこのようになりました。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time perl fib.pl | ||
+ | 39088169 | ||
+ | |||
+ | real 4m5.286s | ||
+ | user 4m1.284s | ||
+ | sys 0m0.572s | ||
+ | </code> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== LuaJIT ==== | ||
+ | |||
+ | <file lua fib.lua> | ||
+ | function fib(n) | ||
+ | if n < 2 then return n end | ||
+ | return fib(n - 2) + fib(n - 1) | ||
+ | end | ||
+ | |||
+ | print(fib(38)) | ||
+ | </file> | ||
+ | |||
+ | 実行結果はこのようになりました。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time luajit fib.lua | ||
+ | 39088169 | ||
+ | |||
+ | real 0m9.108s | ||
+ | user 0m8.592s | ||
+ | sys 0m0.396s | ||
+ | </code> | ||
+ | |||
+ | JITコンパイラによりネイティブコードに変換されるだけあって、桁違いに速いです。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== node.js ==== | ||
+ | |||
+ | <sxh javascript toolbar:false; title:fib.js> | ||
+ | function fib(n) { | ||
+ | if (n < 2) return n; | ||
+ | return fib(n - 2) + fib(n - 1); | ||
+ | } | ||
+ | |||
+ | console.log(fib(38)); | ||
+ | </sxh> | ||
+ | |||
+ | 実行結果はこのようになりました。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time nodejs fib.js | ||
+ | 39088169 | ||
+ | |||
+ | real 0m7.108s | ||
+ | user 0m6.884s | ||
+ | sys 0m0.084s | ||
+ | </code> | ||
+ | |||
+ | さすがは V8 、LuaJITよりも高速でした。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== Ruby2.0 ==== | ||
+ | |||
+ | Ruby2.0 を追加で導入し、テストしてみました。 | ||
+ | |||
+ | <sxh ruby toolbar:false; title:fib.rb> | ||
+ | def fib(n) | ||
+ | return n if (n < 2) | ||
+ | return fib(n - 2) + fib(n - 1) | ||
+ | end | ||
+ | |||
+ | puts fib(38) | ||
+ | </sxh> | ||
+ | |||
+ | 実行結果はこのようになりました。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time ruby2.0 fib.rb | ||
+ | 39088169 | ||
+ | |||
+ | real 0m58.870s | ||
+ | user 0m56.992s | ||
+ | sys 0m0.952s | ||
+ | </code> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== Ruby1.9 ==== | ||
+ | |||
+ | Ruby2.0 と同じコードを、Ruby1.9 で実行してみます。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time ruby1.9.1 fib.rb | ||
+ | 39088169 | ||
+ | |||
+ | real 1m20.224s | ||
+ | user 1m18.072s | ||
+ | sys 0m0.944s | ||
+ | </code> | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== PHP5 ==== | ||
+ | |||
+ | <sxh php toolbar:false; title:fib.php> | ||
+ | <?php | ||
+ | function fib($n) { | ||
+ | if ($n < 2) return $n; | ||
+ | return fib($n - 2) + fib($n - 1); | ||
+ | } | ||
+ | |||
+ | print fib(38); | ||
+ | print "\n"; | ||
+ | ?> | ||
+ | </sxh> | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time php5-cgi fib.php | ||
+ | X-Powered-By: PHP/5.5.9-1ubuntu4.3 | ||
+ | Content-type: text/html | ||
+ | |||
+ | 39088169 | ||
+ | |||
+ | real 2m39.913s | ||
+ | user 2m38.097s | ||
+ | sys 0m0.067s | ||
+ | </code> | ||
+ | |||
+ | Python3 と同程度、こんなところでしょうか。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== Java SE Embedded 8 ==== | ||
+ | |||
+ | コンパイルする言語なので、速いと思いますが一応。 | ||
+ | |||
+ | <sxh java toolbar:false; title:fib.java> | ||
+ | public class fib { | ||
+ | static int fib(int n) { | ||
+ | if (n < 2) return n; | ||
+ | return fib(n - 2) + fib(n - 1); | ||
+ | } | ||
+ | |||
+ | public static void main(String[] args) { | ||
+ | System.out.println(fib(38)); | ||
+ | } | ||
+ | } | ||
+ | </sxh> | ||
+ | |||
+ | 実行結果は下記のようになりました。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:/tmp$ time java fib | ||
+ | 39088169 | ||
+ | |||
+ | real 0m5.021s | ||
+ | user 0m2.024s | ||
+ | sys 0m2.796s | ||
+ | </code> | ||
+ | |||
+ | さすがは HotSpot によるJITコンパイルが効くだけあって、スクリプト言語よりも高速です。\\ | ||
+ | VM の起動に時間がかかるせいか、"user" は短いですが "sys" で時間がかかっています。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== Java (OpenJDK 11) ==== | ||
+ | |||
+ | OpenJDK 11 でも試してみます。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time java fib | ||
+ | 39088169 | ||
+ | |||
+ | real 0m7.083s | ||
+ | user 0m2.139s | ||
+ | sys 0m4.703s | ||
+ | user1@plum:~$ time java fib | ||
+ | 39088169 | ||
+ | |||
+ | real 0m2.284s | ||
+ | user 0m2.157s | ||
+ | sys 0m0.114s | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ java -version | ||
+ | openjdk version "11.0.3" 2019-04-16 | ||
+ | OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1) | ||
+ | OpenJDK Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode) | ||
+ | </code> | ||
+ | |||
+ | 初回はキャッシュされてないので遅いですが、"user" の時間は Java SE embedded 8 とあまり遜色なさそうな感じです。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== GCC ==== | ||
+ | |||
+ | ネイティブコードにコンパイルする、C言語でも試してみます。 | ||
+ | |||
+ | <sxh c toolbar:false; title:fib.c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int fib(int n) { | ||
+ | if (n < 2) return n; | ||
+ | return fib(n - 2) + fib(n - 1); | ||
+ | } | ||
+ | |||
+ | int main(int argc, char *argv[]) { | ||
+ | printf("%d\n", fib(38)); | ||
+ | return 0; | ||
+ | } | ||
+ | </sxh> | ||
+ | |||
+ | 実行結果は下記のようになりました。 | ||
+ | |||
+ | <code> | ||
+ | user1@plum:/tmp$ time ./fib | ||
+ | 39088169 | ||
+ | |||
+ | real 0m1.376s | ||
+ | user 0m1.332s | ||
+ | sys 0m0.012s | ||
+ | </code> | ||
+ | |||
+ | スクリプト言語やVM系とは比較にならないほど高速でした。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ==== Nim ==== | ||
+ | |||
+ | いま注目の Nim では? | ||
+ | |||
+ | <file nim fib.nim> | ||
+ | proc fib(n: int): int = | ||
+ | if n < 2: | ||
+ | return n | ||
+ | else: | ||
+ | return fib(n - 1) + fib(n - 2) | ||
+ | |||
+ | echo(fib(38)) | ||
+ | </file> | ||
+ | |||
+ | <code> | ||
+ | user1@plum:~$ time ./fib | ||
+ | 39088169 | ||
+ | |||
+ | real 0m1.324s | ||
+ | user 0m1.313s | ||
+ | sys 0m0.004s | ||
+ | </code> | ||
+ | |||
+ | C よりも速いとは。 | ||
+ | |||
+ | |||
+ | {{:mae3xx_tips:test_fib_benchmark:a614d39a.gif|Java or Mocha?}} |