【发布时间】:2012-12-04 04:15:45
【问题描述】:
以下函数比较两个数组,如果考虑到容差,所有元素都相等,则返回 true。
// Equal
template<typename Type>
bool eq(const unsigned int n, const Type* x, const Type* y, const Type tolerance)
{
bool ok = true;
for(unsigned int i = 0; i < n; ++i) {
if (std::abs(x[i]-y[i]) > std::abs(tolerance)) {
ok = false;
break;
}
}
return ok;
}
有没有办法超越这个功能的表现?
【问题讨论】:
-
它是否会导致您的程序出现速度问题?
-
至少,将
std::abs(tolerance)拉出循环。并不是说编译器已经不能为你做到这一点...... -
这种任务可以从战略性手动矢量化中受益匪浅。但我非常怀疑编译器是否能够在这里完成它,因为行程计数是未知的。
-
@Vincent 在这种情况下,您很可能需要为一些冷金属推测性手动矢量化牺牲模板。不过这并不容易。 :D
-
通过更好地了解特定用例可能会进行优化。例如,如果两个数组的最后一个对象几乎总是非常不同,但第一个对象几乎总是相同,那么以其他顺序进行比较可能是一种优化。如果值几乎总是完全相同,那么在减法之前检查相等性可能是一种避免大量减法和绝对值运算的优化。
标签: c++ algorithm optimization comparison