我有以下功能
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
和具有不同的值patch_top_left_col
。这需要大约 2 秒的时间来运行,现在当我将 first_pixel_row 等的计算更改为不使用参数而是使用硬编码数字(如下所示)时,事情会在亚秒内运行,我不知道为什么。编译器在这里做一些聪明的事情吗(我正在使用 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];
}
编辑:
我已经使用参数从函数的两个版本粘贴了程序集:http: //pastebin.com/tpCi8c0F 使用常量: http: //pastebin.com/bV0d7QH7
编辑:
使用 -O3 编译后,我得到以下时钟滴答和速度:
使用参数:1990000 滴答和 1.99 秒使用常量:330000 滴答和 0.33 秒
编辑:使用带有-03编译的参数:http://pastebin.com/fW2HCnHc 使用带有-03编译的 常量:http: //pastebin.com/FHs68Agi