c++ - 检查一定范围内的公差是否相等的最快方法?

标签 c++ algorithm optimization comparison

以下函数比较两个数组,如果考虑到容差,所有元素都相等,则返回 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;
}

有没有办法超越这个函数的性能?

最佳答案

在循环外计算绝对值(公差)。

您可以尝试将循环展开为“主要”循环和“次要”循环,其中“次要”循环的唯一跳转是到其开头,“主要”循环具有“if”和“break”内容。做类似 ok &= (x[i]-y[i] < abstol) & (y[i]-x[i] < abstol); 的事情在小循环中以避免分支 - 注意 &而不是&& .

然后部分展开并矢量化小循环。然后专门针对您实际使用的任何浮点类型,并使用您平台的 SIMD 指令来执行小循环。

当然,在执行此操作之前请三思,因为它会增加代码大小,从而对可维护性产生不良影响,有时还会对系统其他部分的性能产生不良影响。

关于c++ - 检查一定范围内的公差是否相等的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13695996/

相关文章:

c - 二叉搜索树中节点的删除

MySQL,20 亿行数据,只读,性能优化?

c++ - 带有错误字符串的 NSIS 插件

c++ - 指针可以指向4GB之后的地址吗?

java - 在最短时间内找到不包括某些元素的数组的最大公约数(GCD)

algorithm - 高斯消除变换和征服算法的替代方案

Haskell 模块优化

c++ - 如何在结构中组织成员以在对齐时浪费最少的空间?

c++ - 在没有编译器警告的情况下移动常量对象

c++ - 围绕两个范围的幂循环变量