[英]Most efficient way to output a newline
我想知道將新行輸出到控制台的最有效的性能方式是什么。 請解釋為什么一種技術更有效。 在性能方面高效。
例如:
cout << endl;
cout << "\n";
puts("");
printf("\n");
這個問題的動機是我發現我自己寫了帶有輸出的循環,我需要在循環的所有迭代之后輸出一個新行。 假設沒有其他問題,我試圖找出最有效的方法是什么。 這種認為其他一切都不重要的假設可能是錯誤的。
putchar('\n')
是最簡單且可能最快的。 帶有字符串"\n"
的cout
和printf
使用以空字符結尾的字符串,這比較慢,因為您處理 2 個字節 (0A 00)。 順便說一下,回車是\r
= 13 (0x0D)。 \n
代碼是換行 (LF)。
您沒有指定是要求立即更新屏幕還是推遲到下一次刷新。 所以:
如果您使用的是 iostream io:
cout.put('\n');
如果您使用的是 stdio io:
std::putchar('\n');
在 Ubuntu 15.10 上,g++ v5.2.1(以及較舊的 vxWorks 和 OSE)
很容易證明
std::cout << std::endl;
將新行字符放入輸出緩沖區,然后將緩沖區刷新到設備。
但
std::cout << "\n";
將新行字符放入輸出緩沖區,並且不輸出到設備。 將來需要采取一些操作來觸發將緩沖區中的換行符輸出到設備。
兩個這樣的動作是:
std::cout << std::flush; // will output the buffer'd new line char
std::cout << std::endl; // will output 2 new line chars
還有一些其他操作可以觸發 std::cout 緩沖的刷新。
#include <unistd.h> // for Linux
void msDelay (int ms) { usleep(ms * 1000); }
int main(int, char**)
{
std::cout << "with endl and no delay " << std::endl;
std::cout << "with newline and 3 sec delay " << std::flush << "\n";
msDelay(3000);
std::cout << std::endl << " 2 newlines";
return(0);
}
而且,根據認識的人的評論(抱歉,我不知道如何在此處復制他的名字),某些環境存在例外情況。
它實際上取決於操作系統/編譯器的實現。
輸出'\n'
換行符的最有效、副作用最小的保證方法是使用std::ostream::write()
(對於某些系統,要求std::ostream
在std::ios_base::binary
中打開模式):
static const char newline = '\n';
std::cout.write(&newline,sizeof(newline));
這個問題的答案真的是“視情況而定”。
孤立地——如果你要測量的只是將一個'\n'
字符寫入標准輸出設備的性能,而不是調整設備,而不是改變發生的緩沖——那么將很難擊敗像這樣的選項
putchar('\n');
fputchar('\n', stdout);
std::cout.put('\n');
問題是這並沒有取得多大的成就——它所做的一切(假設輸出是到屏幕或可見的應用程序窗口)是將光標向下移動到屏幕,並將先前的輸出向上移動。 對於您的程序的用戶來說,這並不是一種有趣或有價值的體驗。 所以你不會孤立地做這件事。
但是,如果我們不單獨輸出換行符,什么會影響性能(無論您如何衡量)? 讓我們來看看;
stdout
(或std::cout
)的輸出。 要使輸出可見,選項包括關閉緩沖或讓代碼定期刷新緩沖區。 也可以使用stderr
(或std::cerr
),因為默認情況下不緩沖 - 假設stderr
也被定向到控制台,並且輸出到它具有與stdout
相同的性能特征。stdout
和std::cout
默認情況下是正式同步的(例如查找std::ios_base::sync_with_stdio
)以允許混合輸出到stdout
和std::cout
(同樣適用於stderr
和std::cerr
)以上只是一個選擇,但有許多因素可以決定什么可以被認為是或多或少的性能。
我建議使用:
std::cout << '\n'; /* Use std::ios_base::sync_with_stdio(false) if applicable */
要么
fputc('\n', stdout);
並打開優化,讓編譯器決定什么是完成這項瑣碎工作的最佳方法。
好吧,如果您想更改行,我想添加使用 (endl) 的最簡單和最常見的方法,與cout << '\n';
不同,它具有刷新流的額外好處。 在其自己的。
例子:
cout << "So i want a new line" << endl;
cout << "Here is your new line";
輸出:
So i want a new line
Here is your new line
這可以為你想要的盡可能多的新行完成。 請允許我用 2 行新行來展示一個例子,它肯定會消除你所有的疑慮,
例子:
cout << "This is the first line" << endl;
cout << "This is the second line" << endl;
cout << "This is the third line";
輸出:
This is the first line
This is the second line
This is the third line
由於不需要換行,最后一行將只用分號結束。 (endl) 如果需要也可以鏈接,例如, cout << endl << endl;
將是一個有效的序列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.