OpenCV mat元素访问速度差

时间:2016-05-04 19:12:16

标签: c++ performance opencv

我正在尝试以不同方式访问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%?性能不应该相同吗?

0 个答案:

没有答案