2011-03-25 18 views
1

私はXcode4と公式のSDKを使用してiPhone用の重い画像処理アルゴリズムを書いています。私は自分のコードでは、常に符号なしchar xのための正方形を何度も計算する必要があります。だから、それはより速く、私はテーブルに宣言作るために:x * xとtable_of_sqr [x]との差はありませんか?

int table[255] = {0, 1, 4, 9,... }; 

、代わりの

int sqr = x * x; 

を私はプロファイリングだとき、私は、

int sqr = table[ABS(x)]; 

残念ながらそのテーブルから値を取得していますiPhoneのシミュレータの私のアプリでは、この1行(テーブルからの価値を得る)がアプリの実行時間の50%以上を占めるため、いつでもsqrを計算するのに比べて大きな改善はありません。私は間違っているの?はるかに速くなければなりませんが、私は間違っている可能性があります。私はこのプログラミング環境の初心者です。

+0

すべての平方根を四角で置き換えました。 – paxdiablo

答えて

4

まず、平方根を計算しているわけではありません。正方形を計算するだけで、はるかに安価な操作です。第2に、コンパイラーがキャッシングや定数の伝達に巧妙でない場合、メモリルックアップは通常、二乗演算よりも高価です。

なぜその行を元に最適化することを選択しましたか?あなたはそれを十分に効率的に/速く実行していないという古い方法をプロファイルし決定しましたか?

+0

はい、前に言ったように、私は四角形を計算しています。これは私が計算しようとしているものの一例に過ぎません。私のコードでは、-765と765の間のxについて、s =(x/3)*^2という少し複雑な方程式を計算しています。何度もやらなければならないのですが、プロファイラではこれには時間がかかります実行する。だから、0と765の間のxの事前計算値を持つテーブルを宣言することにしました。 – Darrarski

0

これはおそらく高速ではありません。ほとんどのCPUは、整数を掛けるための1サイクル操作を持っています。アレイ参照とは、はるかに低速なメモリアクセスを必要とする操作を意味します。

+0

現在、私の変更により、この式の実行時間は約5%短縮されます。しかし、これは大きな改善ではありません。私は多くの本を読んで、stackoverflow上でさえも、事前に計算された値を持つテーブルを用意することは、 "SQRT"をより速くするための良い解決策です。 – Darrarski

0

XcodeはAsmを表示できます。生成されたアセンブリ言語コードを見ると、absとインデックス付きの配列アクセスには単純な乗算よりもARM命令がいくつか必要です。

+0

残念ながら、私はアセンブラコードを読んだり、リバースエンジニアリングするのには良いことではありません。しかし、私はすでにABS()命令をif((x >> 31)== -0x01){... -1 * x ...} else {... x ...}に置き換えました。 – Darrarski

関連する問題