繁体   English   中英

为什么以下两种方法之间存在性能差异?

[英]Why is there a performance difference between the following two methods?

在我在 leetcode 上提交了关于最大子数组问题的解决方案后,它说我的运行时间是 1 毫秒(超过了约 66% 的提交),然后我做了一些更改并重新提交。 这一次,运行时间为 0 毫秒(超过 ~100%)。 我不太明白是什么导致了时间的减少。 这里有两个版本。

原来的:

public int maxSubArray(int[] nums) {
        if (nums == null) return 0;
        if (nums.length == 1) return nums[0];

        int current_max = nums[0];
        int cur = 1;
        int max = current_max;

        while (cur < nums.length) {
            current_max = Math.max(nums[cur] + current_max, nums[cur]);
            if (current_max > max) {
                max = current_max;
            }
            cur++;
        }
        return max;
    }

更新:

public int maxSubArray(int[] nums) {
        if (nums == null) return 0;
        int l = nums.length;
        if (l == 1) return nums[0];

        int current_max = nums[0];
        int max = current_max;

        for (int i = 1; i < l; i++) {
            current_max = Math.max(nums[i] + current_max, nums[i]);
            if (current_max > max) {
                max = current_max;
            }
        }

        return max;
    }

我做的唯一两个改变是

  1. 将 while 循环更改为 for 循环 - 显然没有区别ref
  2. 将长度存储在单独的变量中 - 由于 Array 不计算长度,并且array.length仅从内部变量中获取,因此我在这里也看不到任何区别。

[编辑]

我同意。 leetcode 的性能并不是 100% 准确的。 有趣的是,前几天我再次提交了更新的代码,现在突然变成了 0ms。

第一的。 每次运行相同的代码,时间消耗并不完全相等

第二。 LeetCode 只是给你一个大概的消耗, MAYBE < 1ms 会返回 0ms

如果您想要更准确的时间考虑使用 jmh 进行测试

https://openjdk.java.net/projects/code-tools/jmh/

https://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

希望这可能会有所帮助


更新

如果您想比较两种方法之间的差异,只需将它们放在一个 class 和

javac filename.java

然后

javap -c classname

你会得到这两种方法的字节码,这些字节码是真正在 jvm 中执行的

参考:

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokespecial]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM