我正在尝试以不同方式访问OpenCV mat元素的性能。我在Ubuntu 14.04上使用gcc 4.9.3和-O3标志,并在主干中使用最新的OpenCV。
第一个是使用at。
cv::Mat test = cv::Mat(1000, 1000, CV_8UC1);
for (int n = 0; n < 1000; n++)
for (int i = 0; i < 1000; i++){
for (int j = 0; j < 1000; j++){
test.at<uchar>(i,j) = rand();
}
}
第二个是使用ptr。
cv::Mat test = cv::Mat(1000, 1000, CV_8UC1);
for (int n = 0; n < 1000; n++)
for (int i = 0; i < 1000; i++){
for (int j = 0; j < 1000; j++){
a.ptr<uchar>(i)[j] = rand();
}
}
第三个是使用带有中间变量的ptr。
cv::Mat test = cv::Mat(1000, 1000, CV_8UC1);
for (int n = 0; n < 1000; n++)
for (int i = 0; i < 1000; i++){
uchar* inter = test.ptr<uchar>(i);
for (int j = 0; j < 1000; j++){
inter[j] = rand();
}
}
第一个和第二个在10次尝试中平均给我5000ms,第三次在10次尝试中平均给我4800ms。
为什么第一个与第二个表演相同?第一个不应该因为额外的边界检查而变慢吗?
为什么第三个比第二个快4%?性能不应该相同吗?