历史上的今天
返回首页

历史上的今天

今天是:2024年10月10日(星期四)

正在发生

2018年10月10日 | 关于程序效率的问题,你有思考过吗?

2018-10-10 来源:eefocus

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是否需要,是否可以通过什么其他方法来避免这种计算。


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


推荐阅读

史海拾趣

GE Solid State公司的发展小趣事
在搭建完成后,对电路进行调试和优化,确保声音信号能够准确反映曝光量的变化。
ARCOL公司的发展小趣事

ARCOL公司的创立,标志着电子行业中一颗新星的诞生。在公司成立之初,ARCOL就专注于电子元器件的研发和生产。凭借创始团队深厚的技术背景和敏锐的市场洞察力,公司成功开发出了一系列高质量的电子元器件产品,并很快在市场上赢得了良好的口碑。初步的成功为ARCOL公司的后续发展奠定了坚实的基础。

Advanced Milliwave Laboratories Inc公司的发展小趣事

随着技术的不断成熟和产品的不断优化,AML开始积极拓展市场。公司参与了多个国际电子展会,与全球各地的客户建立了联系。通过展示其独特的技术优势和高质量的产品,AML逐渐在微波技术领域建立了良好的品牌形象。同时,AML还加强了与合作伙伴的合作关系,共同开拓市场,实现互利共赢。

GETEDZ ( HVGT)公司的发展小趣事
根据电路的需要选择合适的接触器、继电器等电器元件,确保元件的性能和质量满足要求。
苏州锋驰(Feng)公司的发展小趣事
能够提供恒定的电流输出,确保负载器件在不同工作条件下得到稳定的电流供应。
Cyrustek公司的发展小趣事

Cyrustek公司自创立之初,就注重技术研发和创新。在电子行业的激烈竞争中,Cyrustek凭借其独特的芯片设计理念和先进的生产工艺,成功推出了一系列高性能、低功耗的芯片产品。这些产品不仅满足了市场对于高品质电子产品的需求,也帮助Cyrustek在市场上建立了良好的口碑。随着技术的不断进步和产品的不断升级,Cyrustek逐渐在电子行业中崭露头角。

问答坊 | AI 解惑

求助:单颗LED的电源驱动设计

我现在有一颗LED需要驱动,6.5V,20mA。 需要做一个驱动器,希望可以控制电流大小,不需要连续调节,只需要在0mA和20mA之间切换就行。怎么做最好? 电源有开关电源可以提高。…

查看全部问答>

How to select TVS

This is MicroNotes ,which writed by Kent Walters .Tell you how to select TVS.…

查看全部问答>

关于Protell99的前景

现阶段很多朋友,特别是刚出学校的都喜欢用Protell99,这款软件对于来讲自我感觉确实还不错,但是我有很多朋友并不看好它,认为其POWER PCB更为先进…

查看全部问答>

2808最小系统

这里有高手做过2808的最小系统吗?…

查看全部问答>

AD中两个元件相距太近时报错,怎么办?

AD中两个元件相距太近时报错,在哪里可以调节这个这个值啊(允许的最小间距)…

查看全部问答>

uclinux和linux是不是应用层接口一样的?

就是说是不是linux的应用层软件可以不改动直接移植到uclinux上?…

查看全部问答>

电机上电瞬间引起单片机复位的问题

驱动信号已经通过光耦隔离,复位电路是低电平复位,vcc接电阻,电容接地,是什么原因呢?…

查看全部问答>

串口 应答信号

我想设计一个通信协议,我的1号机发出握手信号后收不到2号机的应答信号,但是我把2号机和PC机的串口调试助手直接连接就能收到应答信号,为什么?大家帮我看看我的程序那里的问题好吗? void serial() interrupt 4 using 1     &nbs ...…

查看全部问答>

eeworld上可用分怎么计算的,回复一个贴子就有10分可用分?回复自己的贴子有没可用分?戴红花什么意思?奖牌表示什么?eeworld上游戏规则是什么?

eeworld上可用分怎么计算的,回复一个贴子就有10分可用分?回复自己的贴子有没可用分?戴红花什么意思?奖牌表示什么?eeworld上游戏规则是什么?…

查看全部问答>

[求助]用汇编实现辛普森积分

怎样用汇编语言实现辛普森数字积分? 下面是C程序,哪位能帮忙搞个汇编版本的?只要有辛普森函数那部分就可以 /*-------复化辛普森求积公式---------*/ #include #include #include #define N 100 /*-------将要被求积的函数------*/ doubl ...…

查看全部问答>