簡體   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