スタック・オーバーフロー Asked on February 8, 2021
C/C++ は非常に高速に動作する言語であることは既に知られていますが、なぜほかのプログラミング言語に比べて圧倒的に高速に動作するのでしょうか?
マシン語やアセンブリ言語に近い記述ができるからでしょうか? C/C++ の高速化の秘訣が知りたいです。
単純に書き込み処理の量が減るので高速になります。ただし、最初に何の値が入っているか判らないという事なので、これに気付かずバグを生むことがあります。Releaseビルドで挙動が違うとかは、大体これのせい。
最近のGCのある流行りの言語より手間は増えますが、ヒープにアクセスする頻度、余計なメモリチェックが減るので高速になります。ただし、確保したメモリ範囲外を踏み抜こうが気付かずそのまま動いたりするので、良し悪しです。他言語でも、意識的にヒープ使用を抑えるようなコーディングをすると、この辺りはかなり差が縮まります。
動作環境が決まっているのであれば、CPUの種類を指定したり、かなり細かいチューニングをしてより速いコードを吐かせる事が可能です。当然環境依存するコードを吐くので、これも良し悪しです。
パっと思いつくのが、こんなとこです。
Answered by radian on February 8, 2021
インライン化や自動ベクトル化による最適化でコンパイラが実行速度を速くしている。
長年稼働している言語なので最適化のナレッジが積み上がっているので速いというところでしょうか。
欠点としては最適化を最初にかけるのでCPUアーキテクチャによって遅くなったり動かなくなったりすることがあります。
あとコンパイル時間が遅いです。
決して言語として速いわけではないと思います。
長年の実績でインフラが整っていると考えればいいと思います。
言語の仕様としては遅くなる要素は排除されているくらいですかね。
メモリの境界チェックとかないし。
Answered by you21979 on February 8, 2021
他言語ってのが「インタプリタ」系言語であるなら、そりゃ「コンパイル」系言語と「実行速度を比べる」のがそもそも間違いというか、かわいそうというか。でも「ソースコードを書く時間」「実行に移せるまでの時間」はインタプリタ系言語のほうが圧倒的に短かかったりしますので、それはその言語に何を期待しているかの違い。
同じコンパイル系言語であっても
c / c++ は事前コンパイル (Ahead-of-Time)
java / .netframework は実行時コンパイル (Just-in-Time) wikipedia : JIT
という違うものがあります。
AOT では、末端顧客が使っている実行環境のうちの最低ラインを想定しておかないといけないのに対して
JIT では、実行環境に合わせた高度最適化ができる場合があるので、
客先での JIT にかかる時間を加味しても後者のほうが実行速度が上、なんてことはままあるようです。
ゲーム機 (PS4 / PS5 / XBOX) などの場合、実行環境が勝手に変わることはまずないので AOT のほうが高速でしょう。ワンチップマイコンなどでは JIT コンパイラを入れるだけの容量が無いので AOT しか選択肢がないのが普通。
Answered by 774RR on February 8, 2021
C/C++ は非常に高速に動作する言語であることは既に知られていますが
ハイパースレッディングやマルチコアが登場する前の、過去の話です。シングルスレッドで動作するのであれば、マシン語に近い記述をすることでアドバンテージがありました。しかしマルチスレッドが前提となっている現代においては、動的に処理を組み換えできる言語が速度で上回ることが往々にしてあります。
更にはGPGPUが登場し、ライブラリに指示を出すだけとなると、呼び出す言語にあまり依存しなくなっている分野もあります。
Answered by sayuri on February 8, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP