Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11941
  • 博文数量: 3
  • 博客积分: 88
  • 博客等级: 民兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-25 16:39
文章分类
文章存档

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后,性能有较大幅度的提升。

阅读(2989) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~