測試電腦編譯速度
項目越來越大,每次需要重新編譯整個項目都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。
1. 使用tmpfs來代替部分IO讀寫
2.ccache,可以將ccache的緩存文件設置在tmpfs上,但是這樣的話,每次開機後,ccache的緩存文件會丟失
3.distcc,多機器編譯
4.將屏幕輸出列印到內存文件或者/dev/null中,避免終端設備(慢速設備)拖慢速度。
tmpfs
有人說在Windows下用了RAMDisk把一個項目編譯時間從4.5小時減少到了5分鍾,也許這個數字是有點誇張了,不過粗想想,把文件放到內存上做編譯應該是比在磁碟上快多了吧,尤其如果編譯器需要生成很多臨時文件的話。
這個做法的實現成本最低,在Linux中,直接mount一個tmpfs就可以了。而且對所編譯的工程沒有任何要求,也不用改動編譯環境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel來測試一下編譯速度:
用物理磁碟:40分16秒
用tmpfs:39分56秒
呃……沒什麼變化。看來編譯慢很大程度上瓶頸並不在IO上面。但對於一個實際項目來說,編譯過程中可能還會有打包等IO密集的操作,所以只要可能,用tmpfs是有益無害的。當然對於大項目來說,你需要有足夠的內存才能負擔得起這個tmpfs的開銷。
make -j
既然IO不是瓶頸,那CPU就應該是一個影響編譯速度的重要因素了。
用make -j帶一個參數,可以把項目在進行並行編譯,比如在一台雙核的機器上,完全可以用make -j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用CPU資源。
還是用Kernel來測試:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看來,在多核CPU上,適當的進行並行編譯還是可以明顯提高編譯速度的。但並行的任務不宜太多,一般是以CPU的核心數目的兩倍為宜。
不過這個方案不是完全沒有cost的,如果項目的Makefile不規范,沒有正確的設置好依賴關系,並行編譯的結果就是編譯不能正常進行。如果依賴關系設置過於保守,則可能本身編譯的可並行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一個編譯器驅動器。第一趟編譯時ccache緩存了GCC的「-E」輸出、編譯選項以及.o文件到$HOME/.ccache。第二次編譯時盡量利用緩存,必要時更新緩存。所以即使"make clean; make"也能從中獲得好處。ccache是經過仔細編寫的,確保了與直接使用GCC獲得完全相同的輸出。
ccache用於把編譯的中間結果進行緩存,以便在再次編譯的時候可以節省時間。這對於玩Kernel來說實在是再好不過了,因為經常需要修改一些Kernel的代碼,然後再重新編譯,而這兩次編譯大部分東西可能都沒有發生變化。對於平時開發項目來說,也是一樣。為什麼不是直接用make所支持的增量編譯呢?還是因為現實中,因為Makefile的不規范,很可能這種「聰明」的方案根本不能正常工作,只有每次make clean再make才行。
安裝完ccache後,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,鏈到/usr/bin/ccache上。總之確認系統在調用gcc等命令時會調用到ccache就可以了(通常情況下/usr/local /bin會在PATH中排在/usr/bin前面)。
安裝的另外一種方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路徑加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
這樣每次啟動g++的時候都會啟動/usr/lib/ccache/bin/g++,而不會啟動/usr/bin/g++
效果跟使用命令行ccache g++效果一樣
這樣每次用戶登錄時,使用g++編譯器時會自動啟動ccache
繼續測試:
用ccache的第一次編譯(make -j4):23分38秒
用ccache的第二次編譯(make -j4):8分48秒
用ccache的第三次編譯(修改若干配置,make -j4):23分48秒
看來修改配置(我改了CPU類型...)對ccache的影響是很大的,因為基本頭文件發生變化後,就導致所有緩存數據都無效了,必須重頭來做。但如果只是修改一些.c文件的代碼,ccache的效果還是相當明顯的。而且使用ccache對項目沒有特別的依賴,布署成本很低,這在日常工作中很實用。
可以用ccache -s來查看cache的使用和命中情況:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,顯然只有第二編次譯時cache命中了,cache miss是第一次和第三次編譯帶來的。兩次cache佔用了81.7M的磁碟,還是完全可以接受的。
distcc
一台機器的能力有限,可以聯合多台電腦一起來編譯。這在公司的日常開發中也是可行的,因為可能每個開發人員都有自己的開發編譯環境,它們的編譯器版本一般是一致的,公司的網路也通常具有較好的性能。這時就是distcc大顯身手的時候了。
使用distcc,並不像想像中那樣要求每台電腦都具有完全一致的環境,它只要求源代碼可以用make -j並行編譯,並且參與分布式編譯的電腦系統中具有相同的編譯器。因為它的原理只是把預處理好的源文件分發到多台計算機上,預處理、編譯後的目標文件的鏈接和其它除編譯以外的工作仍然是在發起編譯的主控電腦上完成,所以只要求發起編譯的那台機器具備一套完整的編譯環境就可以了。
distcc安裝後,可以啟動一下它的服務:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默認的3632埠允許來自同一個網路的distcc連接。
然後設置一下DISTCC_HOSTS環境變數,設置可以參與編譯的機器列表。通常localhost也參與編譯,但如果可以參與編譯的機器很多,則可以把localhost從這個列表中去掉,這樣本機就完全只是進行預處理、分發和鏈接了,編譯都在別的機器上完成。因為機器很多時,localhost的處理負擔很重,所以它就不再「兼職」編譯了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然後與ccache類似把g++,gcc等常用的命令鏈接到/usr/bin/distcc上就可以了。
在make的時候,也必須用-j參數,一般是參數可以用所有參用編譯的計算機CPU內核總數的兩倍做為並行的任務數。
同樣測試一下:
一台雙核計算機,make -j4:23分16秒
兩台雙核計算機,make -j4:16分40秒
兩台雙核計算機,make -j8:15分49秒
跟最開始用一台雙核時的23分鍾相比,還是快了不少的。如果有更多的計算機加入,也可以得到更好的效果。
在編譯過程中可以用distccmon-text來查看編譯任務的分配情況。distcc也可以與ccache同時使用,通過設置一個環境變數就可以做到,非常方便。
總結一下:
tmpfs: 解決IO瓶頸,充分利用本機內存資源
make -j: 充分利用本機計算資源
distcc: 利用多台計算機資源
ccache: 減少重復編譯相同代碼的時間
這些工具的好處都在於布署的成本相對較低,綜合利用這些工具,就可以輕輕鬆鬆的節省相當可觀的時間。上面介紹的都是這些工具最基本的用法,更多的用法可以參考它們各自的man page。
5.還有提速方法是把屏幕輸出重定向到內存文件或/dev/null,因對終端設備(慢速設備)的阻塞寫操作也會拖慢速度。推薦內存文件,這樣發生錯誤時,能夠查看。
Ⅱ 如何優化 Android Studio 啟動,編譯和運行速度
首先你要找到原因,其原因分為兩大塊:
一、硬體方面:電腦硬體配置不高,這個是決定性的,決定了Android Studio的啟動,編譯和運行速度只能在一定區間內提升;
二、軟體方面:下載的Android Studio版本與你的電腦不能完美兼容運行。
解決辦法:
一、首先看電腦配置如何:可參考Android Studio官網中文版的介紹,鏈接(網路不予許發,你看圖吧):
四、加入以學習Android Studio為目的組建的的論壇、貼吧等進行查閱相關辦法,推薦首先去官網查詢;
五、最後提一個小建議,最好安裝到系統盤外的剩餘空間最大的盤,而且桌面不要放太多文件,尤其是大文件,這些很占內存,開機啟動項也清理一下,這樣會快很多,因為你問題描述系統了,我無法提供某個具體方法,所以具體的軟體方面的提速需你自己查閱。
Ⅲ 編譯一段代碼的速度和CPU的線程核心和代碼的速度有關嗎如果編譯一個QQ大小的代碼需要多長時間啊
1cpu的速度跟核心數量有關嗎?是否數量越多就越快呢?只有在同一家族的CPU中進行比較,核心數量、主頻與CPU的運行速度才有正比關系,還有影響的因素是2、3級緩存的大小。核心版本和工藝的升級也有影響。一般在同一家族的CPU中,核心越多、主頻越高、緩存越多、版本越新的CPU越快。比如AMDAthlonIIX2250肯定要比AMDAthlonIIX2240要快,但是不是也一定強於主頻、緩存、核心數都與X2240差不多的IntelPentiumE6300呢?那就不能武斷的說了。需要用各種測試軟體去驗證。2同核心數目,同主頻,同二級緩存哪個快?主板配cpu是看針腳和前端匯流排,和cpu的二級緩存無關,865的主板如果是478介面的,那就支持P42.8E和P43.2C,何況主板和cpu前端匯流排都是800mhz,完美支持兩個比當然是P43.2C好了,雖然P42.8e是1024的二級緩存,但核心是Prescott內核,和A的核心一樣,發熱量大,功耗高,而C的核心是NORTHWOOD核心,比Prescott好
Ⅳ 從 Webpack 到 Snowpack, 編譯速度提升十倍以上——TRPG Engine遷移小記
原文地址: http://moonrailgun.com/posts/74598ef5/
TRPG Engine 經過長久以來的迭代,項目已經顯得非常臃腫了。數分鍾的全量編譯, 每次按下保存都會觸發一次 10s 到 1m 不等的增量編譯讓我苦不堪言, 龐大的依賴使其每一次編譯都會涉及很多文件和很多包,長時的編譯時間大大降低了開發效率與迭代速度。
經過一段時間的考察,我選擇了 Snowpack 作為解決方案。與 Webpack 不同的是,除了第一次的全量編譯以外, Snowpack 的增量編譯不會涉及到龐大的 node_moles 文件夾, 准確來說只會編譯變更文件本身。甚至於如果沒有對依賴進行變更,下次的全量編譯會直接動用之前編譯的文件緩存,不需要花時間等待 node_moles 的編譯。
為什麼會這么快?這是由於 Snowpack 本身的實現與設計哲學有關的。相比 Webpack , Snowpack 利用了現代瀏覽器的本身的 mole 系統,跳過復雜的模型之間的組織編譯過程而只關注於變更文件本身的編譯,這樣當然快了。
拿 Snowpack 官方的一張圖來說:
snowpack 的最我譯單位是文件,而 webpack 的最我譯單位為 chunk , 而 chunk 還需要額外的計算, 不論是編譯部分還是編譯後的組裝部分。snowpack的設計邏輯天生決定了她的速度。
優化前(使用 webpack ):
全量編譯:
增量編譯:
全量請求用時:
優化後(使用 snowpack ):
全量編譯:
增量編譯:
(看不到編譯用時,但是體感在1s內. 而且該效果在電腦運行其他應用時更加顯著)
全量請求用時:
以上測試是保證電腦在空閑時間,且保存與操作內容為同一文件
該用時已經是平時操作的最快時間,為此我的MBR重啟了一次強制清空了swap空間, 實際表現會更加顯著
因為文件依賴於瀏覽器的耗時,而瀏覽器需要串列請求依賴,因此耗時會更加長
但實際使用中使用snowpack會更加優秀。因為其相比webpack會大大節約電腦資源。在webpack編譯時會佔用大量的電腦資源,會影響到其他操作
TRPG Engine 算是非常經典的 Webpack 應用了, 使用了各種Loader。光通用配置就有250+行,各種優化配置,各種 alias。等等長時間迭代積攢下來的配置,因此毫不意外的會遇到很多問題與坑。
以下是我遇到的問題與解決方案:
Snowpack雖然作為一個新興的打包工具,目前尚不是非常完善, 功能也沒有webpack這樣豐富與齊全。但是它的新的打包設計對於有一定規模的前端應用還是非常優秀的。能極大提升開發效率。不失為一種好的解決方案。當然最後輸出還是需要使用webpack對其進行一定的優化,畢竟原生的mole支持目前瀏覽器的支持度還沒有達到覆蓋一個理想的地步 https://caniuse.com/es6-mole
最後這是我最後提交的 pr
Ⅳ 全新i5電腦,運行米思齊,每次編譯速度極慢,求解
第一就是你電腦中的垃圾,啟動項,進程,緩存,注冊表,一定是很久沒有清理了,由於這些東西太多,造成系統C盤太庸腫,特別是啟動項載入太多,所以開機的時候,就自然慢了,處理方法:就是下載一個騰訊電腦管家,安裝以後,你可以利用它經常清理這些垃圾,啟動項,進程,緩存,注冊表,而且它是智能的不會出錯的,特別是清理啟動項.(啟動項除cftmon都可以不用)
第二就是,你可能下載的什麼東西都放在C盤,造成C盤太多東西,負載太重,你可以冊除一些文件,把他安裝到其它盤符,以後要養成安裝軟體,程序,不要動不動就默認,而是要選擇安裝在其它盤符。騰訊電腦管家-工具箱-系統盤瘦身或軟體搬家,讓C盤輕裝上陣.
第三就是,IP地址,因為很多電腦用的是貓和路由器,而它的電腦選擇的是自動尋找IP,所以開機的時候,它在等路由器分給他一個IP,所以就有一個時間的等待,所以就慢了