Java 7 сортировка "оптимизация" - PullRequest
25 голосов
/ 13 июля 2011

В Java6 и quicksort, и mergesort использовались в Arrays#sort, для примитивных и объектных массивов соответственно.В Java7 они оба изменились: DualPivotQuicksort и Timsort.

В источнике для новой быстрой сортировки в нескольких местах появляется следующий комментарий (например, строка 354):

 /*
  * Here and below we use "a[i] = b; i++;" instead
  * of "a[i++] = b;" due to performance issue.
  */

Как это влияет на производительность?Разве компилятор не сведет их к одному и тому же?

В более широком смысле, какова хорошая стратегия для самостоятельного исследования этого?Я могу запустить тесты, но мне больше интересно анализировать любые различия в скомпилированном коде.Однако я не знаю, какие инструменты использовать и т. Д.

Ответы [ 3 ]

7 голосов
/ 13 июля 2011

Это только ответ на общий вопрос.

Вы можете посмотреть на байт-код и попытаться понять различия. То есть Вы могли бы написать простой пример, используя a[i] = b; i++; и a[i++] = b; и посмотреть, в чем разница.

Самый простой способ показать байт-код - это программа javap (должна быть включена в ваш JDK). Скомпилируйте код с помощью javac SomeFile.java и запустите javap для кода: javap -c SomeFile (ключ -c указывает javap выводить байт-код для каждого метода в файле).

Если вы используете Eclipse, вы также можете попробовать этот .

5 голосов
/ 13 июля 2011

Я написал 2 метода test1 и test2 и добавил основную часть скомпилированного байтового кода (Java 1.6 на Snow Leopard) в качестве комментария:

    /*
     *     14  iload_1 [b]      -> load value from address 1 to sack
     *     15  iastore          -> store value from stack into int array
     *     16  iinc 3 1 [i]     -> int increment value of address 3
     *     19  iinc 3 1 [i]     -> int increment value of address 3
     */
    public void test1() {
        int b = 0;
        int a[] = new int[10];
        for (int i=0; i<10; i++) {
            a[i] = b; 
            i++;
        }
    }

    /*
     *     14  iinc 3 1 [i]     -> increment value of address 3
     *     17  iload_1 [b]      -> load value from address 1 to stack
     *     18  iastore          -> store value from stack into int array
     *     19  iinc 3 1 [i]     -> increment value of address 3 
     */
    public void test2() {
        int b = 0;
        int a[] = new int[10];
        for (int i=0; i<10; i++) {
            a[i++] = b;
        }
    }

Порядок действий inc отличается. Но сумма операций обоих методов test1 и test2 равны! Так что производительность байт-кодов тоже должна быть одинаковой.

1 голос
/ 13 июля 2011

Существует способ, позволяющий увидеть инструкции процессора , сгенерированные механизмом горячей точки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...