ayumin.log

読みにくかったら脳内sedで整形してね

ひたすら色んな言語のHello Worldをstraceしてみた話

サークルでHello Worldしまくってみた

サークルの人数は増えたものの、あまり会話が盛り上がらないという悲しい問題があるので、色々会話ネタ探しをしている中でやってみた。

1時間ぐらいわいわいやれる(少なくとも自分は)のでネタ的には面白かった。

やることはひたすらhello worldコードをもらって (もしくは書いて) strace -o していくだけ。

言語による行数の違い

簡易的な目安で厳密なものでは全くないが、strace -o の行数はある程度速度と相関があるので、この言語はどうなんだろうね、みたいな話ができた。

やってみたのは行数の少ない順に C, Rust, Go, JavaScript, Dart, Python, PHP

実行速度的にも大体そんな感じかなーという予想通りの結果となった。予想外だったのはPHP。思ったより行数が多く、Python以上という結果に。

出力のバッファリングについて

言語を色々使ったことがある身として、手軽に言語ごとの差を見せる例として真っ先に思いついたのがこれ。

ちょうどhelloworldを出力するコードが揃っていたので、これがwriteシステムコールによるものであるということと、言語によっては自動的にバッファリングが行われない場合もあるよ、という例を見せるために、helloworldを107回ほどループで出力するコードを書いて、writeシステムコールが何回呼ばれているか調べてみた。

この回数にしたのはあまり理由がないが、ちょうど Goの実行時間 < Pythonの実行時間 になるぐらいだったので分かりやすかった。ちなみに自分の環境だとGoが2.45s, Pythonが2.25sぐらい。Goは事前にコンパイル済み。

見たところPythonだと1000回、Goだと70000回ぐらいwriteシステムコールが呼ばれている結果に。Goもある程度は最適化がかかるっぽい?のか、107回呼び出しているところは見られなかった。

これだけwriteシステムコールは遅いんだよ、というところを見せつつ、これを解決するにはバッファリングが必要だよね、という感じでbufioを使いGoのコードを改善すると、2.45s が 0.48s と大幅改善することが示せた。

やってみた感想

実行時間がぱっと出てくるのでやっていて楽しいし、見た目上も分かりやすいのでおすすめ。

特にHUITにはPython使用者が多い一方、Go使用者は少なめなので、常に事前コンパイル型で低層を触りやすい言語が速いとは限らないという例を示せて収穫があったと思う。

自分も色々勉強になった。