簡體   English   中英

輸出換行符的最有效方法

[英]Most efficient way to output a newline

我想知道將新行輸出到控制台的最有效的性能方式是什么。 請解釋為什么一種技術更有效。 在性能方面高效。

例如:

cout << endl;
cout << "\n";
puts("");
printf("\n");

這個問題的動機是我發現我自己寫了帶有輸出的循環,我需要在循環的所有迭代之后輸出一個新行。 假設沒有其他問題,我試圖找出最有效的方法是什么。 這種認為其他一切都不重要的假設可能是錯誤的。

putchar('\n')是最簡單且可能最快的。 帶有字符串"\n"coutprintf使用以空字符結尾的字符串,這比較慢,因為您處理 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::ostreamstd::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相同的性能特征。
  • stdoutstd::cout默認情況下是正式同步的(例如查找std::ios_base::sync_with_stdio )以允許混合輸出到stdoutstd::cout (同樣適用於stderrstd::cerr
  • 如果您的代碼輸出多於一組換行符,則存在處理(通過任何方式訪問或讀取輸出所基於的數據)以生成其他輸出,輸出函數處理這些輸出等。
  • 有不同的績效衡量標准,因此提高效率的方法也不同。 例如,可能有 CPU 周期、輸出出現在控制台上的總時間、內存使用情況等
  • 控制台可能是一個物理屏幕,它可能是由應用程序創建的一個窗口(例如托管在 X、windows 中)。 性能將受到硬件選擇、窗口/GUI 子系統的實現、操作系統等的影響。

以上只是一個選擇,但有許多因素可以決定什么可以被認為是或多或少的性能。

我建議使用:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM