java循环什么更快?

3df52oht  于 2021-09-13  发布在  Java
关注(0)|答案(2)|浏览(337)

此问题已在此处找到答案

如何用java编写正确的微基准测试((11个答案)
30分钟前关门。
哪一个循环更快?
回路1

for(String key : myList) {
    int index = myList.indexOf(key)
    System.out.println(index)
}

环路2

int index;
for(String key : myList) {
    index = myList.indexOf(key)
    System.out.println(index)
}

谢谢你的帮助。我正在努力学习更多关于表演的知识。

jhiyze9q

jhiyze9q1#

你的问题很“有趣”,但好吧,这是你的答案:你需要检查字节码。
下面是方法1的字节码:

public method1()V
   L0
    LINENUMBER 10 L0
    ALOAD 0
    GETFIELD package/SomeClass.myList : Ljava/util/List;
    INVOKEINTERFACE java/util/List.iterator ()Ljava/util/Iterator; (itf)
    ASTORE 1
   L1
   FRAME APPEND [java/util/Iterator]
    ALOAD 1
    INVOKEINTERFACE java/util/Iterator.hasNext ()Z (itf)
    IFEQ L2
    ALOAD 1
    INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object; (itf)
    CHECKCAST java/lang/String
    ASTORE 2
   L3
    LINENUMBER 11 L3
    ALOAD 0
    GETFIELD package/SomeClass.myList : Ljava/util/List;
    ALOAD 2
    INVOKEINTERFACE java/util/List.indexOf (Ljava/lang/Object;)I (itf)
    ISTORE 3
   L4
    LINENUMBER 12 L4
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 3
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L5
    LINENUMBER 13 L5
    GOTO L1
   L2
    LINENUMBER 14 L2
   FRAME CHOP 1
    RETURN
   L6
    LOCALVARIABLE index I L4 L5 3
    LOCALVARIABLE key Ljava/lang/String; L3 L5 2
    LOCALVARIABLE this Lpackage/SomeClass; L0 L6 0
    MAXSTACK = 2
    MAXLOCALS = 4

下面是方法2的字节码:

public method2()V
   L0
    LINENUMBER 12 L0
    ALOAD 0
    GETFIELD package/SomeClass2.myList : Ljava/util/List;
    INVOKEINTERFACE java/util/List.iterator ()Ljava/util/Iterator; (itf)
    ASTORE 2
   L1
   FRAME APPEND [T java/util/Iterator]
    ALOAD 2
    INVOKEINTERFACE java/util/Iterator.hasNext ()Z (itf)
    IFEQ L2
    ALOAD 2
    INVOKEINTERFACE java/util/Iterator.next ()Ljava/lang/Object; (itf)
    CHECKCAST java/lang/String
    ASTORE 3
   L3
    LINENUMBER 13 L3
    ALOAD 0
    GETFIELD package/SomeClass2.myList : Ljava/util/List;
    ALOAD 3
    INVOKEINTERFACE java/util/List.indexOf (Ljava/lang/Object;)I (itf)
    ISTORE 1
   L4
    LINENUMBER 14 L4
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEVIRTUAL java/io/PrintStream.println (I)V
   L5
    LINENUMBER 15 L5
    GOTO L1
   L2
    LINENUMBER 16 L2
   FRAME CHOP 2
    RETURN
   L6
    LOCALVARIABLE key Ljava/lang/String; L3 L5 3
    LOCALVARIABLE index I L4 L2 1
    LOCALVARIABLE this Lpackage/SomeClass2; L0 L6 0
    MAXSTACK = 2
    MAXLOCALS = 4

如果您使用diff(例如diffchecker),您将看到字节码是相同的(由编译器优化)-性能也是一样的。
总之,正如@erwin bolwidt正确指出的,性能问题是在for循环中使用indexof方法,而不是声明局部变量。

67up9zun

67up9zun2#

您可以使用以下代码检查自己的密码:-

long time = System.getCurrentTimemills();

for(String key : myList) {
    int index = myList.indexOf(key)
    System.out.println(index)
}
System.out.println("Time Taken "+ time- System.getCurrentTimemills());

相关问题