LoginSignup
83
33

More than 3 years have passed since last update.

いろんな言語でCPUのコアを使い切ってみる

Last updated at Posted at 2019-11-10

経緯

仲間内で「コアを使い切るプログラムをいっぱい書いてみよう」という話題が出たためノリで書いてみました。せっかくなので 時間がないため 仕事でよく使っている Ruby Elixir Go の3言語で試してみました。

マサカリ防止対応
- 実用性、最適化などは一切考えておらず ただコアを使い切ることにフォーカス。
- そのため処理速度やsyntaxは無視
- 標準ライブラリしか使わない
- 30分で書けるレベルのものという制約で殴り書きをする

実行環境

image.png
OSが古いというツッコミはダメです

  • ruby
    • 2.6.4
  • Elixir
    • 1.9.4
  • golang
    • 1.12.7

テストシナリオ

  1. 1〜100000(1+2+3+4...)の合計求める計算を1000回実行する
  2. 1 の処理を並列で実行する
  3. htop でCPU使用状況を見る

1.Ruby

比較的マルチコア環境で性能を引き出しにくいと言われがちなRuby ですがプロセスフォークをすれば簡単に使いきれます。

しかしながら この実装ではprocess をfork しすぎてOS の挙動が怪しくなる ため実際にマルチコア環境で処理を動かすためには頑張ってプログラムを書く必要があるでしょう。
(いいexample があればおしえてください)

gist:
https://gist.github.com/ohta-rh/8fffb2ae778e4135d4f195fb7baf42d7
result:
image.png
OSが固まるので htopのキャプチャーをとる作業が一番苦労しました

悲鳴をあげるOS
image.png

2.Elixir

マルチコア環境下に強いと呼ばれているElixir / Erlangですが、はたしてどうなのでしょうか。
GenServer を使うのが普通かなと思いますがコアを使い切ることしか考えてません。はい、手抜きです

gist:
https://gist.github.com/ohta-rh/254b84ddf666947e92405abeeefc2dc1
result:
image.png

さすがに簡単に使い切りますね。実装は一番簡単でした。

3.Golang

こちらもマルチコア環境下につよいというGolangです。間抜けな顔が素敵です。さてさてどうなのでしょうか。

gist:
https://gist.github.com/ohta-rh/0982ee468b3ba00a9a0be98b24c4b4a7
image.png

今までのシナリオの実装ではgoが早すぎて CPUを使いきれません。
image.png

ということで急遽処理オーダー数を増やして使い切ることができました。go早い!
image.png

総論

最適化など全く考えずに書いていましたが「言語仕様レベルでマルチコアを意識しているか、そうでないか」で書きやすさはもちろん、動作の安定性にも随分と差がでました。
本格的に並列処理を書こうとしたら サンプルのクソコードでは対応できないためもっと複雑な処理が必要になってくるでしょう。

次はもう少し実用的な処理を書いてみようと思いました。

おまけ

90%くらいの仕事において(独断と偏見)パフォーマンスは、特に意識しなくてもフレームワークや、ミドルウェアがだいたいよろしくやってくれます。そして問題になるのはI/Oが絡む部分であり コアを使い切って最適化しよう!みたいな状況は少ないかなとおもいます。
いざとなれば札束で殴ればいいしね!

結局のところ「好きな言語でとりあえず書いて、必要になったら得意とする言語で書き直せばいい」と思ってます。だって、嫌いな言語を書いててもつまらないでしょうw

Let's enjoy programing!!!!!

83
33
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
83
33