7

最新のコンパイラとその最適化において、重要なコードを C++ ではなく C で記述して高速化する価値があるかどうか疑問に思っています。

C++ は、クラスがコピーされているときに参照渡しが可能である場合や、通常はオーバーロードされた演算子や他の多くの同様のケースを使用して、コンパイラによってクラスが自動的に作成された場合に、パフォーマンスが低下する可能性があることを知っています。しかし、これらすべてを回避する方法を知っている優秀な C++ 開発者にとって、C でコードを記述してパフォーマンスを向上させる価値はあるのでしょうか?

4

5 に答える 5

18

私は多くのコメントに同意するつもりです。C構文は、C ++で意図的に(C99でのみ発散して)サポートされています。したがって、すべてのC++コンパイラがそれをサポートする必要があります。実際、専用のCコンパイラを見つけるのはもう難しいと思います。たとえば、GCCでは、コードがCであるかC ++であるかに関係なく、実際には同じ最適化/コンパイルエンジンを使用することになります。

本当の問題は、プレーンなCコードを記述し、C++でコンパイルするとパフォーマンスが低下するかどうかです。答えは、すべての意図と目的のために、いいえです。例外とRTTIについてはいくつか注意が必要ですが、これらは主にサイズの変更であり、速度の変更ではありません。実際にパフォーマンスに影響を与える例を見つけるのは非常に難しいので、専用モジュールを作成する価値はないようです。

使用する機能について何が言われたかが重要です。C ++では、コピーのセマンティクスについてだらしなくなり、メモリのコピーによって大きなオーバーヘッドが発生するのは非常に簡単です。私の経験では、これが最大のコストです。Cでは、このコストも発生する可能性がありますが、私が言うほど簡単ではありません。

仮想関数呼び出しは、通常の関数よりもわずかに高価です。同時に、強制インライン関数は通常の関数呼び出しよりも安価です。どちらの場合も、スタックからパラメーターをプッシュ/ポップするコストが高くなる可能性があります。ただし、関数呼び出しのオーバーヘッドについて心配することは、最適化プロセスのかなり遅い段階で発生するはずです。これは、重大な問題になることはめったにないためです。

例外はスロー時にコストがかかります(少なくともGCCでは)。ただし、catchステートメントを設定してRAIIを使用することには、それに関連する大きなコストはありません。これはGCCコンパイラ(およびその他)の設計によるものであるため、実際には例外的なケースのみがコストがかかります。

しかし、要約すると、優れたC ++プログラマーは、Cで記述しただけでは、コードをより高速に実行することはできません。

于 2010-10-22T15:54:33.460 に答える
10

測定! 最適化を考える前に測定し、最適化を適用する前に測定し、最適化を適用した後に測定し、測定します!

コードを1ナノ秒速く実行する必要がある場合(1000人が使用するため、次の1000日間で1000回使用され、その秒が非常に重要であるため)、何でも構いません。

はい!それは価値がある ...

  • 言語の変更(C ++からC、PythonからCOBOL、MathlabからFortran、PHPからLisp)
  • -fコンパイラの調整(すべてのオプションを有効/無効にする)
  • 別のライブラリを使用する(独自のライブラリを作成することもできます)

忘れてはならないのは測定することです!

于 2010-10-22T15:55:16.240 に答える
1

The question has been answered to death, so I won't add to that.

Simply as a generic question, assuming you have measured, etc, and you have identified that a certain C++ (or other) code segment is not running at optimal speed (which generally means you have not used the right tool for the job); and you know you can get better performance by writing it in C, then yes, definitely, it is worth it.

There is a certain mindset that is common, trying to do everything from one tool (Java or SQL or C++). Not just Maslow's Hammer, but the actual belief that they can code a C construct in Java, etc. This leads to all kinds of performance problems. Architecture, as a true profession, is about placing code segments in the appropriate architectural location or platform. It is the correct combination of Java, SQL and C that will deliver performance. That produces an app that does not need to be re-visited; uneventful execution. In which case, it will not matter if or when C++ implements this constructors or that.

于 2010-10-23T07:11:14.823 に答える
1

pmg nailed it. Just measure instead of global assumptions. Also think of it this way, compilers like gcc separate the front, middle, and back end. so the frontend fortran, c, c++, ada, etc ends up in the same internal middle language if you will that is what gets most of the optimization. Then that generic middle language is turned into assembler for the specific target, and there are target specific optimizations that occur. So the language may or may not induce more code from the front to middle when the languages differ greatly, but for C/C++ I would assume it is the same or very similar. Now the binary size is another story, the libraries that may get sucked into the binary for C only vs C++ even if it is only C syntax can/will vary. Doesnt necessarily affect execution performance but can bulk up the program file costing storage and transfer differences as well as memory requirements if the program loaded as a while into ram. Here again, just measure.

I also add to the measure comment compile to assembler and/or disassemble the output and compare the results of your different languages/compiler choices. This can/will supplement the timing differences you see when you measure.

于 2010-10-22T17:25:26.183 に答える
0

最新のコンパイラとその最適化において、重要なコードを C++ ではなく C で記述して高速化する価値があるかどうか疑問に思っています。

番号。読めるようにしてください。あなたのチームが c++ または c を好む場合は、それを好みます。特に、それが既に運用コードで機能している場合 (正当な理由がない限り、書き直さないでください)。

クラスが参照渡しされているときにクラスがコピーされた場合、C++ がパフォーマンスの低下につながる可能性があることはわかっています。

次に、コピーと割り当てを禁止します

または、クラスがコンパイラによって自動的に作成される場合、通常はオーバーロードされた演算子および他の多くの同様のケースを使用します

詳しく教えていただけますか?テンプレートを参照している場合、実行時に追加のコストはかかりません (ただし、追加のエクスポートされたシンボルが発生し、バイナリが大きくなる可能性があります)。実際、(たとえば) 変換が必要な場合は、テンプレート メソッドを使用するとパフォーマンスが向上します。

しかし、これらすべてを回避する方法を知っている優秀な C++ 開発者にとって、C でコードを記述してパフォーマンスを向上させる価値はあるのでしょうか?

私の経験では、エキスパートの C++ 開発者は、より高速で保守しやすいプログラムを作成できます。

使用する (および使用しない) 言語機能を選択する必要があります。C++ の機能を c で利用可能なセットに分解すると (例: 例外、仮想関数呼び出し、rtti を削除する)、良いスタートを切ることができます。テンプレート、メタプログラミング、最適化手法の使い方を学び、(c では​​ますます難しくなるか冗長になる) 型エイリアシングを回避するなどの方法を学べば、c と同等以上の速度でプログラムを維持できるようになるはずです。 c++ に精通している)。

C++ の機能に慣れている場合は、c++ を使用してください。多くの機能があり (その多くは速度/コストを考慮して追加されています)、c と同じくらい (またはそれ以上) 高速に記述できます。

テンプレートとメタプログラミングを使用すると、多くの実行時変数をコンパイル時の定数に変換して、例外的な利益を得ることができます。時々、それはマイクロ最適化の領域にうまく行きます。

于 2010-10-23T08:29:56.690 に答える