はコードです:奇妙な行動「CMP」命令ここ
#include <iostream>
#include <time.h>
using namespace std;
#define ARR_LENGTH 1000000
#define TEST_NUM 0
typedef unsigned int uint;
uint arr[ARR_LENGTH];
uint inc_time(uint x) {
uint y = 0, tm = clock();
for (uint i = 0; i < x; i++) y++;
return clock() - tm;
}
int main() {
uint div = 0, mod = 0, tm = 0, overall = 0, inc_tm;
srand(time(NULL));
for (uint i = 0; i < ARR_LENGTH; i++) arr[i] = (uint)rand() + 2;
tm = clock();
for (uint i = 0; i < ARR_LENGTH - 1; i++)
if (arr[i] % arr[i+1] != TEST_NUM) mod++;
overall = clock() - tm;
inc_tm = inc_time(mod);
cout << "mods - " << mod << endl;
cout << "Overall time - " << overall<< endl;
cout << " wasted on increment - " << inc_tm << endl;
cout << " wasted on condition - " << overall - inc_tm << endl << endl;
tm = clock();
for (uint i = 0; i < ARR_LENGTH - 1; i++)
if (arr[i]/arr[i+1] != TEST_NUM) div++;
overall = clock()-tm;
inc_tm = inc_time(div);
cout << "divs - " << div << endl;
cout << "Overall time - " << overall << endl;
cout << " wasted on increment - " << inc_tm << endl;
cout << " wasted on condition - " << overall - inc_tm << endl << endl;
return 0;
}
Visual Studioを使用している場合は、単に(解放しない)DEBUGでコンパイルモードで、あなたはGCCを使用している場合は無効に死んだよりコード除外(-fno-dce
)。そうしないとコードの一部が機能しません。
したがって、TEST_NUM定数をゼロ以外の値(たとえば5)に設定すると、モジュロと除算の両方が同時にほぼ同時に実行されますが、TEST_NUM
を0に設定すると、条件はより遅く実行されます(最大3回!)。どうして?ここで
は逆アセンブリリストである:0の場合disassembly listing image http://img213.imageshack.us/slideshow/webplayer.php?id=wp000076.jpg
test
命令が代わりにcmp X, 0
の使用されていますが、cmp X, 0
に(5の場合)cmp X, 5
にパッチを当てても、あなたはそれがないということがわかりますモジュロ演算に影響しますが、除算演算に影響します。
TEST_NUM
定数を変更している間に、操作の回数と時間がどのように変化しているか注意してください。
誰でもできる場合は、どうすればこのことが起こるのか説明してください。
ありがとうございます。
質問を編集してテストコードを含めることはできますか。私はリンクをたどる必要はありません! –
最適化を行わずにコンパイルしたときのパフォーマンスのテストにはあまり意味がありません。 – interjay
@OliCharlesworth私はコードをインクルードしましたが、独自の逆アセンブルリストを作成したくない場合はリンクをたどる必要があります(私の場合は紙の上にあります、ごめんなさい)。 – n0p