8

このプログラム:

#include <iostream>
#include <cstdlib>
#include <string>

int main(int argc, const char *argv[])
{
   using ::std::cerr;
   using ::std::cout;
   using ::std::endl;

   if (argc < 2 || argc > 3) {
      cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
      return 1;
   }
   unsigned long count = 10000;
   if (argc > 2) {
      char *endptr = 0;
      count = ::std::strtoul(argv[1], &endptr, 10);
      if ((argv[1][0] == '\0') || (*endptr != '\0')) {
         cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
         return 1;
      }
   }
   const ::std::string msg((argc < 3) ? argv[1] : argv[2]);
   for (unsigned long i = 0; i < count; ++i) {
      cout << i << ": " << msg << '\n';
   }
   return 0;
}

次のようなタイミングで:

$ time ./joe 10000000 fred >/dev/null

real  0m15.410s
user  0m10.551s
sys   0m0.166s

実行には実時間で 15.4 秒かかります。出力行を次のように置き換えると、次のcout << i << ": " << msg << endl;ようになります。

$ time ./joe 10000000 fred >/dev/null

real  0m39.115s
user  0m16.482s
sys   0m15.803s

ご覧のとおり、実行時間は 2 倍以上になり、プログラムは OS で最小限の時間を費やすことから、OS で費やす時間のほぼ半分になります。

プログラムの両方のバージョンの出力は同一であり、すべてのプラットフォームで同一の出力が得られることが標準によって保証されています。

これを考えると、なぜ人々endlは同義語として使い続けるのですか?'\n'?

編集: 明らかでない場合、この質問は主要な質問であることを意図しており、説明目的でここにあります。パフォーマンスのペナルティが存在する理由を知っています。

4

6 に答える 6

21

よくわかりません。出力ストリームへの挿入は、挿入してから呼び出すこととstd::endl同等であると定義されていますが、多くのプログラマーは、フラッシュする理由がない場合でも使用し続けます。たとえば、すぐに何か他のものを出力し続けます。.widen('\n')flush()std::endl

私の推測では、特定の改行文字を明示的に使用していないため、何らかの形でより移植性が高いという誤った信念から来ているということです。\nストリーム ライブラリによって非バイナリ ファイルのシステムの正しい改行シーケンスに常にマップする必要があるため、これは正しくありません。

于 2010-01-23T11:43:16.927 に答える
4

誰もがパフォーマンスをそれほど気にしているわけではありません。一部のアプリケーションでは、ストリームがフラッシュされることを保証することがはるかに重要です。

編集:また、私は:-)endlよりも入力が簡単だと思います'\n'

于 2010-01-23T11:39:28.153 に答える
4

知る限り、endl はストリームもフラッシュしますが、これがパフォーマンスの低下の原因になっている可能性があります。

于 2010-01-23T11:39:30.770 に答える
2

欠けている改行を簡単に見つけられるようにするため、文字列ストリームでは endl を使用する傾向があります。

于 2010-01-23T12:08:33.533 に答える
2

私の推測ではstd::endl、初心者にとってよりシンプルで混乱が少ないという信念を持って説明テキストが使用され、その後、人々はそれを使用することに慣れました.

于 2010-01-23T12:44:03.273 に答える
0

本当の問題は、なぜコンパイラは endl バージョンをコンパイルすることをそのような犬の朝食にしたのですか? 同じセマンティクスを持つことが保証されている場合は、ランタイムも同じにする必要があります。

編集:明らかに、 endl がストリームをフラッシュしたことを知りませんでした...それは、検索しないことで得られるものです。

于 2010-01-23T11:38:55.453 に答える