Разница в производительности между проверкой CollectionUtils.isNotEmpty и проверкой на месте - PullRequest
0 голосов
/ 09 октября 2018

Недавно, когда я выполнял микропроцессор , я заметил, что метод CollectionUtils.isNotEmpty потребляет больше времени.Я думал, что это может быть опечатка или недосмотр со стороны меня.Я заменил код с проверкой на месте не является нулевым, а размер больше нуля.Это оказалось намного быстрее.

Я извлек исходный код метода CollectionUtils.isNotEmpty в свой код, и он тоже быстрее.

Чем вызвано это различие?

Примечание: я знаюМикро-бенчмарк не поможет во всей области оптимизации JVM.Я специально ставлю 100 раз в цикл, если он больше, чем JVM собирается оптимизировать.Проверен код в Windows и Linux и разница в производительности аналогична.

import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;

public class TestCollectionUtilsPerf {

public static void main(String[] args) {
    List<String> stringList = Arrays
            .asList(new String[] { "StringOne", "StringTwo", "StringThree", "StringFour", "StringFive" });

    long startTime = System.nanoTime();
    for (int i = 0; i < 100; i++) {
        if (stringList != null && stringList.size() != 0) {
            continue;
        }
    }

    System.out.format("Manual Inplace Check Time taken is : %d µs %n", (System.nanoTime() - startTime) / 1000);

    startTime = System.nanoTime();
    for (int i = 0; i < 100; i++) {
        if (CollectionUtils.isNotEmpty(stringList)) {
            continue;
        }
    }

    System.out.format("Collection Utils Time taken is     : %d µs %n", (System.nanoTime() - startTime) / 1000);

    startTime = System.nanoTime();
    for (int i = 0; i < 100; i++) {
        if (isNotEmpty(stringList)) {
            continue;
        }
    }

    System.out.format("Manual Method Check Time taken is  : %d µs %n", (System.nanoTime() - startTime) / 1000);

}

public static boolean isEmpty(final Collection<?> coll) {
    return coll == null || coll.isEmpty();
}

public static boolean isNotEmpty(final Collection<?> coll) {
    return !isEmpty(coll);
}

}

Вывод:

Время проверки на месте вручную: 61 мкс
Время сбора данных: 237193 мкс
Время проверки ручного метода: 66 мкс

1 Ответ

0 голосов
/ 09 октября 2018

Возможно, для загрузки класса или пакета jar потребовалось много времени. Вы можете попытаться вызвать CollectionUtils.isEmpty в самом начале.

public static void main(String[] args) {
    List<String> stringList = Arrays
            .asList(new String[] { "StringOne", "StringTwo", "StringThree", "StringFour", "StringFive" });
    //try it at the begging to load the class
    CollectionUtils.isEmpty(stringList);
    ......

}

и мой ответ

Manual Inplace Check Time taken is : 10 µs 
Collection Utils Time taken is     : 21 µs 
Manual Method Check Time taken is  : 25 µs 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...