Stream 병렬처리 성능 테스트

su dong·2023년 9월 8일
0

디렉토리 구조

build.gradel

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.15'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
    id "me.champeau.jmh" version "0.6.2"
}

group = 'javaStudy'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '11'
}

repositories {
    mavenCentral()
}

processJmhResources {
    duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

jmh{
    fork = 1
    warmupIterations =1
    iterations = 1
}

tasks.named('test') {
    useJUnitPlatform()
}

Sample.java

package javastudy;

import org.openjdk.jmh.annotations.*;

import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

@BenchmarkMode(Mode.AverageTime) // 벤치마크 대상 메서드를 실행하는 데 걸린 평균 시간 측정
@OutputTimeUnit(TimeUnit.MILLISECONDS) // 벤치마크 결과를 밀리초 단위로 출력
@Fork(value = 2,jvmArgs = {"-Xms4G","-Xmx4G"}) // 4Gb의 힙공간을 제공한 환경에서 두 번 벤치마크를 수행해 결과의 신뢰성 확보
public class Sample {
    @State(Scope.Thread)
    public static class MyState {
        public long value = 2000000000;

        @TearDown(Level.Invocation)
        public void tearDown() {
            System.gc();
        }
    }


    @Benchmark
    public long iterativeSum(MyState myState){
        long result = 0;
        for(long i = 1L; i<=myState.value; i++){
            result+=i;
        }
        return result;
    }

    @Benchmark
    public long sequentialSum(MyState myState){
        return Stream.iterate(1L, i-> i+1)
                .limit(myState.value)
                .reduce(0L, Long::sum);
    }

    @Benchmark
    public long parallelSum(MyState myState) {
        return Stream.iterate(1L, i -> i + 1)
                .limit(myState.value)
                .parallel() // 스트림을 병렬 스트림으로 변환
                .reduce(0L, Long::sum);
    }

}

측정 결과

Mystate.value가 십만일때 결과
Benchmark Mode Cnt Score Error Units
Sample.iterativeSum avgt 0.085 ms/op
Sample.parallelSum avgt 6.385 ms/op
Sample.sequentialSum avgt 1.858 ms/op

Mystate.value가 1억일때 결과
Benchmark Mode Cnt Score Error Units
Sample.iterativeSum avgt 33.714 ms/op
Sample.parallelSum avgt 3042.733 ms/op
Sample.sequentialSum avgt 748.608 ms/op

Mystate.value가 20억일때 결과
Benchmark Mode Cnt Score Error Units
Sample.iterativeSum avgt 627.162 ms/op
Sample.sequentialSum avgt 21997.140 ms/op

profile
사람들을 돕는 문제 해결사, 개발자 sudong입니다. 반갑습니다. tkddlsqkr21@gmail.com

0개의 댓글