📌

プログラミング言語の速度の差はどの段階で生まれるのか

2021/04/15に公開

以下リンクの記事を参考にさせていただきました。
ありがとうございます!
https://jp.quora.com/プログラム言語の速度の差は-どの段階で生まれるの

プログラムの実行速度は、

1 実行されるCPU命令数
2 実行されるCPU命令の効率
(パイプラインの乱れや、マルチスコアの利用効率、メモリの領域のアクセス)
3 実行されるIO命令数
(例:メモリアクセス含む)
4 実行されるIO命令数の効率
(例:速いキャッシュデバイスへのアクセスの方が速い、、分散したした方が速い)
で決まる。

2とも関連するが実行時に最適化を行うJIT最適化がある場合、プログラム実行時にも動的に実行されるCPU命令など(中間コードが最適化される場合もある)が最適化される。
JIT最適化がある場合は単純には決まらないが、プログラムの実行速度はデータが同じ場合ほぼコードを記述した時点で決まる。

データが同じ場合とと条件をつけている場合は同じ処理を行う音鳴るアルゴリズムで効率が異なるアルゴリズム、例えばO(n^2)と(n log n)のアルゴリズム、であった場合、データ量が少ない時にはO(n^2)アルゴリズムの方が速いケースもあるから。

基本的にプログラムの実行速度は
・コード
・データ
に左右される。

プログラミング言語のベンチマークをすると
基本的にはC/C++などのマシン語に変換されるプログラミング言語の性能が高くなる。
しかし、APIをいかに効率よく使うのか?
というベンチマークなってしまう場合もある。

ベンチマークを利用したソースコードを見ればわかる通りこれは「いかに文字列マッチライブラリのAPIを効率的に使えるか?」のベンチマークになっている。
(参考:GMBライブラリの使い方ベンチマークになっているケース)
C/C++さえ使っていれば速いコードが書けるわけではない、といういい例だと思う。

同じ言語でも同じ結果が得られたとしても、アルゴリズムが異なれば処理時間は変わる。
アルゴリズム違いよる処理速度が大幅に変わる問題としては有名なソートがある。
データベースから特定のデータを抽出するSQLを書いた時に予想以上に時間がかかったのでデータベースの牽引を、変更してみると、数十分の1の時間で結果が得られた。
その他の速度が変更される要因としてはハードウェア性能による可能性もあるかも。。

[別参考記事]
〜CPUはプログラミング言語をそのまま理解して実行できるわけではない。
言語、あるいは実行環境によってさまざまに違いがあるそう。〜
・ネイティブコード変換した後実行するのか?
コードを切磋琢磨しながら実行するのか?実行後あるいは、中間言語に変換した後実行するのか?
・実行前にどの程度最適化できるのか?
・実行後にも解析・最適化を行うのか?
・ガベージコレクタなど実行時にプログラマが意図したコード以外の負荷のかかる処理が発生するか?
・参照型(ヒープデータを確保する)なのか値型(スタックを、極力利用する)なのか?

などなど考えるべき要因をあげていくことが可能。
速度が要件であれば言語の選定も重要だが開発者が考えるべきなのは言語だけではない。

・要件にあったアルゴリズム(計算量を知らないのは危険)
・要件に合ったハードウェア(ライブラリの下ではCPUをぶん回して解決してる場合もある)
・要件に合ったI/O(ストレージやネットが遅いと全てを無駄にする)
できる限り幅広い知識や経験を持つほど、性能用件などの困難に課題を立ち向かいやすくなる。

[別の回答]
〜その言語がネイティブなコンパイル言語か中間コード型か、インタープリター型による〜

コンパイル言語の場合はコンパイルの段階で決まるのでコンパイラの性能は大きく左右される
C/C++など。

中間コード型は特定のプログラム(実行環境)の上で実行できるよう、中間コードに変換される。
実行環境自体の性能に左右される。
javaやC#など。

インタープリターはソースコードをそのまま解釈して実行する。解釈、実行するためのプログラムの性能に左右される。
shellスクリプトなど。phpやpython,jsなど。

書いたプログラムは最終的にCPUに対する命令に変換されるが同じような処理でも、CPUに対する命令はプログラミング言語によって異なる。
また変換されるタイミングや手続きも言語によって異なる。また変換されるタイミングや手続き言語によってさまざま。
(例えばCは事前に変換が必要で、
javaなら事前に中間言語に変換んしておきJVM上でさらに変換される)
「命令が異なる」というのは、CPUは記憶装置(レジスタやメモリディスクなど)に対してデータの読み書きを行うのだがこの記憶装置をいか効率的に使うかが速度に影響するわけだがこれもまたプログラミング言語によって異なる。

Discussion