OpenCV
forを使用してコンピューティング集中型アプリを実行しましたiOS
。もちろん遅かったです。しかし、それは私のPCプロトタイプよりも200倍遅いものでした。だから私はそれを最適化していました。最初の15秒から0.4秒の速度を得ることができました。私はすべてのものを見つけたのだろうか、そして他の人が共有したいと思うかもしれないものを見つけたのだろうか。私がしたこと:
double
OpenCV内の""データ型を""に置き換えましfloat
た。Doubleは64ビットで32ビットCPUはそれらを簡単に処理できないので、floatは私にある程度の速度を与えました。OpenCVはdoubleを非常に頻繁に使用します。-mpfu=neon
コンパイラオプションに「」を追加しました。副作用は、エミュレータコンパイラが機能しなくなり、ネイティブハードウェアでのみテストできるという新しい問題でした。90個の値のルックアップテーブルに置き換えられ
sin()
、実装されました。cos()
スピードアップはすごかった!これは、そのような最適化がスピードアップをもたらさないPCとはやや反対です。度で動作するコードがあり、この値はとのラジアンに変換されましsin()
たcos()
。このコードも削除されました。しかし、ルックアップテーブルがその役割を果たしました。有効
"thumb optimizations"
。いくつかのブログ投稿は正反対を推奨していますが、これは親指が通常物事を遅くするためarmv6
です。armv7
問題がなく、物事をより速く、より小さくします。親指の最適化を確実
-mfpu=neon
にし、最高の状態で機能し、クラッシュを引き起こさないようにするために、armv6ターゲットを完全に削除しました。私のコードはすべてコンパイルされてarmv7
おり、これもアプリストアの要件としてリストされています。これは、最小値iPhone
がになることを意味します3GS
。古いものを落としても大丈夫だと思います。とにかく古いものはCPUが遅く、CPUを集中的に使用するアプリは、古いデバイスにインストールするとユーザーエクスペリエンスが低下します。もちろん使用します
-O3 flag
"dead code"
OpenCVから削除しました。OpenCVを最適化するときに、プロジェクトに明らかに必要のないコードが表示されることがよくあります。たとえば、多くの場合"if()"
、ピクセルサイズが8ビットまたは32ビットであることを確認するための追加機能があり、8ビットのみが必要であることがわかっています。これにより、一部のコードが削除され、オプティマイザーがさらに何かを削除したり、定数に置き換えたりする機会が増えます。また、コードはキャッシュによりよく適合します。
他のトリックやアイデアはありますか?私にとって、親指を有効にし、三角法をルックアップに置き換えることは、ブーストメーカーであり、私を驚かせました。たぶん、アプリを飛ばすためにもっとやるべきことを知っていますか?