«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Всегда ли потоки медленнее, чем традиционные коллекции для простых операций?

Всегда ли потоки медленнее, чем традиционные коллекции для простых операций?

Опубликовано 8 ноября 2024 г.
Просматривать:846

Are Streams Always Slower Than Traditional Collections for Simple Operations?

Производительность потока Java 8 по сравнению с. Традиционные коллекции

Недавно вы приступили к работе с Java 8 и провели неформальный тест, чтобы сравнить производительность ее Stream API с классическими коллекциями. Ваш тест включает в себя фильтрацию списка целых чисел, извлечение квадратного корня из четных чисел и сохранение результатов в двойном списке. Однако вы сомневаетесь в достоверности своего теста и хотите прояснить истинные последствия для производительности.

Оценка эталонного теста

Ваши первоначальные результаты, указывающие потоки быть медленнее, чем сборы, вызвало обеспокоенность. Чтобы обеспечить более надежную оценку, важно устранить потенциальные ошибки и провести объективное тестирование. Вот некоторые соображения:

  • Использование LinkedList: LinkedList не является оптимальным выбором для списка результатов, поскольку ему не хватает эффективного произвольного доступа. Вместо этого рассмотрите возможность использования ArrayList.
  • Методология сравнительного анализа: Ручное сравнительное тестирование может быть подвержено неточностям. Используйте систему сравнительного анализа, такую ​​​​как JMH (Java Microbenchmarking Harness), чтобы обеспечить более точные и надежные измерения.

Правильные результаты сравнительного анализа

Следуя этим рекомендациям, давайте вернемся к оценка производительности с использованием JMH и улучшенных стратегий сравнительного анализа:

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(StreamVsVanilla.N)
public class StreamVsVanilla {
    public static final int N = 10000;

    static List sourceList = new ArrayList();
    static {
        for (int i = 0; i  vanilla() {
        List result = new ArrayList(sourceList.size() / 2   1);
        for (Integer i : sourceList) {
            if (i % 2 == 0){
                result.add(Math.sqrt(i));
            }
        }
        return result;
    }

    @Benchmark
    public List stream() {
        return sourceList.stream()
                .filter(i -> i % 2 == 0)
                .map(Math::sqrt)
                .collect(Collectors.toCollection(
                    () -> new ArrayList(sourceList.size() / 2   1)));
    }
}

Результаты:

Benchmark                   Mode   Samples         Mean   Mean error    Units
StreamVsVanilla.stream      avgt        10       17.588        0.230    ns/op
StreamVsVanilla.vanilla     avgt        10       10.796        0.063    ns/op

Результаты

Вопреки первоначальным результатам, тест JMH ясно показывает, что традиционный подход к сбору данных значительно быстрее, чем потоковый подход в этом конкретном сценарии.

Вывод

Основываясь на этих улучшенных результатах сравнительного анализа, мы можем заключить, что:

  • Потоки не по своей сути медленнее, чем коллекции. Однако их накладные расходы могут перевесить преимущества в определенных случаях использования, таких как простые операции фильтрации и сопоставления.
  • Потоки предлагают значительные преимущества с точки зрения простоты кода и удобства сопровождения. Они упрощают конвейеры обработки данных и сокращают количество шаблонного кода.
  • Для путей кода, критичных к производительности, всегда рекомендуется провести тщательное тестирование и учесть конкретные требования вашего приложения.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3