chương trình này:Tại sao endl được sử dụng như một từ đồng nghĩa cho " n" mặc dù nó bị phạt nặng?
#include <iostream>
#include <cstdlib>
#include <string>
int main(int argc, const char *argv[])
{
using ::std::cerr;
using ::std::cout;
using ::std::endl;
if (argc < 2 || argc > 3) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
unsigned long count = 10000;
if (argc > 2) {
char *endptr = 0;
count = ::std::strtoul(argv[1], &endptr, 10);
if ((argv[1][0] == '\0') || (*endptr != '\0')) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
}
const ::std::string msg((argc < 3) ? argv[1] : argv[2]);
for (unsigned long i = 0; i < count; ++i) {
cout << i << ": " << msg << '\n';
}
return 0;
}
khi đúng lúc như vậy:
$ time ./joe 10000000 fred >/dev/null
real 0m15.410s
user 0m10.551s
sys 0m0.166s
mất 15,4 giây của thời gian thực để thực thi. Thay thế dòng đầu ra với điều này: cout << i << ": " << msg << endl;
và bạn kết thúc với một cái gì đó như thế này:
$ time ./joe 10000000 fred >/dev/null
real 0m39.115s
user 0m16.482s
sys 0m15.803s
Như bạn có thể thấy, thời gian để chạy hơn gấp đôi, và chương trình đi từ dành thời gian tối thiểu trong hệ điều hành để chi tiêu gần một nửa thời gian trong hệ điều hành.
Cả hai phiên bản của chương trình đều có đầu ra giống nhau và được đảm bảo theo tiêu chuẩn để có kết quả giống nhau trên mọi nền tảng.
Vì điều này, tại sao mọi người kiên trì trong việc sử dụng endl
như một từ đồng nghĩa với '\n'?
Edit: Trong trường hợp nó không phải là rõ ràng, câu hỏi này được thiết kế để trở thành một câu hỏi hàng đầu và là ở đây cho mục đích giảng dạy . Tôi biết lý do tại sao các hình phạt hiệu suất tồn tại.
Bạn có thể cho tôi biết phần nào của tiêu chuẩn đảm bảo rằng đầu ra sẽ giống nhau trên tất cả các nền tảng không? – Glen
Xem: http://stackoverflow.com/questions/213907/c-stdendl-vs-n –