[英]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.