我查看了一些使用openmp并行化循环的源代码。在循环中构造了一个字符串流,并将几个字符写入其中,并在最后使用stringstream::str()检索字符。循环的并行化似乎对性能没有太大影响,直到字符串流构造函数从循环中移出并替换为对seem流的调用::clear()。
在字符串流构造函数中是否存在关键部分或其他阻塞机制?如果是的话,这是有记录的地方吗?代码是用g++ 4.9.2编译的。
发布于 2015-05-28 08:42:10
销毁stringstream对象会破坏其内存缓冲区。您正在看到循环中堆分配的效果。
调用clear不会释放任何内存。它允许循环重用缓冲区。
发布于 2021-09-09 20:18:08
std::stringstream构造函数调用std::locale的默认构造函数。
这是因为它继承自std::ios_base,这些类型必须调用std::basic_ios::init() (如这里所描述的:base)。此调用符合以下条件:getloc()将返回默认构造的std::local对象的副本(如这里所述的ios/init),因此必须在std::stringstream的构造函数中调用std::locale()。
std::local构造函数将导致与当前全局区域设置相关的方面上的引用计数增量。(见https://en.cppreference.com/w/cpp/locale/locale)。
区域设置引用计数和每个方面引用计数都以线程安全的方式更新,类似于std::shared_ptr。
增量必须是原子的,因为它正在修改共享状态。
根据您正在使用的标准库实现,这可以解释为什么您没有看到预期的性能提高。
https://stackoverflow.com/questions/30501327
复制相似问题