看不清的代碼

   以前在學習的時候,老是想這一行代碼的計算量是多少.得不到答案,只能自己記着,鬱悶的是周圍好像沒有多少人在乎這些.比如,判斷和相減,哪個更快一些.在最初寫c的時候會遇到類似的取捨.

  那時候也沒有多少實用,還徘徊在怎麼用最少的代碼量完成功能.其實應該考慮的是怎麼用最少的計算量完成功能,不是寫上去有多麼少,是運行上去有多麼少.

  後來去學彙編,也不能得到解決思路.千迴路轉下,看到深入理解計算機上的解釋,稍有有點理解了.把CPU的各個單元和相互協作都瞭解了 一些,大概清楚代碼運行起來的大概.這個理解的前提是懂得面嚮對象語言裏一些存儲知識,大體是程序運行時方法內的變量進入棧緩存,棧緩存裏邊一些變量指向堆緩存,堆緩存裏的一些變量也指向堆緩存.第二前提,自己的路線是,懂得微機原理,包含一些基本單片機運作原理和彙編.這裏邊算是對堆有了明確的定位,而且也比較容易明白常量相對變量來說只是一個佔位符,不是一個存儲空間.佔位符(lable)被直譯成空間地址,變量的話是一個地址的存貯空間.有了兩個前提的話,容易理解那本書.主要好在能感受到電子的移動,書中的畫圖,計算步驟在鏈式的方格里成波浪,就像流水一樣走動,看上去像是時鐘頻率降低到次每小時.讓人明白爲什麼會有計算頻率,因爲電子在電路中的移動速度不夠塊,移動完這一個計算線路需要時間,包括移位相加存儲,經過的每個二極管都要有充電走通的過程.水流流過這些渠道一遍所需要的時間是有限制的.水流流過一遍到達最終的桶裏就是一次特定線路的計算過程,是一個細微指令,時鐘頻率需要稍大於這個時間確保這個步驟的正確完成.

  接着一個芯片裏邊有很多這樣的渠道和盛放一次結果的桶.打開閘門桶裏的水會繼續按照另一個步驟流向不同的地方或者流一遍再回來.這些渠道代表不同的功能,芯片會設計合適的功能劃分.多核的芯片中不同的芯片會用相同的功能,也有不同的部分.有些內核負責加減法,有些負責乘除.

  這些都是很底層的事了.接着還有一些怎麼加快代碼速度,基本原則事把變量先存儲到本地.比如堆上的先放到棧裏,放到更接近計算的位置.

  真正做開發的時候就不考慮這些了.很久沒做軟件,重新進入軟件工作的時候發現電腦的計算量比較龐大.一個程序能卡住速度的只有遠程傳輸,計算根本不佔用時間.這也明白了爲什麼會有那麼多複雜的框架,爲什麼沒有人講究計算量.不會想着方法裏重複使用的變量,就申請一個臨時變量從對象中接過來,避免每次去堆裏取.也不會想在循環開始前把循環會用到的變量取到本地.甚至直接在循環裏用一些背後其實是另一個循環的單行語句來取值.唯一會考慮不去做的可能是不去在循環中做遠程請求,即把遠程數據一次請求過來再去循環.

  很多方法嵌套了,很多功能成了接口,拿過來別人寫的程序包直接用.這個過程中會經過多少計算,沒有再去估量.有些覺得寫代碼像是在對接口實現功能,感覺不到CPU在計算,可能稍微感覺到的是網絡延遲,或者數據庫後臺太龐大查詢數據產生的延遲.優化數據庫還好一點,能稍微感受到一些久遠的計算量限制,還是受讀寫的影響之後.

  學程序的時候比較傻,研究半天研究出來一個算法,想去優化每一行代碼.也不懂CPU,不過知道自己代碼怎樣一步步執行,每個流程,每個變量的變化.以前是在編程,現在是在拼圖,好像很難和編程有太多的關係.從整個程序上似乎還可以感受到一些計算量的存在.  

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