android NDK 的效能研究

來源:互聯網
上載者:User
文章目錄
  • 本文轉載自 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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.