티스토리 뷰
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만 나노초가 걸리고,
그 이후의 연산속도는 병렬연산이 훨씬 빠르다는 결과가 나왔다.
병렬연산을 적극 활용해야겠다.
'JAVA' 카테고리의 다른 글
[자바 성능튜닝] 사용할 Collection(자료구조)을 선택할 때 고려할 점 (0) | 2015.04.13 |
---|---|
[자바 성능튜닝] 문자열 결합(String 연산)에 대하여 (0) | 2015.04.13 |
자바 성능측정 라이브러리 (0) | 2015.04.13 |
성능측정용 메소드 : System.nanoTime() 메소드 (0) | 2015.04.13 |
운영중인 코드에 절대 사용해선 안돼는 System클래스의 메소드들 (0) | 2015.04.13 |
- Total
- Today
- Yesterday
- 성능
- 자바
- 알람
- react
- gitlab
- 날짜
- RAMDA
- Jackson
- 람다
- Swift 2.0
- 프로세서
- Stream
- 메모리
- 자료구조
- 컴퓨터 시간
- 리액트
- 클로저
- Java
- 코어
- javascript
- Docker
- opensource
- 성능개선
- rambda
- 퍼포먼스
- json
- 시간
- Clojure
- 자바 성능
- Java8
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |