经常有朋友在问这个事情,现在电脑的CPU、内存、显卡都非常强大了,编程还需要那么精雕细琢,去节省那一丁点的内存、提升一点点的速度,这有什么意义?
是否有意义,要看在什么场合下使用的程序以及哪一种用途的程序,多数情况下,这样精雕细琢还是很有意义的。
以下用实例说明:
例1、12306订票系统。
外观看起来不过是一个网页,但实际上它后台的支撑是非常复杂的。
这个系统,一年售出车票有30多亿张;网上售票比例超过了80%;互联网高峰日,售出车票达到了1282多万张;高峰时每秒售票超出1000张;网站高峰日访问量超过了1600亿次!
不用说,这种系统,每个用户的计算加快一毫秒,每个步骤节省几个字节内存,那么对于整个系统来讲都是天文数字的节省。
例2、视频播放软件。
众所周知,视频播放软件,其核心功能就是图像声音信号的编码和解码。以4k视频为例,其水平清晰度3840,垂直清晰度2160,宽高比16:9,总约830万像素,每个像素包括红绿蓝三种颜色,每种颜色有24位深度,一秒钟要处理三十幅画面,其计算处理的工作量之大可见一斑。处理视频软件大部分工作量都是重复的,因此每一个步骤提升哪怕是一毫秒、节省一点内存,也可以使整个系统更流畅。
当然了,对于单机使用的wps之类,其速度和内存占用并不是非常敏感,编程的时候可以放宽要求。而对于多用户端、大数据流量的软件来说,为了提高性能,还是应当精打细算。
我做开发,能用原生尽量用原生,能不用框架尽量不用,就是为了提升几毫秒,节省几kb内存,如果你不服,试试在35M主频,512字节内存的单片机上写一个web服务器试试,你会发现,除了c语言和汇编语言,什么PHP、Java、C#都是浮云,更不要说框架了,调试环境ESP8266+STC89C52,通过网页控制灯的亮灭,另外,也可以使用arduino直接操作ESP8266,无须51单片机也可以实现一样的功能。
这个要视运行环境而定。
我是做自动控制软件的,掌控定时节奏,是重要的工作。大的时间节拍以ms(毫秒)为单位,小的时间节拍为几十us(微秒),要求不一样。以下分别说明。
我们平常接触比较多的,是FUNUC,SIMENS以及国产华中、广数等大的数控设系统,以及众多小众的数控系统。
大公司的数控系统,在UI界面的XYUVZABC等轴的座标显示上,让人觉得很流畅,反应很快,每秒钟显示十几次一点问题没有。这主要是因为工控机的频率大幅提高了,显示RAM的刷新速度也大幅提高。
以前用486DX工控机,最大频率50MHZ;现在用intel I5,I7等工控机,双核四线程,随便就能达到2GHZ以上。内存由1MB到现在的8~16GB,以及可以扩充的的虚拟内存。
考虑到CPU频率,内存、显存大小及访问速度的大幅提升,一般的上位机程序开发,不用太在意增加几K程序大小、内存大小,不用在意几ms的时间,程序员总能找到很好的处理方法。
windows的最小可控制时间也就10ms,再小了系统工作该不正常了。这也从另一方面说明,节省几ms的程序执行时间,对于上位机没多大意义。
如果用发脉冲、方向的方式,控制电机速度,30us发送一次,电机带动目标系统走1um,那么,每分钟能达到2000mm的速度。
在这样的系统,每个周期的计算及自动控制时间只有30us,我们要尽可能地精简算法,最好用线性计算,使时间最少。
如果在每30us的运算中,大量使用对数、指数、cos/sin/tan/ctg等数学函数,无法满足速度的要求。
同样,对于只有64~128KB的单片机来说,几KB的空间是很宝贵的,不然就要选更贵的单片机。
对于实时性要求更高各系统之间的数据交换,一般要求小于ms级的交换频率,超过了,无法保证自动控制的实时性要求。
总结:对于上位机,CPU双核2GHZ,内存也随便能达到4GB及更多,是最低配置,几K的程序大小不是问题。至于几ms时间,可以通过合理的时间分配来解决。
对于下位机,几K程序大小、内存大小,几ms的时间周期,是非常珍贵的,特别是时序,写程序时必须计算好,以保证系统的工作节奏。
这个需要看场合。
程序设计中有空间换时间,也有时间换空间。当然设计得当,优化了流程,时间和空间都能兼得,简洁的代码一般往往空间占用少,并且运行速度快(指令少了)。
服务器场合,提升响应速度,能提高用户体验,节省内存能服务更多的用户。
嵌入式场合,提升响应速度,能提高用户体验,节省内存能实现更多的功能。
并且一般而言空间扩展比较容易,并且空间不用是浪费。所以实际应用中,往往是优先考虑速度,然后把内存空间尽量用满
以专业角度来思考,这是有必要的。不论业务与程序大小,优化好的代码省电省时间。在手机客户端和嵌入式设备中是有一定优势的,而在大量并发的服务器端其实也是有好处的。
或许在业务角度来看无所谓了,但如果系统中存在大量的这种优化可能,最终积累还是很可观的。
提问的估计是没真正编过程吧,对几毫秒估计不明白意味着啥。常见的通用锁优化为原子锁,为的就是那0.1微秒的性能提升,一个功能能提升几毫秒,维护底层的还不开心死。
程序员:我要为用户着想,让我的程序在低配置上也能流畅运行。要少用资源,这样用户可以在老配置上流畅运行很多东西。
大厂:你省下了1M?好的我多占用1G。啥?配置不够了?你买新电脑去啊,关我屁事,这配置就不配运行我。。。
不想优化代码,就加钱堆配置,但随着需求的不断增加,堆配置的钱会成为一笔天价,这时候要优化代码就更复杂了
之前在某rtos设备上移植我们的aisdk,这个系统有441k的RAM,cpu主屏200mHz,你说几kb的内存重不重要?
为啥现在电脑的性能提升了几十倍,干的活其实都差不多,大部分资源都被空耗了,软件个个做得巨大无比,干的活其实没多少还又卡又慢
看你的程序是干什的了,如果你的程序是大数据计算平台上跑的,需要运行在上万个节点,对上亿条数据进行聚合运算的话,那每次计算省的这几毫秒和几kb就是天壤之别
如果是顺手为之,怎么都值,如果要花点时间与精力,那值不值取决于应用场景。一般来说,以下几个场景是值得的:①实时性要求比较高的,这个场景下,几毫秒不是小数字了②服务端进程中高频次执行的操作,在进程的生命周期内,③进程运行于资源受限环境
还不是为了给客户省点钱,帮公司降成本,提高产品竞争力。毕竟程序员加班是免费的,而优化出来的性能和内存都是实打实的钱啊。
一秒内的并发需要优化。
抛开场景谈性能就是耍流氓
大部分程序没必要,但如果是高负载那当然是非常必要滴
这个问题,是要看你的程序是干什么的。如果一般的程序,完全没有必要,但在有些特殊情况下,就不同了。
我以前做过一个自动控制的程序,使用并口线的(现在计算机一般不配并口了),程序运行时,大部分时间是正常的,有时就出问题了。反复查代码,逻辑上没有问题。用一般的仪器反复调试,发出的控制信号也是对的。后来从一个大学里借来了一台仪器检查,发现下位机会定时发出信号,当与计算机发出的信号叠加时会发生问题。
发现问题就好解决了,就是优化程序,避免发生。顺便说一下,提升的是1/10毫秒级。
至于内存,说实话我不关心程序运行占用多少内存,但很多时候更关注的是我控制的内存,往往单位是字节(byte)甚至位(bit),kb是一个巨大的单位了。
这个简单 有客户愿意付费 就是有必要 嵌入式程序中比较常见
核心还是成本,从这方面考虑肯定错不了的
在产品开发上最傻逼的做法就是追求所谓的效率技术而不考虑实际需要
我就是做高性能计算的,程序7 x 24小时运行,怎么没意义呢?那么多吃运算时间、吃内存空间的运算程序,能快一点是一点,能省点内存就省点内存。
鄂公网安备 42068302000331号
温馨提示:本站所有内容均来自互联网,若有侵权请联系站长处理。联系邮箱:yangtata@vip.qq.com