已关闭,此问题需要更focused。目前不接受答复。
**想改善这个问题吗?**更新问题,使其仅通过editing this post关注一个问题。
2天前关闭。
Improve this question
我遇到的一个常见的性能难题是,将多个字符串连接在一起并输出一个大字符串(如cout或fstream)是否比单独输出多个字符串更有效。请参阅下面的代码以获得解释:
// Individual strings
std::string str1 = "What";
std::string str2 = " is";
std::string str3 = " more";
std::string str4 = " efficient?\n";
// 1) String concatenation + output
std::string strConcat = str1 + str2 + str3 + str4;
std::cout << strConcat;
// 2) Output individual strings (std::cout)
std::cout << str1 << str2 << str3 << str4;
我知道这是一个相当宽泛的问题,因为有多种方法可以连接字符串,有多种方法可以输出字符串('+'运算符,std::string::strcat,std::string::append),还有多种方法可以输出,比如控制台输出(std::cout),文件流输出(std::fstream)等。
我假设性能方面,字符串连接可能会创建字符串变量的副本,而使用std::cout之类的输出创建对象。
1条答案
按热度按时间nbnkbykc1#
这取决于c++ io流的实现细节,以及它们是否被缓冲(默认为不缓冲)。
如果io流没有被缓冲,那么每个输出调用可能会导致一个系统调用,在大多数情况下,这比分配和memcpy要重得多,因此在输出之前连接字符串会更快。
如果流被缓冲,则两者的性能应当是相当的,并且甚至被缓冲的流可以更快,因为它们有效地重用该高速缓存缓冲器,并且系统调用可以甚至更少。但是,无论如何,您都需要进行测试和配置文件。
C++流默认不缓冲的原因是为了与C流同步。要启用缓冲,请使用
sync_with_stdio
并传递false以禁用同步