Почему между следующими двумя методами разница в производительности? - PullRequest
0 голосов
/ 28 мая 2020

После того, как я отправил свое решение проблемы максимального подмассива на 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 l oop на a для l oop - По-видимому, нет никакой разницы ref
  2. Сохраните длину в отдельной переменной - поскольку Array не вычисляет длину и array.length - это только выборка из внутренней переменной, здесь я тоже не вижу разницы.

[EDIT]

Согласен. leetcode работает не на 100%. Забавно, на днях я снова отправил свой обновленный код, и внезапно теперь он 0 мс.

1 Ответ

0 голосов
/ 01 июня 2020

Первый. Каждый раз, когда вы запускаете один и тот же код, время не полностью равно

секундам. LeetCode просто дает вам приблизительное потребление, МОЖЕТ <1 мс вернет 0 мс </p>

Если вы хотите более точное время, проверьте его с помощью 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/

Надеюсь, это может помочь


обновить

, если вы хотите сравнить разницу между два метода просто помещают их в один класс и

javac filename.java

, затем

javap -c classname

вы получите байт-код этих двух методов, эти байтовые коды - это то, что реально выполняется в jvm

ссылка:

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

...