web-dev-qa-db-ja.com

CはC ++よりも著しく速い

私が理解している限り、すべてのスクリプト言語とコア科学プログラムは通常Cで書かれています。これにより、実装が複雑になりますが、要点がわかりやすくなります。

これらの人々はパフォーマンスを最大限に高めたいと思っていますが、C文字列とC構造体を使用することとC++クラスを使用することの間に本当の違いがあります。 C++は、仮想関数を除き、同じように機能するようです。クラス関数を1回格納し、そのクラスのすべてのインスタンスがその1つの関数を呼び出します。

Cを高速化する理由と、pythonまたは最速でなければならないsqliteなどのプロジェクトでの顕著な違いは何ですか?

64
Will03uk

C++は科学プログラムによく使用されます。そのドメインでは、Cの人気が低下している可能性があります。 Fortranは「低レベル」言語として人気があります。

C++では、「使用した分だけお支払いください」。したがって、Cよりも遅くなることはありません。特に科学プログラムの場合、式テンプレートを使用すると、テンプレートエンジンを使用してプログラムのセマンティクスを処理するカスタム最適化を実行できます。

PythonなどのプロジェクトでCが選択される理由は、多くの人々が(比較的)完全に理解しているためです。

SQLiteには小さな実行可能コードサイズの要件があり、Cにはわずかなエッジがあります。 C++を慎重に使用することで、組み込みアプリケーションでの使用が可能になりますが、不要な言語機能が忍び寄るのではないかと思われるため、あまり人気がありません。

47
Potatoswatter

その理由は、相互運用性と同じくらいパフォーマンスに関係しているとは思いません。 C++言語はC言語よりも複雑ですが、パフォーマンスの観点からは、どちらの方法でも顕著な違いはありません。一部のC++コンストラクトは、Cに相当するものよりも高速です(std::sortqsortよりも高速です)。おそらく他の方法の良い例があります。

編集:相互運用性の面で...

基本的に、C++標準では、異なるコンパイラ/バージョンで作成されたバイナリ間の相互運用性を容易にするために必要なものの一部を定義していません。ここで最も注目すべき問題は、バイナリ内のシンボルの命名規則です。 Cでは、言語はコード内の各シンボルからバイナリシンボル名への単一のマッピングを定義します。 my_functionという関数は、my_functionというシンボルをバイナリに作成します。一方、関数のオーバーロードなどの機能により、C++関数の名前はmangled(バイナリの異なる関数記号に変換され、引数の型と戻り値の型をエンコードする必要があります)、また、標準では、マングリングの実行方法が定義されていません。これは、C++の同じ関数をコンパイラに応じて異なるシンボルにコンパイルできることを意味します(extern "C"を使用してC++の関数のC相互運用性を強制しない限り)。

結局のところ、内部での実装方法の詳細がC/C++ /他のネイティブ言語である場合でも、スクリプト言語とネイティブコード間のインターフェイスはCインターフェイスである必要があります。

(私は意図的に言語防御の炎の戦争に入ることを望んでいません、C++は本当に強力ですが、Cよりもはるかに複雑な言語であるため、少し怖いですlook = simpleはパフォーマンスに影響を与える可能性があります)

言語は本質的に高速でも低速でもないため、インタープリターとコンパイラーは多少効率的かもしれません。

それに加えて、高レベル言語は、通常は実行時コストのかかる抽象化レイヤーを提供します。あなたがそれらを使用していない場合、コンパイラはそれらを取り除くのに十分スマートかもしれませんが、言語のセマンティクスがそれを安全に行うことを許可しない場合、それは可能ではないかもしれません...低レベルの言語では、おそらく「遅い」言語を使用するよりも遅くなります。

7
fortran

[D&E]でBjarneが言及したように、有効性はC++の主要な目標の1つです。 C++は、プログラマーがあなたが言及した仮想関数、rtt情報などの「追加」関数を使用する場合にのみ遅くなります。

だから私はそれがより心理的な理由だと思う-「遅い」C++機能を許可しないのでCが使用される。

6
outmind