私は次の機能を持っています
double single_channel_add(int patch_top_left_row, int patch_top_left_col,
int image_hash_key,
Mat* preloaded_images,
int* random_values){
int first_pixel_row = patch_top_left_row + random_values[0];
int first_pixel_col = patch_top_left_col + random_values[1];
int second_pixel_row = patch_top_left_row + random_values[2];
int second_pixel_col = patch_top_left_col + random_values[3];
int channel = random_values[4];
Vec3b* first_pixel_bgr = preloaded_images[image_hash_key].ptr<Vec3b>(first_pixel_row, first_pixel_col);
Vec3b* second_pixel_bgr = preloaded_images[image_hash_key].ptr<Vec3b>(second_pixel_row, second_pixel_col);
return (*first_pixel_bgr)[channel] + (*second_pixel_bgr)[channel];
}
patch_top_left_row
これは、との値が異なる場合、約150万回呼び出されますpatch_top_left_col
。これは実行に約2秒かかります。first_pixel_rowなどの計算を引数ではなくハードコードされた数値に変更すると(以下に表示)、1秒未満で実行され、理由がわかりません。コンパイラはここで何か賢いことをしていますか(私はgccクロスコンパイラを使用しています)?
double single_channel_add(int patch_top_left_row, int patch_top_left_col,
int image_hash_key,
Mat* preloaded_images,
int* random_values){
int first_pixel_row = 5 + random_values[0];
int first_pixel_col = 6 + random_values[1];
int second_pixel_row = 8 + random_values[2];
int second_pixel_col = 10 + random_values[3];
int channel = random_values[4];
Vec3b* first_pixel_bgr = preloaded_images[image_hash_key].ptr<Vec3b>(first_pixel_row, first_pixel_col);
Vec3b* second_pixel_bgr = preloaded_images[image_hash_key].ptr<Vec3b>(second_pixel_row, second_pixel_col);
return (*first_pixel_bgr)[channel] + (*second_pixel_bgr)[channel];
}
編集:
引数を使用して関数の2つのバージョンからアセンブリを貼り付けました:定数 を使用してhttp://pastebin.com/tpCi8c0F:http://pastebin.com/bV0d7QH7
編集:
-O3でコンパイルした後、次のクロックティックと速度が得られます。
引数の使用:1990000ティックと1.99秒定数の使用:330000ティックと0.33秒
編集:-03コンパイルでargumenstを使用:http://pastebin.com/fW2HCnHc -03コンパイルで 定数を使用:http: //pastebin.com/FHs68Agi