薄いブログ

技術の雑多なことを書く場所

プログラミング言語の性能についての考え

自分の考えをまとめたものです。

前提としてプログラミング言語間の性能ベンチマークは好きではありません。 この記事で書いてある自分の考えに基づくとあまり意味のないものだからです。

本題

プログラミング言語の性能については得られる性能とそのために必要なコストの曲線(コスパ曲線)を意識することが最も重要だと考えています。 (無限のコストを投入すればどの言語においても同じ性能に到達すると仮定しています)

コスパ曲線については以下のことを考えています。

  • ビジネスの場合は投入できるコストを一定としたときに最大の利益を得られるプログラミング言語を選ぶのがよい

    • 性能によって得られる利益はビジネスごとに異なるため考える必要がある
    • 利益の積分値を最大化したい、区間についてはそれぞれで設定する
  • コスパ曲線は人のスキルに依存する

    • 学習なり採用なりで人にスキルに対してコストを払うことでコスパ曲線が変化する
  • コスパ曲線は対象の領域に依存する

    • 対象の領域によくテストされた高速なライブラリがある場合は自分たち以外の誰かが代わりにコストを払ってくれている
    • システムの性能におけるそのプログラミング言語が関与している割合が低い場合もある
      • I/Oが占める割合が多い(基本的には SQL を投げるだけなど)
  • コスパ曲線はランタイムやコンパイラ、性能周りのエコシステムの質に依存する

    • ビジネスやチーム, 対象領域を考慮しない場合はこれが一番重要な要素になる
    • JIT, PGO, LTO, auto vectorization, ...
    • プロファイリングツール、ベンチマークツール
      • 継続的プロファイリング
      • pprof, jfr, perf, ebpf

例えば Rust がある程度かける人なのであればコンパイラの性能やランタイムにより低いコストで十分な性能を得られるなどです。

僕の場合だと Go では言語自体の習熟と testing.B, pprof, PGO のおかげで低いコストで十分な性能を得られています。 特に pprof のおかげでかかるコストが低くなっていることを感じています。 なので個人的に性能という観点では性能改善のサイクルが回しやすいこと(プロファイリングしやすいこと、ベンチマークが書きやすいこと)を重要視しています。

プログラミング言語の性能について話すときは自分はどの前提をおいているかを意識すると不毛な議論を避けることができるはずです。

そもそも性能以外にも考慮するべきことは多くあってそれだけでプログラミング言語を選ぶことはあまりありません。 ただビジネスの利益構造として性能が非常に重要なケースや規模、将来のことを考慮してより利益がでるものに乗り換えるケースは現実的にあると思います。 性能の話題がでたときこの記事で書いたことを考慮しても良いのではないでしょうか。