質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3925閲覧

std::endlと\nの実行速度の違い

hoshi1996

総合スコア53

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/09/02 02:16

C++を扱っています。
そこでstd::endlと\nに着目しました。

std::endlは改行+バッファをフラッシュする。
\nは改行の違いがあるようです。

そこでこの二つの実行速度を比べてみることにしました。
以下のコードです。

C++

1#include <iostream> 2#include <vector> 3#include <windows.h> 4#include <time.h> 5 6int main(){ 7 int i; 8 int j=0; 9 10/*\nの実行速度*/ 11 clock_t start = clock(); 12 13 for(i=0; i<10000; ++i){ 14 std::cout << "count = " << j << "\n"; 15 ++j; 16 } 17 clock_t end = clock(); 18/*\nの実行速度*/ 19/*std::endlの実行速度*/ 20 j = 0; 21 clock_t startstd = clock(); 22 23 for(i=0; i<10000; ++i){ 24 std::cout << "count = " << j << std::endl; 25 ++j; 26 } 27 clock_t endstd = clock(); 28/*std::endlの実行速度*/ 29 30 std::cout << "\nの場合" << (double)(end -start)/ CLOCKS_PER_SEC; 31 std::cout << "std::endlの場合" << (double)(endstd -startstd)/ CLOCKS_PER_SEC; 32}

実行した結果

\nの場合は 7.463s
std::endlの場合は3.207s

このような違いが生まれました。
stdの方がフラッシュの操作があるため実行速度が増えると考えていました。
この二つの差はなぜ生まれるのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bego

2021/11/09 05:41

ビルド時にアセンブラー リスト ファイルを出力させて、"std::endl" と "\n" の違いを確認してみては? VisualStudio を使っているなら、コンパイル オプションに "/FAcs" を指定すれば、拡張子が cod のアセンブラー リスト ファイルを生成してくれます。 cod ファイルは、C/C++ ソース コードの各行に対比させた状態でアセンブラー リストを出力してくれるので、デバッグ時にも結構役立ちます。 /FA, /Fa (Listing file) https://docs.microsoft.com/en-us/cpp/build/reference/fa-fa-listing-file?view=msvc-170
guest

回答2

0

今の倍ぐらい差がある状況は、おそらくコンソール側のバッファの問題です。
コンソール側では高々1万行弱しか表示できないので、あらかじめその分の1万行ほどを無駄に流しておけば後はイーブンの状態で計測コードが動くはずです。

まだ思った結果にならない場合は

先頭に std::cout.sync_with_stdio(false); をつける
VC++を使っているなら、GCCやClangを使ってみる

などすれば、より納得いく結果になると思います。

投稿2021/09/02 04:05

yudedako67

総合スコア2047

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

std::endlは出力バッファをフラッシュし, \nは出力バッファをフラッシュしません。そこが決定的な違いです。だから実行速度に差が生まれたのだと思います。

投稿2021/11/08 12:57

wagashi_157

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/11/09 02:37

この回答では不足ではないでしょうか. > stdの方がフラッシュの操作があるため実行速度が増えると考えていました とのことですから,質問時点で「フラッシュの有無が実行速度に影響を与える(であろう)」という事までは既知であり, しかし実験してみたら > \nの場合は 7.463s > std::endlの場合は3.207s という 予想とは逆の結果 になった → なぜなのか? という質問だと見えます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問