[英]Which of the printf() will be faster and why?
知道了
printf("%*s", 10, "");
與...相同
printf("%10s", "");
其中哪一個更快,更有效且對編譯器更友好?
printf("%*s", 10, "");
那將打印10個空格。
printf("%10s", 10, "");
那是不對的。 當然,您的意思是:
printf("%10s", "");
這還將打印10個空格。
老實說,我不知道哪一個更快,這可能取決於特定的printf
實現。 第一個版本必須處理其他參數。 在第二個中,給printf
一個int
值,它不必從字符序列'1'
, '0'
進行解析。
但是我有足夠的信心相信,與將這10個字節的數據寫入輸出設備的成本相比,無論是終端窗口(渲染所選字體代表空格的每個像素),性能上的差異都可能微不足道。到顯示器上),磁盤上的文件(等待讀寫頭移動到位,然后讓磁盤旋轉到要寫入的位置,盡管其中大部分可能是並行完成的),或者網絡連接(您的想法)。
在某些情況下,性能差異很重要。 如果可以一次調用並存儲結果,則不要在循環的每次迭代中調用strlen()
。 當您可以使用Quicksort時,請勿在大型陣列上使用Bubblesort -或僅調用qsort()
,它已經過優化,使用壽命只有一英寸。
這不是其中一種情況。
相反,寫下最清楚表達您意圖的內容。 如果我知道我恰好需要10個空格,我可能會寫printf("%10s", "");
; 如果空格數是在運行時確定的,我可以寫printf("%*s", n, "");
。
而且,如果您編寫更簡單的代碼,則可以在第一次使用時獲得更好的效果。 想象一下,您將花費更多的CPU周期來修復和重新編譯程序。
至於哪個更“編譯友好”,我不確定你是什么意思。 如果您願意做的話,編譯器也不會受到冒犯。
哪一個更快取決於該庫的實現細節。 "%*s"
變量從堆棧中拉出了一個附加參數...我希望差異是很小的,尤其是與終端輸出的間接費用相比。
如果需要輸出寬度可變,請使用"%*s"
。 如果不這樣做,請使用更簡單的"%10s"
,它更易於閱讀。
您始終可以通過編碼檢查結果。
#include<stdio.h>
#include<time.h>
using namespace std;
int main()
{
double cl = clock();
for(int i=0;i<100000;i++){
printf("%*s", 10, "");//3.814
}
cl = clock() - cl;
fprintf( stderr, "%lf\n", cl / CLOCKS_PER_SEC );
//printf("%10s", "");//3.617
return 0;
}
我的電腦的時間限制正在被評論。 這可能在不同的電腦上有所不同。 但是我認為你的回答是正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.