看不清的代码

   以前在学习的时候,老是想这一行代码的计算量是多少.得不到答案,只能自己记着,郁闷的是周围好像没有多少人在乎这些.比如,判断和相减,哪个更快一些.在最初写c的时候会遇到类似的取舍.

  那时候也没有多少实用,还徘徊在怎么用最少的代码量完成功能.其实应该考虑的是怎么用最少的计算量完成功能,不是写上去有多么少,是运行上去有多么少.

  后来去学汇编,也不能得到解决思路.千回路转下,看到深入理解计算机上的解释,稍有有点理解了.把CPU的各个单元和相互协作都了解了 一些,大概清楚代码运行起来的大概.这个理解的前提是懂得面向对象语言里一些存储知识,大体是程序运行时方法内的变量进入栈缓存,栈缓存里边一些变量指向堆缓存,堆缓存里的一些变量也指向堆缓存.第二前提,自己的路线是,懂得微机原理,包含一些基本单片机运作原理和汇编.这里边算是对堆有了明确的定位,而且也比较容易明白常量相对变量来说只是一个占位符,不是一个存储空间.占位符(lable)被直译成空间地址,变量的话是一个地址的存贮空间.有了两个前提的话,容易理解那本书.主要好在能感受到电子的移动,书中的画图,计算步骤在链式的方格里成波浪,就像流水一样走动,看上去像是时钟频率降低到次每小时.让人明白为什么会有计算频率,因为电子在电路中的移动速度不够块,移动完这一个计算线路需要时间,包括移位相加存储,经过的每个二极管都要有充电走通的过程.水流流过这些渠道一遍所需要的时间是有限制的.水流流过一遍到达最终的桶里就是一次特定线路的计算过程,是一个细微指令,时钟频率需要稍大于这个时间确保这个步骤的正确完成.

  接着一个芯片里边有很多这样的渠道和盛放一次结果的桶.打开闸门桶里的水会继续按照另一个步骤流向不同的地方或者流一遍再回来.这些渠道代表不同的功能,芯片会设计合适的功能划分.多核的芯片中不同的芯片会用相同的功能,也有不同的部分.有些内核负责加减法,有些负责乘除.

  这些都是很底层的事了.接着还有一些怎么加快代码速度,基本原则事把变量先存储到本地.比如堆上的先放到栈里,放到更接近计算的位置.

  真正做开发的时候就不考虑这些了.很久没做软件,重新进入软件工作的时候发现电脑的计算量比较庞大.一个程序能卡住速度的只有远程传输,计算根本不占用时间.这也明白了为什么会有那么多复杂的框架,为什么没有人讲究计算量.不会想着方法里重复使用的变量,就申请一个临时变量从对象中接过来,避免每次去堆里取.也不会想在循环开始前把循环会用到的变量取到本地.甚至直接在循环里用一些背后其实是另一个循环的单行语句来取值.唯一会考虑不去做的可能是不去在循环中做远程请求,即把远程数据一次请求过来再去循环.

  很多方法嵌套了,很多功能成了接口,拿过来别人写的程序包直接用.这个过程中会经过多少计算,没有再去估量.有些觉得写代码像是在对接口实现功能,感觉不到CPU在计算,可能稍微感觉到的是网络延迟,或者数据库后台太庞大查询数据产生的延迟.优化数据库还好一点,能稍微感受到一些久远的计算量限制,还是受读写的影响之后.

  学程序的时候比较傻,研究半天研究出来一个算法,想去优化每一行代码.也不懂CPU,不过知道自己代码怎样一步步执行,每个流程,每个变量的变化.以前是在编程,现在是在拼图,好像很难和编程有太多的关系.从整个程序上似乎还可以感受到一些计算量的存在.  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章