代码实验室: “隐藏“的性能 Killer

ctestcode<代码实验室>栏目的每个代码实验,都提供了源代码,
可以用本公众号的<C语言编码助手>导入,直接运行,进行实验,学习和验证。

图片

 

【memset性能陷进】

memset是大家常用的函数,而且一般的编程书籍都会告诫大家:申请内存后要初始化,防止使用未经初始化的内存导致不可预知的结果,所以我们一般都会按照如下方式编写代码:

 

    char data[SIZE];    memset(data,0,SIZE);

代码看起来很正常,但这里却隐藏着一个陷进:memset并未利用系统DMA特性,性能并不高!如果你的内存在1K左右,可能还察觉不到,但如果是1M,又是嵌入式系统,那性能影响就很明显了,我们来看实测数据  某ARM CPU gcc 4.1.2 上的表现

内存大小

重复次数

时间

1M

100

25ms

 

【“隐藏”的memset】

但这只是memset的第一个陷阱,还有更加隐蔽的第二个陷阱,而且这个陷阱你从代码上根本看不出和memset有什么关系!下面我们就来看这个“潜伏”的memset究竟是如何潜伏的。

代码很简单,就是在栈内存中申请缓冲区,然后再赋值:

 

char data[SIZE]={0};

这一行代码很简单,但就是这么一行简单的代码,却隐藏了一个陷阱:初始化的时候调用了memset。我们用<ltrace 程序名>工具来看看:

===============================代码========================int main(){   char data[1024 * 1024] = {0};}==============================ltrace 输出==================__libc_start_main(0x8048444, 1, 0xbff9b0a4, 0x80484b0, 0x80484a0 <unfinished ...>memset(0xbfe9afec, '/000', 1048576)                      = 0xbfe9afec+++ exited (status 236) +++

可能会有同学会说 gcc编译时加上 O2或者O3 优化参数,就不会隐含调用memset了. 想法很好,但实际运用中当把 buffer 传入函数指针的函数时。GCC就无法进行判断做出正确的优化。

大家可以下载源代码,进行实验。

3个case中,最后一个case没有对变量初始化,不占用CPU资源。

图片

总结:对于大内存数据的初始化,建议先分析数据的使用,如果确定必要,再对数据进行初始化操作。

代码实验室:"潜伏"的性能杀手 
代码下载, 复制到浏览器直接下载ctestcode.cn/test/0418_init_value.ctestcode

 

C语言编码助手又更新了,增加了<代码实验室>的功能

C语言编码助手下载地址 v1.33
win10 x64
版本下载
www.ctestcode.cn/ut_master_win10_x64.zip
linux x64
版本下载
www.ctestcode.cn/ut_master_linux_x64.zip

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值