文章目錄
- 本文轉載自 http://blog.csdn.net/fangyuanseu/article/details/6875702
本文轉載自 http://blog.csdn.net/fangyuanseu/article/details/6875702
android NDK 學習
今天看到一篇來自韓國思密達的論文,沒什麼理論價值,但是對開發人員來講很有指導價值,這篇文章說的是android應用開發NDK的方法和用java的方法的效能方面的差距(採用相同的演算法),他們重點考察了這面幾個方面的效能影響:
1整數運算
2浮點數運算
3訪存效能
4 Allocate堆的演算法
文章的開始先講了幾個概念,android NDK和jni,我在這邊就略去不寫了。
實驗的環境:他們是在pc上面的android模擬器上面做的實驗,pc: AMD Athlon II X2 245 2.9GHz, 4.0GB memory 模擬器:Android 2.1 (APIlevel 7) with the Android NDK R3 version
1 整數運算
實驗方法:測量尋找素數的演算法的時間,這個演算法返回的值是輸入n個整數中的素數。
實驗結果:
中x軸是表示輸入的整數的個數,y軸表示的是演算法執行的時間(單位:ms)
從上面的這個圖可以看出,使用NDK的方法比使用java的方法(在dalvik上面運行)效率要高不少,而且輸入的資料越多兩者這間的差距越大。
2 浮點運算:
實驗方法:包含math.h這個標頭檔,然後用正弦和餘弦函數來計算浮點數的演算法,這個演算法的傳回值是從零度到輸入角度的餘弦和正弦值的和。
實驗結果:
X軸表示輸入的角度,y軸表示對是演算法執行的時間(單位:ms)
實驗結果表明浮點數的差距不是太大。
3 訪存演算法
實驗方法:在堆記憶體中,用冒泡排序的最壞情況,時間複雜度是O(n2)。
實驗結果:
x軸表示輸入的整數數組的長度,y軸表示的是演算法執行的時間(單位:ms)。
這個實驗表明,兩者在堆記憶體訪問上面的差距巨大。
4 堆記憶體申請演算法
實驗方法:計算申請一塊4K倍數的堆記憶體的時間。
實驗結果:
X軸表示4k大小的倍數,y軸表示的是申請的消耗的時間(單位:ms)。
實驗結果表明,NDK的方法明顯要快很多。
一般來說,堆記憶體在java語言中用在建立對象的時候,在C/C++中用在動態記憶體申請。
動態申請記憶體是為了避免記憶體浪費,相比於靜態申請而言,動態申請記憶體要慢,而且有記憶體泄露的和記憶體耗盡的危險。
雖然動態申請記憶體要快的多但是作為C/C++開發人員要謹慎使用。
總結:
通過四個方面對使用android NDK和使用java效能方面的影響做一個定量的分析,這對於開發人員來講有很大的借鑒意義,在開發的時候我們可以根據上面的資料來確定什麼時候使用NDK什麼時候使用java,但是在考慮如何取捨時候一定要考慮NDK的方法使得代碼的複雜度提高這一事實。
對我個人的意義在於,可以使用ndk的方法來提高android上面3d圖形渲染的效能,因為一個稍微複雜點的3d曲面就有相當多的vertex和index。