当前位置:首页 > 单片机 > 单片机
[导读] for(;;){void* buffer = malloc(SIZE);memset(buffer,SIZE);process(buffer)free buffer;}这是一位实习生(我曾带过10+位实习生,因此见多识广)的伪代码,原本这个SIZE很小,估计是存放URL用的,定义为512字节,后来

 for(;;)

{

void* buffer = malloc(SIZE);

memset(buffer,SIZE);

process(buffer)

free buffer;

}

这是一位实习生(我曾带过10+位实习生,因此见多识广)的伪代码,原本这个SIZE很小,估计是存放URL用的,定义为512字节,后来由于某种原因,扩大到了1M,从512字节扩大到了1M,速度变慢很多。为什么呢?这位同学无法解释,但我让他继续探索,找到真正的原因。

我让他从这样几个方面入手,

(1)首先分析一些主要花费时间的代码,结果发现是memset这一段从512到1M后耗费时间增多,而且增多并不是线性的,我让他先看一下glibc的memset源代码,如下:

#if defined _LIBC || defined STDC_HEADERS || defined USG

# include

# define flood memset

#else

static void flood (__ptr_t, int, __malloc_size_t);

static void

flood (ptr, val, size)

__ptr_t ptr;

int val;

__malloc_size_t size;

{

char *cp = ptr;

while (size--)

*cp++ = val;

}

#endif

由此可知memset是每字节每字节的赋值的,这并不是机器喜欢的方式,机器希望的是在4字节对齐的位置上进行操作(32位机器,64位机器喜欢8字节对齐),一次读取32位(4个字节)。因此memset完全可以自己实现一个一次性写4个字节的代码。

(2)接下来需要探索的是malloc,事实上linux内存分配有两种,brk,mmap,前者分配128k以内的内存,后者分配128k以上的内存,在改成1M后,

void* buffer = malloc(SIZE);

这一段是很快的,因为只是分配了虚存,并没有载入内存,可以查看/proc/pid/statm,考察内存分配,memset操作前后的变化。

而memset,就需要进行实际的内存分配,缺页中断,加载TLB等等。

而brk分配的内存是glibc管理的内存,分配很快,释放也方便(很多时候其实并不释放)。因此512字节是,使用的brk分配(效率很高),而变成1M后,使用mmap分配(加上memset的低效)因此效率要低很多。

(3) 这段代码如果改成,效果等价性能也会大幅度提升。

void* buffer = malloc(SIZE);

for(;;)

{

memset(buffer,SIZE);

process(buffer)

}

free buffer;

(4)最后需要质疑的是为什么需要开辟1M大小的空间,是否通过了验证,这样做是否有必要,实际情况是怎样的,memset是否需要,是否可以通过什么其他方法来避免这种计算。

由此可见,很多问题,不好的编码习惯,对机器理解的不够透彻是很难再一般的工作中发现,必须在大规模数据处理的实践场合(处理数据量足够大),才能体现出来,因此大规模数据处理技术是软件、硬件相结合的技术,而且不仅仅是技术上的问题还包括了业务上的问题,废代码,废计算应该去掉,不合理的计算应该变得合理。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

业内消息,近日在央视播出的《对话》・开年说节目上,百度创始人、董事长兼首席执行官李彦宏表示,以后不会存在“程序员”这种职业了,因为只要会说话,所有人都能具备程序员的能力。李彦宏认为,未来的编程语言只会剩下两种,一种叫做英...

关键字: 百度 李彦宏 程序员 AI

近日,某厂一名员工爆料称,由于Bug事故,公司要求他返还去年发放的年终奖,共计4万余元;如果逾期不还,将以每天万分之5的利息收取滞纳金,即每天20元左右;甚至公司HR还扬言,如果三个月内仍不还,就免费开除。

关键字: 程序员 互联网

近日某厂员工爆料,公司程序员因线上流量异常BUG事故,被公司进行处罚。处罚的结果是被要求将去年发的 4 万多年终奖归还给公司,否则就收取滞纳金并辞退,逾期将以每天万分之 5 的利息收取滞纳金。

关键字: 程序员 BUG 事故 年终奖 工程师

据昨天外媒报道,OpenAI首席执行官、Y Combinator前总裁山姆·奥特曼(Sam·Altman)结婚了,男友为前Meta程序员奥利弗·穆尔赫林(Oliver·Mulherin),婚礼在夏威夷举行,整个仪式非常低...

关键字: ChatGPT Meta 程序员 OpenAI 山姆·奥特曼

今后,鸿蒙和安卓应用将不再兼容。眼下,越来越多的互联网公司开始招聘鸿蒙开发相关的人才,以适应市场的变化和用户的需求。

关键字: 程序员 嵌入式

近日,一则“中国程序员在越南遭受残酷虐待”的新闻,引发了国内外的关注和震惊。

关键字: 程序员 互联网

近日,上海公安局普陀分局成功破获一起案件,并在程序员圈内引起了不小轰动。因为该案件涉及的金额高达1.5亿元,而这仅仅是在半年时间内的非法获利。要知道,这样的赚钱速度放在整个互联网界也都是相当炸裂的!

关键字: 代码 程序员

近日,一位清华大学应届硕士生在网上发布的帖子火了,引起了众多网友的“围观”热议。

关键字: 互联网 程序员

如果你被裁员后,公司又请你重返工作岗位,你会回去吗?

关键字: 马斯克 互联网 程序员

最近两周,虽然没发公众号文章,但是粉丝量还是在零星的在增长,多谢支持,原先每天发一篇的计划也没有坚持下来,果然被你们说准了。不得不佩服,你们比我都了解我自己。不过停更的两周,我也没有闲着,整了三个轮子出来,喜欢或者感兴趣...

关键字: 程序员 公众号 文章
关闭
关闭