Java 8 스트림 성능과 기존 컬렉션
귀하께서는 최근 Java 8을 사용하여 Stream API의 성능을 클래식 컬렉션과 비교하는 비공식 벤치마크를 수행하셨습니다. 테스트에는 정수 목록 필터링, 짝수의 제곱근 추출 및 결과를 Double 목록에 저장하는 작업이 포함됩니다. 그러나 귀하는 테스트의 타당성에 의문을 제기하고 있으며 실제 성능에 미치는 영향을 명확히 하고 싶어합니다.
벤치마크 테스트 평가
스트림을 나타내는 초기 결과 컬렉션보다 속도가 느려 우려가 제기되었습니다. 보다 신뢰할 수 있는 평가를 위해서는 잠재적인 오류를 해결하고 공정한 테스트를 수행하는 것이 필수적입니다. 다음은 몇 가지 고려 사항입니다.
올바른 벤치마킹 결과
이러한 권장 사항에 따라 JMH 및 향상된 벤치마킹 전략을 사용한 성능 평가:
@OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) @OperationsPerInvocation(StreamVsVanilla.N) public class StreamVsVanilla { public static final int N = 10000; static List<Integer> sourceList = new ArrayList<>(); static { for (int i = 0; i < N; i++) { sourceList.add(i); } } @Benchmark public List<Double> vanilla() { List<Double> 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<Double> 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 벤치마크는 이 특정 시나리오에서 기존 수집 접근 방식이 스트림 접근 방식보다 훨씬 빠르다는 것을 분명히 보여줍니다.
결론
이러한 향상된 벤치마킹을 기반으로 합니다. 결과를 보면 다음과 같은 결론을 내릴 수 있습니다.
위 내용은 간단한 작업을 위해 스트림이 기존 컬렉션보다 항상 느린가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!