티스토리 뷰

long start = System.nanoTime();

int processorCount = Runtime.getRuntime().abailableProcessors();

LongAdder adder = new LongAdder();


try{

ExecutorService es = Executors.newCachedThreadPool();

//processorCount 는 8이라고 가정한다.

for(int i=0; i<processorCount; i++){

es.submit(()->{

for(long j=0; j<1000000; j++)

adder.add(j);

});

}

}catch(Throwable e){}


long end = System.nanoTime();

System.out.println(end-start+"나노초");


위 코드는 병렬 연산이고,


long start = System.nanoTime();

long number = 0;


for(long j=0; j<8000000; j++)

number+=j;


long end = System.nanoTime();

System.out.println(end-start+"나노초");


이 코드는 일반 연산이다.


이 연산은 각각 루프를 돌며 인덱스를 number와 더한 값을 누적시킨다.

병렬연산은 프로세서의 수를 구해 그 수만큼 스레드풀에 연산을 올려 수행시킨다.


각 코드마다 연산횟수를 바꿔가며 차이를 보도록 하겠다.


Runtime의 availableProcessors() 메소드로 가져오는 프로세서의 수는 8개로 가정하겠다.



 연산종류  / 연산회수

 8백만

8천만

8억 

 병렬연산

 38,501,774

40,381,417 

51,231,998 

 일반연산

5,838,070 

39,745,722 

378,453,384 

단위 : 나노초

위의 결과는 여러번 돌려본 결과 평균치로 보이는 값을 쓴 것이다.



세가지 케이스로 나누어 연산을 진행해 보았다.


8백만번의 연산을 할 때에는 일반연산이 약 7배 빨랐다.

8천만번의 연산을 할 때에는 둘이 속도가 비슷했다.

8억번의 연산을 할 때에는 병렬연산의 속도가 약 7.5배정도 빨랐다.


즉 많은 연산을 할수록(연산의 복잡도가 높을수록) 병렬연산의 효율성이 증가했다.


그렇다면 적은 양의 연산을 할 때에는 왜 병렬연산이 느린 것일까?

이것을 알아보기 위해 연산을 빼버리고 쓰레드를 올리는 시간만 측정해보았다.



long start = System.nanoTime();

int processorCount = Runtime.getRuntime().abailableProcessors();

LongAdder adder = new LongAdder();


try{

ExecutorService es = Executors.newCachedThreadPool();

//processorCount 는 8이라고 가정한다.

for(int i=0; i<processorCount; i++){

es.submit(()->{

//연산 없음

});

}

}catch(Throwable e){}


long end = System.nanoTime();

System.out.println(end-start+"나노초");



이 결과 800만번의 연산을 하는 속도와 흡사한 32,283,098 나노초가 나왔다.

이 결과 역시 여러번 수행해 나온 평균치이다.


즉 기본적으로 8개의 스레드에 연산을 올리는데 3200만 나노초가 걸리고,

그 이후의 연산속도는 병렬연산이 훨씬 빠르다는 결과가 나왔다.


병렬연산을 적극 활용해야겠다.





댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함