2010-11-23 10 views
1

コードは次のようになります。 sum + = array [j] +配列[j + 1] +配列[j + 2] + ...配列[j + n]; タイミングを改善するためにブラケット内のj + nをどのように交換すればよいですか?配列計算の処理時間を改善する

+0

タイミングは?なぜ**? – pmg

+2

これは理論的なEECSクラスの練習か現実の質問ですか?タイミングを「最適化されていない命令カウント」として測定していますか?特定の命令セット(MIPS、x86、?)を想定していますか? – smci

答えて

3

なぜ

T* aj = &(array[j]); 
sum = aj[0] + aj[1] + ... 

+0

これはコードの外観を変えるだけです。タイミングには影響しません。 –

+0

+1 ...コンパイラはそれ自身でそれを行うべきです:-) – pmg

+0

@Graeme:それは本当にオプティマイザに依存します。組み込みコンパイラの中には、特に最適化にはあまり適していないものがあるため、実際には**いくつかのパフォーマンスが向上するかもしれません。 – Vlad

7

あなたはではありませんこれを行います。脳死コンパイラがなければ、これを最適化することができるはずです。あなたはマイクロ最適化のこのレベルをやろうとしている場合は

は、あなたのコンパイラが盲目的に正確に相当アセンブリコードにコードを変換することを想定しない、根本的なアセンブリコードを見て開始する必要があります。

あなたはまた、私は高い最適化レベルでgccから見た非常識なコードに基づいて、より良い率直に言っているあなたのコンパイラを書く人よりもあなたのターゲットプラットフォームの複雑さを理解するためにそう:-)

が必要になります

アルゴリズム選択などの大きな画像の最適化に集中すれば、通常は投資収益率が向上します。すでに実行している何かを最適化するにはポイントがありません:あなたは(あなたがまだの場合)行う必要があり、それは不採算だ場合はボトルネックがある(とのみ場所を確認するために、一度完成し、コードをプロファイルで何

十分に速い)。

これらのボトルネックに集中します。 測定、推測しないでください!

#include <stdio.h> int main(void) { int j, sum, array[50]; for (j = 0; j < 50; j++) array[j] = 999 - j * 2; j = 22; sum = array[j] + array[j+1] + array [j + 2] + array[j + 3]; return 0; } 

が、gccの最適化レベル3の下で、それはなった:一例として


、私は実際にも、次のコードを最適化する方法をお見せするつもりだったとなっ

main: 
    pushl %ebp   ; prolog 
    xorl %eax, %eax ; return value 
    movl %esp, %ebp ; epilog 1 
    popl %ebp   ; epilog 2 
    ret 

はい、そうです、スタックプロローグとエピローグコードと戻り値の設定です。計算は見通せません。 gccはどこの計算も使用されていないことを(正しい)把握しているため、それらを完全に無効にしています。


あなたがそれを使用すると、関連するコードが簡単になる:

movl 116(%esp), %eax 
addl 112(%esp), %eax 
addl 120(%esp), %eax 
addl 124(%esp), %eax 

、あなたは、ハード押されたよりも、はるかに最適化された取得すると思います。

+0

チャレンジに最適化が許可されていない – vincent

+0

Wooo、デッドコード除去。 'j + 1 ... j + n 'のものもループに入るはずです。 – nmichaels

+0

@vincent:あなたの質問にいくつかの文脈を追加すれば、役に立たない答えは得られません。 – nmichaels

0
int *aj 

aj = &(array[j]); 

が正しいこと、および合計は、あなたが、その後

aj = &(array[0]); 

がちょうど

をAJするために追加します聖霊降臨祭開始する場合それはdefenitlyあなたのコードを実行することになり

sum += *aj + *(aj+1) + *(aj+2) .... 

に等しく、

関連する問題