반응형
랜덤 생성수를 이용한 통계시, 함수형 자바 이용하기 예제 입니다.
package kr.samdogs.study.func.pojo;
import java.util.IntSummaryStatistics;
import java.util.Random;
import java.util.SplittableRandom;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.IntUnaryOperator;
public class RandomNumber {
public static void main(String[] args) {
//랜덤하게 발생하는 숫자 * 2 통계
//공통
int elementsCount = 100_000_000;
IntUnaryOperator multiplyByTwo = in -> in * 2;
Random rnd = new Random();
//SplittableRandom rnd = new SplittableRandom();
//ThreadLocalRandom rnd = ThreadLocalRandom.current();
long start = System.currentTimeMillis();
//일반
IntSummaryStatistics loopStats = new IntSummaryStatistics();
for(int idx=0;idx < elementsCount;idx++) {
int value = rnd.nextInt();
int subResult = multiplyByTwo.applyAsInt(value);
int finalResult = multiplyByTwo.applyAsInt(subResult);
loopStats.accept(finalResult);
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
//순차 Intstream
IntSummaryStatistics seqStats = rnd.ints(elementsCount)
.map(multiplyByTwo)
.map(multiplyByTwo)
.summaryStatistics();
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
//병렬 Intstream
IntSummaryStatistics parallelStats = rnd.ints(elementsCount)
.parallel()
.map(multiplyByTwo)
.map(multiplyByTwo)
.summaryStatistics();
System.out.println(System.currentTimeMillis() - start);
}
}
결론은 병렬을 이용하더라도, 이용하는 함수를 잘 쓰지 않으면 쓰레드 때문에 더 느릴수도 있는점입니다.\
위의 예제도 Random 함수 생성시 java.util.Random 을 쓰면 병렬처리가 훠얼씬 느립니다~!
하지만, 놀라지 않고, 병렬로 Random 을 생성할수 있는 SplittableRandom 이나 ThreadLocalRandom 을 쓰면 일반 루핑보다 2~3배 빠르게 처리되는걸 확인할 수 있습니다!
반응형