java - 本地成员更快或实例成员

标签 java jvm

下面的代码证明method1比method2快。任何人都可以评论这种行为的原因是什么。

class Trial {
        String _member;
        void method1() {
            for(int i=0;i<30480;i++) {
                _member += "test";
            }
        }
        void method2() {
            String temp="";
            for(int i=0;i<30480;i++) {
                temp += "test";
            }
            _member = temp;
        }

        public static void main(String args[]) {
            Trial t = new Trial();
            long startTime1 = System.currentTimeMillis();
            t.method1();
            long endTime1 = System.currentTimeMillis();
            long startTime2 = System.currentTimeMillis();
            t.method2();
            long endTime2 = System.currentTimeMillis();
            System.out.println(endTime1 - startTime1);
            System.out.println(endTime2 - startTime2);
        }
    }

最佳答案

The following code proves that method1 is faster than method2

没有。它没有证明它。

这取决于很多因素。当我运行这段代码时,我得到了

1403
1248

所以在我的环境中,您的代码“证明”方法 1 比方法 2

进行基准测试时,您需要注意缓存和 JVM 预热等效果。

另见

获取更多信息。


我稍微重构了 main 方法:

...

static void doBenchmark() {
   Trial t = new Trial();

   long startTime1 = System.currentTimeMillis();
   t.method1();
   long endTime1 = System.currentTimeMillis();

   long startTime2 = System.currentTimeMillis();
   t.method2();
   long endTime2 = System.currentTimeMillis();

   System.out.println(endTime1 - startTime1);
   System.out.println(endTime2 - startTime2);
}

public static void main(String args[]) {

   for (int i = 0;  i < 20;  i++) {
      doBenchmark();
      System.out.println("----");
   }
}

这会导致 for 循环的first 迭代产生相似的值,但随后结果收敛并且不再有显着差异:

1396
1133
----
1052
1070
----
688
711
----
728
726
----
715
709
----
...

甚至,有时 method1 似乎更快,有时 method2 - 这很可能是由于测量不准确。

关于java - 本地成员更快或实例成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17162654/

相关文章:

java - C++ 类中 'this' 指针可以为空吗?

java - 如果 Java 应用程序出现内存泄漏,JVM 最终会耗尽内存并标记,对吗?

java - 舍入操作需要幂等性

java - 使用 Camel 过滤文件名时出现错误

c# - 在 Java 或 C# 中提高编程效率是一个神话吗?

java - 什么更快 : instanceof or isInstance?

java - Spring AOP 加载时编织是否需要 JVM 参数?

java - 在没有 RMI 或套接字的情况下如何让两个 JVM 进行通信?

java - JComboBox 不绘画

java - 使用 ObservableBoolean 或 Observable<Boolean> 组合两个可观察的 boolean 值