본문 바로가기
IT/java

함수형 프로그래밍 with 자바 - 랜덤 생성수 통계(feat.ThreadLocalRandom)

by 가능성1g 2024. 6. 19.
반응형

랜덤 생성수를 이용한 통계시, 함수형 자바 이용하기 예제 입니다. 

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배 빠르게 처리되는걸 확인할 수 있습니다!

반응형