漫谈代码优化

编程

前言

最近阅读了计算机相关基础课程,对代码优化有一些见解。

代码优化三大方向

  • 运行时占用更少的存储空间
  • 程序执行时消耗更少的指令数
  • 尽可能的降低线程切换

接下来我对这三点加以解释

运行时占用更少的存储空间

这里所说的存储空间是:程序运行时,需要操作的数据占用的空间大小。

为了解释这个问题,我举个栗子

理发师的挎包

我去理发时,发现大多数的理发师在腰间夸一个包,放一些常用的理发工具,这样他在理发时,需要什么就先从挎包里看一下,如果有,那就直接拿出来用,如果没有,他就到柜台上面找一下。

计算机和理发师挺像的,相似点如下

  • 理发师 就是 CPU
  • 挎包 就是 缓存
  • 柜台 就是 内存
  • 顾客 就是 程序

如果我去理发,我的发型很简单,卡尺就行,理发师挎包里放一个电动理发器和剪刀就行。

如果陈妍希去理发,人家对自己的发型要求很高,理发师给陈妍希理发会使用很多工具。如果他的挎包很小,装不了很多工具,那么理发师在理发的时候,当需要的工具不在挎包里时,他就要跑去到柜台那。

假如你的经济条件有限,你只能去便宜的理发店,理发师的挎包不是很大,但是你想快点理完头发,那你会选择什么样的发型?

  • 复杂的发型,理发师会手忙脚乱,耽误时间。
  • 简单的发型,理发师游刃有余,很轻松的就能理完头发。

计算机中的解释

计算机执行程序时,为了提高执行速度,在cpu和内存之间设置了一个高速缓存,cpu和高速缓存之间的交互非常快。当程序运行时,会优先从缓存中获取数据,如果获取成功,他不会跑到内存里找。如果在缓存中获取失败,他就要到内存里找数据。

在这一点上,我们能做的就是在存储数据时,优先使用线性存储结构,因为这样的数据是一个挨着一个,如果将人来代替这些数据的的话,线性存储就是让些人站成一个队列,一个方阵,节约占地资源。

消耗更少的指令数

上学迟到

小强和小红都是在一个院子长大的,但是他们两个都不认识彼此,直到上了小学。小学和他们的家隔了一个小树林,小强比较懒,上学经常迟到,被老师罚站。

小红总是看到小强罚站,就课下问他:你家是不是在山沟里啊,天天上学都迟到。

小强说我家在某某院

小红:咦,咱们住一个院啊 ,你难道是爬过来了吗

小强:我每天需要绕个小树林,再说我也懒...

小红:明天我领你钻小树林去...

小红每天是穿过小树林上学的,自从小强知道了怎么穿小树林,他上学就不会绕个远道了,节省了时间,不再迟到。

类比计算机

  • 小强:cpu
  • 程序:上学的路程

要做到这一点,对大家要求比较高,我举几个简单的方法

  • 在使用高级集合框架时,如果这些集合框架的存储结构是线性结构,这些集合框架会随着数据量的增加,而调整大小。这个调整大小的过程比较消耗资源:先找到一个更大的内存空间,把老的数据移动到新的内存空间。这就需要我们在使用前预估需要存储的数据的数量,在使用这些集合框架时,明确的给它一个初始大小,这样可以尽可能的减少调整大小的次数,减少指令数。
  • 优先使用线性的数据结构。减少使用基于哈希的数据结构,比如hashMap,hashset,这些高级结构不仅占用空间,而且会增加指令数。比如hashmap,它提供的功能是根据一个key,将其对应的数据找到。支撑这样功能的实现避免不了使用更多的指令。

尽可能的降低线程切换

黄焖鸡米饭" title="黄焖鸡米饭">黄焖鸡米饭

有天小红和小兰一起去吃饭,到了山西刀削面,他们都点了黄焖鸡米饭,过了一会,小红的先上了,小兰就继续等,等小红快吃完了,小兰的才做好。小兰就很纳闷了,问老板原因,老板说,鸡块不够了,我们又进了鸡块,花了一点时间。

我们想象一下后厨里的情况。厨房里有一个厨师,他负责做黄焖鸡米饭,当他发现鸡块只剩一份的量时,就给老板说,让他再进点鸡块。厨师做完黄焖鸡米饭,又去做油泼面,他正在做油泼面的时候,老板把鸡块买回来了。等到他做完油泼面后,他才开始做黄焖鸡米饭。

线程切换就是厨师从做一个菜转换到做另外一个菜的行为。 厨师做完黄焖鸡,然后做油泼面,最后再做黄焖鸡。

本来厨师可以一次做两份黄焖鸡米饭,却因为鸡块不够,他只能先做一份,期间又要做一个油泼面。他好累啊。

那为了让厨师和顾客都满意,老板就要多备一点鸡块,争取不让厨师做同一种饭两次。 这就是降低线程切换

计算机中的线程切换

我们在使用计算机时,感觉计算机很聪明,它能同时运行很多程序,其实是计算机给你的一个错觉:计算机是定义了一个时间段,规定每个程序只能运行这么长时间,时间到了,就给下个程序运行。只是因为cpu现在的性能很高,做这些事情很快,我们就无感知了。

大部分的程序其实都能在这个时间段内完成。但是也有一些其他情况导致cpu放弃执行当前程序:需要的数据不可用。

出现数据不可用的情况

  • 这个数据正在被别人使用
  • 这个数据不能够被使用,已经过期或者失效
  • 这个数据已经没有了
  • 这个数据正在生产

为了降低线程切换,我们可以这样做

  • 尽可能使用自己私有的数据,不和其他人共享。
  • 如果必须使用共享数据,那么在写程序时,尽可能将所有需要的资源全部拿到手。
  • 如果你的程序特点是计算量比较大,那就避免使用多线程。尽管你认为你的程序很复杂,但是cpu根本不关心,它会把你程序当成屁给放了。因为cpu的计算速度已经非常快了,执行的你的程序就是瞬间。但如果你在程序里用到了多线程,那么cpu就不得不进行线程切换。线程切换消耗的cpu资源远远大于cpu执行你程序消耗的资源。

后记

基础很重要。

我记得一个四十多岁当上院士的数学家说,他小时候学数学,每个定理都要自己证明,并且他不怎么做题目。当你足够的了解基础知识,你就不会被误导,也有更多的时间往深处学习。

以上是 漫谈代码优化 的全部内容, 来源链接: utcz.com/z/511553.html

回到顶部