两次调用 cout 是否比一次调用效率低?
Are two calls to cout less efficient than one?
我有两个问题:
两次调用 std::cout 是否比一次调用效率低?
如果是,编译器是否(通常)优化它并为下面显示的三种情况生成相等的程序集?
例如:
std::cout << "a" << "b";
或
std::cout << "ab";
或
std::cout << "a";
std::cout << "b";
我问,因为我认为最后一个是最可读的,可以输出更长的文本列表。
在这个例子中,
std::cout << "ab";
效率更高(而且我还没有看到编译器 "merge" 的输出,但我必须说我也没有一直在寻找它 - 如果我发现一些有趣的东西,我会去寻找和编辑).
编辑:Clang(截至上周末的 3.7 版)在以下情况下不合并字符串:
std::cout << "a" << "b";
除了行数和源代码大小 [通常对可执行文件没有影响,因此 "doesn't matter"] 之外,其他两个代码片段完全相同。
如评论中所述,如果您实际上有两个字符串,例如变量,那么构造一个新字符串的开销几乎肯定不值得,而且 std::cout
的性能很少除了限制应用程序执行的总体 I/O 带宽外,它对应用程序的整体性能没有任何影响。换句话说,当向控制台写入内容需要几毫秒时,试图节省几微秒是毫无意义的。
我有两个问题:
两次调用 std::cout 是否比一次调用效率低?
如果是,编译器是否(通常)优化它并为下面显示的三种情况生成相等的程序集?
例如:
std::cout << "a" << "b";
或
std::cout << "ab";
或
std::cout << "a";
std::cout << "b";
我问,因为我认为最后一个是最可读的,可以输出更长的文本列表。
在这个例子中,
std::cout << "ab";
效率更高(而且我还没有看到编译器 "merge" 的输出,但我必须说我也没有一直在寻找它 - 如果我发现一些有趣的东西,我会去寻找和编辑).
编辑:Clang(截至上周末的 3.7 版)在以下情况下不合并字符串:
std::cout << "a" << "b";
除了行数和源代码大小 [通常对可执行文件没有影响,因此 "doesn't matter"] 之外,其他两个代码片段完全相同。
如评论中所述,如果您实际上有两个字符串,例如变量,那么构造一个新字符串的开销几乎肯定不值得,而且 std::cout
的性能很少除了限制应用程序执行的总体 I/O 带宽外,它对应用程序的整体性能没有任何影响。换句话说,当向控制台写入内容需要几毫秒时,试图节省几微秒是毫无意义的。