Производительность Apache CollectionUtils

Я бродил, если кто-нибудь сделал тест на Apache CollectionUtils. В моем простом тесте:

List<Integer> ints = Arrays.asList(3, 4, 6, 7,8, 0,9,2, 5, 2,1, 35,11, 44, 5,1 ,2);
    long start = System.nanoTime();
    ArrayList<Integer> filtered = new ArrayList<Integer>(ints.size());
    for (Integer anInt : ints) {
        if (anInt > 10) {
            filtered.add(anInt);
        }
    }
    long end = System.nanoTime();
    System.out.println(filtered + " (" + (end - start) + ")");

    Predicate<Integer> predicate = new Predicate<Integer>() {
        @Override
        public boolean evaluate(Integer integer) {
            return integer > 10;
        }
    };
    start = System.nanoTime();
    filtered.clear();
    CollectionUtils.select(ints, predicate,filtered);
    end = System.nanoTime();
    System.out.println(filtered + " (" + (end - start) + ")");

Я получил следующие результаты:

[35, 11, 44] (127643)
[35, 11, 44] (3060230)

Я должен сказать, что я большой поклонник этой библиотеки, потому что она делает код чистым и тестируемым, но в настоящее время я работаю над чувствительным к производительности проектом, и я боюсь, что моя привязанность к этой библиотеке может повредить производительности.

Я знаю, что это действительно общий вопрос, но кто-нибудь использовал эту библиотеку для создания env? и заметил проблемы с производительностью?

2 ответа

Помимо запуска его несколько раз для проверки оптимизации JVM (я не знаю, учитывая тот факт, что Predicate может быть функциональным интерфейсом, JVM не может использовать новое ключевое слово bytecode invokedynamic введен в Java 7), я думаю, что вы полагаетесь на ошибку сразу после start:

start = System.nanoTime();
filtered.clear();
CollectionUtils.select(ints, predicate,filtered);
end = System.nanoTime();
System.out.println(filtered + " (" + (end - start) + ")");

Я не думаю, что вы должны оценивать время filtered.clear() это работает, если вы хотите проверить различия между CollectionUtils и простым старым foreach.

Что ж, вы в основном сравниваете накладные расходы при вызове метода со встроенным кодом, причем последний явно быстрее.

Пока вы не делаете что-то, что действительно бросает вызов вашему процессору, я был бы очень удивлен, если бы это стало причиной проблем с производительностью в вашем приложении.

Другие вопросы по тегам