[英]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;
}
我做的唯一两个改变是
array.length
仅从内部变量中获取,因此我在这里也看不到任何区别。[编辑]
我同意。 leetcode 的性能并不是 100% 准确的。 有趣的是,前几天我再次提交了更新的代码,现在突然变成了 0ms。
第一的。 每次运行相同的代码,时间消耗并不完全相等
第二。 LeetCode 只是给你一个大概的消耗, MAYBE < 1ms 会返回 0ms
如果您想要更准确的时间考虑使用 jmh 进行测试
https://openjdk.java.net/projects/code-tools/jmh/
希望这可能会有所帮助
更新
如果您想比较两种方法之间的差异,只需将它们放在一个 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.