2012年(3)
分类: LINUX
2012-08-26 23:15:29
最近在使用gproftools给系统做性能分析的时候,无意中发现ostringstream在构造的时候居然有加锁行为,在多线程环境下由于锁的冲突,这成了一个很大的性能损耗点,心里比较纳闷,这东西为啥要加锁呢,顺便研究了下。
原来ostringstream在解释一些宽字符串(如汉字)的时候,依赖执行环境的本地化策略,一个可执行文件在运行前是无法确定这些转换策略的,所以ostringstream在构造的时候需要通过 std::locale()来获取本地化策略,std::locale()内其实是拷贝了全局的本地化策略,同时系统允许对本地化策略进行更改和重新设置,例如:std::locale::global(std::local(myloc));
显然需要对全局的本地化策略进行保护。所以ostringstream 构造时就有加锁行为,这个在多线程环境下锁争用就比较突出了,特别是使用ostringstream比较频繁的代码(有的程序使用ostringstream来进行普通类型与string类型的转换,还见过使用ostringstream进行协议组包,和sql语句拼接的)而言,性能损耗会比较大。我在换用snprintf后,性能有较大幅度的提升。