为什么大量相同的输入数据会降低性能?

问题描述

我有一些我一直在处理的代码,为了优化它,我一直试图通过测试不同类型的输入数据如何影响其性能来了解编译器的优化过程。我的代码的简化版本如下。

function foo(Pair[] pairsData) {
   for (Pair p : pairsData) {
      res.append(bar(p))
   }
}
    

function bar(Pair p) {
    double mindistance = Double.MAX_VALUE;
    double bestI = -1;
    for (int i = 0; i < 4; i++) {
        double d = p.x - p.y - i;
        if (d < mindistance) {
            mindistance = d;
            bestI = i;
        }
    }
    return bestI;
}

我预计如果pairsData中的所有对都相同,那么这将显着提高性能,因为编译器的分支预测器可以达到完美的成功率,因此不会出现分支预测错误,从而提高性能。但我发现,特别是对于少量数据(50-100 对),增加相同数据点百分比的影响可以忽略不计。我认为这可能是因为分支预测器无法使用如此少的数据进行优化,或者因为根本没有涉及足够的成本(仅两次更新)来使分支预测错误仅在几次迭代中产生重大影响。

然而,对于极大的数据大小(大约 100,000 对),性能似乎先提高然后恶化(当有 50% 的相同对时达到峰值)。这怎么可能,因为相同对的百分比肯定越高,分支错误预测越少,并且 mindistance 必须更新的次数越少?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...