java - 为什么这段包含多个 "or"语句的代码比在 Java 中使用查找表稍微快一些?

标签 java optimization

在查看我昨天提出的一个微优化问题 (here) 时,我发现了一些奇怪的事情:Java 中的 or 语句的运行速度稍微比在 boolean 数组中查找 boolean 值。

在我的测试中,对从 0 到 10 亿的 long 值运行以下算法,alg1 大约快 2%。 (我改变了算法测试的顺序,我得到了相同的结果)。我的问题是:为什么 alg1 更快?我原以为 alg2 会稍微快一些,因为它使用查找表,而 alg1 必须对 75% 的输入执行 4 次比较和 3 次或操作。

private final static boolean alg1(long n)
{
  int h = (int)(n & 0xF);
  if(h == 0 || h == 1 || h == 4 || h == 9)
  {
    long tst = (long)Math.sqrt(n);
    return tst*tst == n;
  }  
  return false;

}

private final static boolean[] lookup = new boolean[16];
static
{
  lookup[0] = lookup[1] = lookup[4] = lookup[9] = true;
}
private final static boolean alg2(long n)
{
  if(lookup[(int)(n & 0xF)])
  {
    long tst = (long)Math.sqrt(n);
    return tst*tst == n;
  }
  else
    return false;
}

如果您好奇的话,这段代码正在测试一个数字是否是一个完全平方数,并且利用了完全平方数必须以十六进制形式的 0、1、4 或 9 结尾的事实。

最佳答案

加载一些随机数据通常比一些非分支代码慢。

当然,这完全取决于处理器架构。您的第一个 if 语句可以用四个指令来实现。第二个可能需要空指针检查、边界检查以及加载和比较。此外,更多的代码意味着更多的编译时间,以及更多以某种方式阻碍优化的机会。

关于java - 为什么这段包含多个 "or"语句的代码比在 Java 中使用查找表稍微快一些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/299079/

相关文章:

java - Tomcat8 - 属性 "xssProtectionEnabled"没有为类型 "org.apache.catalina.filters.HttpHeaderSecurityFilter"的过滤器定义

java - 使用 XMLWorker 通过 iText ver 5 将 HTML 转换为 PDF 时丢失图像

c++ - 是否允许编译器优化堆内存分配?

c++ - 在 if else 链中使用 goto 有什么特别之处

java - 如何使用 Java Access Bridge 自动化 Java Applet?

java - 无法将oracle函数结果获取到java(ejb)中

托盘的 Java 外观不起作用

jquery - 如何测试图像是否已在缓存中?

c++ - 这会得到优化吗?

c# - 什么是/优化 C# 编译器 key ?