経緯
仲間内で「コアを使い切るプログラムをいっぱい書いてみよう」という話題が出たためノリで書いてみました。せっかくなので 時間がないため 仕事でよく使っている Ruby
Elixir
Go
の3言語で試してみました。
マサカリ防止対応
- 実用性、最適化などは一切考えておらず ただコアを使い切ることにフォーカス。
- そのため処理速度やsyntaxは無視
- 標準ライブラリしか使わない
- 30分で書けるレベルのものという制約で殴り書きをする
実行環境
**OSが古いというツッコミはダメです**- ruby
- 2.6.4
- Elixir
- 1.9.4
- golang
- 1.12.7
テストシナリオ
- 1〜100000(1+2+3+4...)の合計求める計算を1000回実行する
-
1
の処理を並列で実行する - htop でCPU使用状況を見る
1.Ruby
比較的マルチコア環境で性能を引き出しにくいと言われがちなRuby ですがプロセスフォークをすれば簡単に使いきれます。
しかしながら この実装ではprocess をfork しすぎてOS の挙動が怪しくなる ため実際にマルチコア環境で処理を動かすためには頑張ってプログラムを書く必要があるでしょう。
(いいexample があればおしえてください)
gist:
https://gist.github.com/ohta-rh/8fffb2ae778e4135d4f195fb7baf42d7
result:
OSが固まるので htopのキャプチャーをとる作業が一番苦労しました
2.Elixir
マルチコア環境下に強いと呼ばれているElixir / Erlangですが、はたしてどうなのでしょうか。
GenServer を使うのが普通かなと思いますがコアを使い切ることしか考えてません。はい、手抜きです
gist:
https://gist.github.com/ohta-rh/254b84ddf666947e92405abeeefc2dc1
result:
さすがに簡単に使い切りますね。実装は一番簡単でした。
3.Golang
こちらもマルチコア環境下につよいというGolangです。間抜けな顔が素敵です。さてさてどうなのでしょうか。
gist:
https://gist.github.com/ohta-rh/0982ee468b3ba00a9a0be98b24c4b4a7
今までのシナリオの実装ではgoが早すぎて CPUを使いきれません。
ということで急遽処理オーダー数を増やして使い切ることができました。go早い!
総論
最適化など全く考えずに書いていましたが「言語仕様レベルでマルチコアを意識しているか、そうでないか」で書きやすさはもちろん、動作の安定性にも随分と差がでました。
本格的に並列処理を書こうとしたら サンプルのクソコードでは対応できないためもっと複雑な処理が必要になってくるでしょう。
次はもう少し実用的な処理を書いてみようと思いました。
おまけ
90%くらいの仕事において(独断と偏見)パフォーマンスは、特に意識しなくてもフレームワークや、ミドルウェアがだいたいよろしくやってくれます。そして問題になるのはI/Oが絡む部分であり コアを使い切って最適化しよう!みたいな状況は少ないかなとおもいます。
いざとなれば札束で殴ればいいしね!
結局のところ**「好きな言語でとりあえず書いて、必要になったら得意とする言語で書き直せばいい」**と思ってます。だって、嫌いな言語を書いててもつまらないでしょうw
Let's enjoy programing!!!!!