我有一个在应用程序寿命中多次执行的函数。为了优化代码,哪种解决方案更好?
这是:

void foo() {
    static const cv::Mat zeroMat16 = cv::Mat::zeros(rows, cols, CV_16UC1);
    cv::Mat newMat = zeroMat16.clone();
    ...
}
比这更快:
void foo() {
    cv::Mat newMat = cv::Mat::zeros(rows, cols, CV_16UC1);
    ...
}
还是效率差不多?

最佳答案

clone 在实现中使用不带掩码的copyTo

inline Mat Mat::clone() const
{
  Mat m;
  copyTo(m);
  return m;
}
copyTo implementation-> memcpy

zeros implementation
->
makeExpr
->
MatExpr
然后将其从MatExpr转换为Mat MatExpr::operator Mat()
->
assign
调用m = Scalar(); Mat::operator=
->
memset

memcpy is only slighly slower than memset
(1 GB数据约0.2秒),
结果 zeros 略快于 copyTo

结论:
通过使用zeros而不是clone
  • 防止不必要的内存分配。
  • 性能略有提高。
  • 关于c++ - cv::Mat::clone()比分配cv::Mat::zeros()创建的矩阵更有效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64424885/

    10-11 22:40