2014-09-03 73 views
2

我一直在尋找解決方案至少2天沒有成功,所以作爲我最後的希望,我決定在這裏問它。Android NDK vs iOS - 性能問題

在這裏,我們有一個使用OpenCV的C++代碼庫,我們想要在iOS和Android上運行。事實證明,整個事情在Android上運行速度較慢,我找不到原因。分析後,我們知道調用C++代碼的方法是兩個平臺上完全相同的問題。在Android(三星Galaxy S4)上,需要140-150毫秒才能在iOS(iPhone 5)上執行,而在70毫秒以下。 我讀過一些關於優化本機代碼和使用不同local_cflags的文章,但似乎沒有幫助。

這是需要承認的事實還是有解決方案? 預先感謝您,麥克

+0

這是兩個不同的CPU。性能差異並不大,而高端品牌則更快。我看起來並不奇怪。請注意,Android手機會更慢;一些中國淘汰品可能會慢10倍。 – MSalters 2014-09-03 10:18:39

+0

確實如此,但Galaxy S4在規格上擁有更好的CPU。看起來沒關係。 – arrafutott 2014-09-03 10:30:28

+1

確保你使用armeabi-v7a版本,不僅是一個普通的armeabi版本。普通的armeabi版本不使用FPU,因此如果代碼使用大量的浮動,性能方面的表現會非常有限。 (對於整數運算,差異不應該太大。) – mstorsjo 2014-09-03 10:59:25

回答

3

您的經驗與我的關係很好。在(在我的案件中的Nexus 4)使用OpenCV的iOS和Android上我的經驗:

  1. Android是一般速度較慢,如果你只使用單線程代碼。 Apple CPU核心比我在Android手機上測試過的任何核心都快(請參閱在線提供的許多手機評論),而最新的Android手機擁有4個或更多核心。在iOS上,OpenCV使用GCD並行運行一些算法,但在Android上它不使用OpenMP(這是替代方法,但只適用於GCC 4.x,而不是Clang)。可悲的是,在主線程之外使用OpenMP是一種痛苦。 This bug仍然存在於NDK的r10中,因此無論是使用補丁重新編譯工具鏈,還是卡在主線程中,這對於大量計算來說都不是最佳選擇。

  2. Android上的OpenCV默認使用Thumb指令進行編譯,而Thumb指令較慢。我建議重新編譯設置ARM模式ON和NEON。

  3. Autovectorization標誌。如果您在NDK上使用GCC,則必須使用-O3,再加上-funsafe-math-optimizations以啓用NEON的自動矢量化。

  4. 限制CPU頻率。我的Nexus 4似乎比iOS更熱情地節制CPU頻率。我們已經看到在iOS上非常穩定的時間運行Android代碼的時間大幅度變化,我們能想到的唯一原因是CPU頻率。 Renderscript(請參閱this answer)最大化CPU頻率,但電池壽命將受損(並且您必須重寫代碼)。

+1

某些原始設備製造商(例如Qualcomm)對於CPU節流問題非常積極。在測試運行時,您可以通過不斷在屏幕上拖動手指來判斷是否存在問題 - 該算法的一部分就是在檢測到觸摸更新時保持高時鐘,以便設備在交互時感覺響應。它也可能值得研究在r9b中發生的硬性浮動更改(http://stackoverflow.com/questions/3004915/getting-hardware-floating-point-with-android-ndk),儘管我懷疑它會得到你超過10%左右。 – fadden 2014-09-03 15:24:15

+0

我在幾個網站上看過霓虹燈,他們說使用不同的cflags,但它似乎沒有工作。我錯過了什麼嗎?我是否必須更改我的代碼才能獲得霓虹燈的提升? 我忘了寫C++代碼使用4個線程,所以1)可能沒有幫助。 2)和3)帶回了希望,雖然我已經添加了-O3標誌。 所以問題是霓虹燈是如何工作的? – arrafutott 2014-09-04 08:58:37

+0

特別是在不知道代碼的情況下,很難說出爲什麼代碼更慢。你有沒有做過任何分析?哪部分最慢? NEON相當於x86機器上的SSE/AVX。這意味着如果編譯器沒有爲你編碼你的代碼,你必須自己做,或者使用一個已經有NEON實現的庫。 – user1906 2014-09-05 00:27:37