数学家高斯在小学的时候,老师要求从1+2+3开始一直加到100,得出的和是多少?其他同学都费劲地一个数一个数的加,只有小高斯注意到了这些数可以两两配对,相加和为101,所以想到一共有50对101,求和可以用乘法:50X101=5050 。
有没有感受到数学思维的强大?其实,编程中的代码优化,就与数学公式有着异曲同工之妙 。
小白与大神写同一个程序,小白跑200万条数据,需要8小时,而大神在进行代码优化后,只需要40分钟,效率提高了1200%!
要成为金字塔尖的程序员,不仅要关注程序能不能运行,更要关注程序的运行效率,在每一个字符,每一段语句下功夫,这就是代码调优 。为了帮助大家成为一个注重细节的程序员,来看看以下6大代码调优法则!
代码调优6大法则
空间换时间法则修改数据结构 。为了减少数据上的常见运算所需要的时间,我们通常可以在数据结构中增加额外的信息,或者修改数据结构中的信息使之更易访问 。
存储预先计算好的结果 。对于开销较大的函数,可以只计算一次,然后将计算结果存储起来以减少开销 。以后再需要该函数时,可以直接查表而不需要重新计算 。
高速缓存 。最经常访问的数据,其访问开销应该是最小的 。
懒惰求值 。除非需要,否则不对任何一项求值 。这一策略可以避免对不必要的项求值 。
时间换空间法则堆积 。密集存储表示可以通过增加存储和检索数据所需的时间来减少存储开销 。尽管堆积有时通过牺牲时间来获取空间,但是这种较小的表示方式处理起来通常更快 。
解释程序 。使用解释程序通常可以减少表示程序所需的空间,在解释程序中常见的操作序列以一种紧凑的方式表示 。
代码空间技术 。有时候空间的瓶颈不在于数据,而在于程序本身的规模 。在过去的艰苦年代,我见到的图形程序通篇都是类似下面的代码:
格式 1 ( 15px, 粗体, #3E3E3E )
for i = [17, 43] set(i, 68)
其中set(i, j)“点亮”屏幕位置(i, j)处的图形元素 。使用适当的函数,例如用于绘制水平线的hor函数和绘制垂直线的ver函数,就可以使用如下所示的代码替换上面的代码:
for i = [18, 42] set(i, 69)
for j = [81, 91] set(30, j)
for j = [82, 92] set(31, j)
hor(17, 43, 68)
上述代码又可以用一个解释程序来替换,这个解释程序从类似下面的数组中读取命令:
hor(18, 42, 69)
vert(81, 91, 30)
vert(82, 92, 31)
h 17 43 68
如果上面的代码仍然占用太多的空间,那么可以为命令(h、v或两个其他命令)分配两个位,并为后面的三个数(这些数是范围0~1023内的整数)各分配10个位 。于是,上面的每一行都可以用一个32位的字来表示(当然,这种转换应该由程序来进行) 。这种假设的情况揭示了用于节省代码空间的几种通用技术 。
h 18 42 69
v 81 91 30
v 82 92 31
函数定义 。通过用函数替换代码中的常见模式可以简化上述程序,相应地也就减少了它的空间需求,并增加了其清晰性 。这是一个“自底向上”设计的普通例子 。
尽管我们不能忽视自顶向下的方法,但是由良好的原始对象、组件和函数所给出的均一的视图可以使系统维护起来更加简单,同时也节省了空间 。微软删除了很少使用的函数,将它的整个Windows系统压缩为更加紧凑的Windows CE,使其能在具有更小内存的“移动计算平台”上运行 。
更小的用户界面(UI)在窄屏幕的小型机器(范围从嵌入式系统到掌上电脑)上运行得很好,熟悉的界面对用户来说非常方便 。更小的应用编程接口(API)使得系统对于Windows API程序员来说很熟悉(并且对于许多程序来说,即使不兼容,也非常接近) 。
- 50岁的人除了跑步快走 老年人的性功能如何维持
- 血氧仪|1380元血氧仪成本仅几十块是真的吗 如何看待血氧仪涨价
- 烤箱|如何用烤箱烤红薯 烤红薯注意事项
- 中医如何做到两者兼顾养生调理 阴虚和阳虚同时存在吃什么药
- 老大|老大就该让着弟弟妹妹吗 生二胎如何考虑大宝的感受
- 甲状腺疾病该如何治疗 艾灸图片高清图片大全
- 中医是如何治疗传染病的 八个偏方治好尿毒症
- 如何看一块石头里面有没有玉 怎么判断是玉还是石头
- 中医也无法根治糖尿病吗 糖尿病如何治疗哪种好用
- 菜板|菜板发霉怎么办 如何清洁砧板霉菌