当前位置:首页 > 单片机 > 单片机
[导读] 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是否需要,是否可以通过什么其他方法来避免这种计算。

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

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

7月20日消息,在东京举行的2025年AtCoder世界巡回赛总决赛(AWTF)中,来自波兰格丁尼亚的42岁程序员Psyho创造了历史,击败了OpenAI的定制AI模型,赢得了这场比赛。

关键字: AI 程序员

7月18日,一则“微信安卓安装包出现5处fxxk”的话题,迅速登上微博热搜,吸引了众多网友的热议和关注。

关键字: 代码 程序员

7月17日消息,据媒体报道,在AI领域动辄数十亿美元的交易中,以色列云计算巨头Wix以8000万美元现金收购单人初创公司Base44的故事,堪称一则快速致富的时代寓言。

关键字: AI 程序员

5月25日消息,近日,AI独角兽Builder.ai宣布破产,进入清算程序。

关键字: AI 程序员

在软件开发领域,程序员们常常面临着一个看似悖论的现象:即使他们拥有深厚的编程技能、丰富的项目经验和严谨的工作态度,也很难保证一次就写出完美无缺的代码。相反,代码中的Bug似乎总是如影随形,需要不断地调试、修改和完善。这一...

关键字: Bug 程序员

北京2024年11月27日 /美通社/ -- 11月26日,2024 英特尔新质生产力技术生态大会在成都举行。作为英特尔战略合作伙伴,软通动力及旗下机械革命受邀参会,Intel、智谱、机械革命三方联合发布了专为程序员设计...

关键字: CODE 程序员 英特尔 AI

长沙2024年10月28日 /美通社/ -- 在智能技术蓬勃发展的 2024 年,AI不仅重塑了软件开发的范式,更成为推动产业变革的核心动力。从传统编程向 AI 辅助编程的转变,从单一应用到智能应用生态的演进,再到大模型...

关键字: 程序员 AI 开源 开发者

北京2024年10月14日 /美通社/ -- 湘江之畔,代码为帆,技术精英,再赴盛会。"2024 长沙・中国 1024 程序员节"(https://1024.csdn.net/)即将来袭。自2020年...

关键字: 程序员 开源 开发者 模型

9月27日,一则关于“上交所P0事故直接宕机、连带着多家炒股软件也崩了”的消息在社交平台刷屏了。对于这次故障,不知道是不是又有程序员要背锅了……

关键字: 程序员 互联网

央视《今日说法》栏目近期报道了一名90后程序员通过开发非法视频搬运软件在不到一年的时间里获利超700万,最终获刑的案例。

关键字: 程序员 软件
关闭