結論:在相同的條件下,cin/cout 會比 scanf/printf 快。
理論依據:scanf/printf 使用了 format string 處理字串,而全都是 runtime 的行為。
就算 printf("%d", n)
已經固定, %d
仍需要在每次執行時重新 parse。
cin/cout 透過 operator overloading,用變數的型別直接決定行為。
- cin/cout 預設會和 stdin/stdout 同步
- 若不做同步,cin/cout 和 scanf/printf 就不能混用
std::endl
會將緩衝區(buffer)清空- cin/cout 預設會綁定在一起
- cout 的緩衝區在 cin 時會被清空
以上三點都會造成頻繁的 I/O,造成效能下降。
要注意這些「多餘」的步驟都是有原因的; 例如把 cin/cout 解除綁定以後,cout 就不會在 cin 時清空, 你在 cout 出「請輸入一個數字」以後 cin,使用者也不會看到這些字。
ios_base::sync_with_stdio(false);
把 cout << n << endl;
換成 cout << n << '\n';
cin.tie(0);