我有一个在应用程序生命周期中执行多次的函数。为了优化代码,哪种方案更好?
这是:
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
(约 0.2 秒超过 1 GB 数据),
结果
zeros
比 copyTo
稍快。结论:
通过使用
zeros
而不是 clone
,关于c++ - cv::Mat::clone() 是否比分配由 cv::Mat::zeros() 创建的矩阵更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64424885/