相关疑难解决方法(0)

确定整数平方根是否为整数的最快方法

我正在寻找最快的方法来确定一个long值是否是一个完美的正方形(即它的平方根是另一个整数):

  1. 我通过使用内置Math.sqrt() 函数以简单的方式完成了它,但我想知道是否有办法通过将自己限制为仅整数域来更快地完成它.
  2. 维护查找表是不切实际的(因为大约有2 31.5个整数,其平方小于2 63).

这是我现在正在做的非常简单直接的方式:

public final static boolean isPerfectSquare(long n)
{
  if (n < 0)
    return false;

  long tst = (long)(Math.sqrt(n) + 0.5);
  return tst*tst == n;
}
Run Code Online (Sandbox Code Playgroud)

注意:我在许多Project Euler问题中使用此函数.因此,没有其他人必须维护此代码.而这种微优化实际上可以产生影响,因为部分挑战是在不到一分钟的时间内完成每个算法,并且在某些问题中需要将此函数调用数百万次.


我尝试过不同的问题解决方案:

  • 经过详尽的测试后,我发现0.5不需要添加Math.sqrt()的结果,至少在我的机器上没有.
  • 快速逆平方根增快,但它给了不正确的结果对于n> = 410881.然而,所建议BobbyShaftoe,我们可以使用FISR劈对于n <410881.
  • 牛顿的方法慢了一点Math.sqrt().这可能是因为Math.sqrt()使用类似牛顿方法的东西,但在硬件中实现,因此它比Java快得多.此外,牛顿的方法仍然需要使用双打.
  • 一个修改过的牛顿方法,它使用了一些技巧,只涉及整数数学,需要一些黑客来避免溢出(我希望这个函数适用于所有正64位有符号整数),并且它仍然比它慢Math.sqrt().
  • 二进制斩甚至更慢.这是有道理的,因为二进制斩波平均需要16遍才能找到64位数的平方根.
  • 根据John的测试,or在C++中使用语句比使用语句更快switch,但在Java和C#中,or和之间似乎没有区别switch.
  • 我还尝试制作一个查找表(作为64个布尔值的私有静态数组).然后or我会说,而不是开关或声明if(lookup[(int)(n&0x3F)]) { test } else return false; …

java math optimization perfect-square

1403
推荐指数
22
解决办法
26万
查看次数

为什么我不能在String上使用switch语句?

这个功能是否会被放入以后的Java版本中?

有人可以解释为什么我不能这样做,就像Java的switch声明的技术方式一样吗?

java string switch-statement

982
推荐指数
8
解决办法
73万
查看次数

Java中if/else与switch语句的相对性能差异是什么?

担心我的网络应用程序的性能,我想知道哪个"if/else"或switch语句在性能方面更好?

java performance if-statement switch-statement

118
推荐指数
7
解决办法
10万
查看次数

切换案例顺序会影响速度吗?

我试过谷歌这个,但没有运气.

我有一个非常大的转变,有些情况显然比其他情况更常见.

因此,我想知道订单是否真的保持不变,"上"案例在"较低"之前进行测试,因此评估得更快.

我想保留我的订单,但如果它伤害速度,那么重新排序分支将是一个好主意.

例如:

switch (mark) {
        case Ion.NULL:
            return null;

        case Ion.BOOLEAN:
            return readBoolean();

        case Ion.BYTE:
            return readByte();

        case Ion.CHAR:
            return readChar();

        case Ion.SHORT:
            return readShort();

        case Ion.INT:
            return readInt();

        case Ion.LONG:
            return readLong();

        case Ion.FLOAT:
            return readFloat();

        case Ion.DOUBLE:
            return readDouble();

        case Ion.STRING:
            return readString();

        case Ion.BOOLEAN_ARRAY:
            return readBooleans();

        case Ion.BYTE_ARRAY:
            return readBytes();

        case Ion.CHAR_ARRAY:
            return readChars();

        case Ion.SHORT_ARRAY:
            return readShorts();

        case Ion.INT_ARRAY:
            return readInts();

        case Ion.LONG_ARRAY:
            return readLongs();

        case Ion.FLOAT_ARRAY:
            return readFloats(); …
Run Code Online (Sandbox Code Playgroud)

java switch-statement

80
推荐指数
1
解决办法
4987
查看次数

如何在JVM中查看JIT编译的代码?

有没有办法在JVM中看到JIT生成的本机代码?

java assembly jit jvm

77
推荐指数
5
解决办法
2万
查看次数

JVM的LookupSwitch和TableSwitch之间的区别?

我在Java字节码中理解LookUpSwitch和TableSwitch有些困难.

如果我理解得很好,LookUpSwitch和TableSwitch都对应于switchJava源代码的声明?为什么一个JAVA语句生成2个不同的字节码?

每个Jasmin文档:

java bytecode jasmin

59
推荐指数
3
解决办法
1万
查看次数

在箭头 (-&gt;) 的帮助下切换表达式,现在可以产生/返回值

Java 14 中扩展的 switch 表达式,除了程序员/审阅者的视觉清晰度之外,switch 表达式的需求并不明确。是吗

  1. 与旧的 switch 表达式不同的字节码实现?
  2. 与以前的版本相比,执行方面有任何性能改进吗?

参考: https: //www.techgeeknext.com/java/java14-features

JDK 14版本:

 int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};
Run Code Online (Sandbox Code Playgroud)

JDK 14 字节代码

   0: iconst_1
   1: istore_1
   2: iload_1
   3: tableswitch   { // 1 to 7
                 1: 44
                 2: 44
                 3: 44
                 4: 49
                 5: 54
                 6: 54
                 7: 59
           default: 64
      }
  44: bipush        6
  46: goto          65 …
Run Code Online (Sandbox Code Playgroud)

java performance switch-statement jvm-bytecode java-14

6
推荐指数
1
解决办法
2万
查看次数