본문 바로가기
public void static main()/Book

[Effective Java] 아이템 48

by 햄리뮤 2023. 2. 8.
반응형

으아아아 내일 아니 12시 지났꾸나 오늘 스터디인데 너므 졸립다 왜  왜 주말에 안하고 이제하는거야!!

주말에 뭐하는데~~!~!!!!~!~!!!

[책 규칙]

노란색 - 자세히 알아보고싶은 부분

초록색 - 핵심 개념 (블로그 정리시는 검은색으로!)

빨간색 - 무슨말인지 모르겠는 부분

[아이템 48] 스트림 병렬화는 주의해서 적용하라

스트림 병렬화를 알아보기전에 정리!

동시성(Concurrency)...?

  • 멀티 작업을 위해 멀티 스레드가 번갈아가며 실행하는 성질!
  • 싱글 코어 CPU를 이용한 멀티 작업은 병렬적으로 실행되는 것 처럼 보이지만 실제로는 동시성 작업임!

병렬성(Parallelism)...?

  • 병렬성은 멀티 작업을 위해 멀티 코어를 이용해 동시에 실행하는 성질이다!

데이터 병렬성(Data Parallelism)...?

  • 전체 데이터를 나누어 서브데이터를 만들고 서브 데이터를 병렬 처리해 작업을 빠르게 종료하는 것이다!
  • 병렬 스트림은 데이터 병렬성을 구현한것!
  • 멀티 코어의 수만큼 큰 요소를 서브 요소로 나누고, 서브 요소를 분리된 스레드에서 병렬로 처리!

작업 병렬성(Task Parallelism)...?

  • 서로 다른 작업을 병렬 처리하는 것!
  • 예시는 웹서버의 각각의 요청을 개별 스레드에서 병렬로 처리하는것!

포크 조인(ForkJoin)...?

  • Java 7부터 사용가능한 Java Concurrency 툴이며, 통일한 작업을 여러개의 Sub Task로 분리(Fork) 하여 각각 처리하고, 이를 최종적으로 합쳐서(Join) 결과를 만들어내는 방식
java.lang.Object
	java.util.concurrent.AbstractExecutorService
		java.util.concurrent.ForkJoinPool

스트림 병렬화!

  • 각각의 스레드에서 처리할 수 있도록 스트림 요소를 여러 청크로 분할한 스트림!
  • 병렬 스트림을 이용하면 모든 멀티코어 프로세서가 각각의 청크를 처리하도록 할당할 수 있다!
  • 컬렉션에 parallelStream을 호출하면 병렬 스트림이 생성된다!
  • 성능 최적화 수단임을 기억해라! (반드시 성능 테스트하여 병렬화를 사욯랄 가치가있는지 확인하는게 좋당!)

숫자 n을 인수로 받아서 1부터 n까지 모든 숫자의 합계를 반환하는 메서드를 구현한다고 가정해보자!

n이 커진다면 이 연산을 병렬로 처리하는것이 좋을 것이다! (잘만 쓰면 속도도 빨라질 수 있음!)

public long sumNumber(long n) {
    return Stream.iterate(1L ,i -> i + 1)
        .limit(n)
        .reduce(0L, Long::sum);
}

순차 스트림을 병렬 스트림으로 변환해보자!

  • 순차 스트림에 parallel 메서드를 호출하면 기존의 함수형 리듀싱 연산이 병렬로 처리된다!
  • 순차 스트림과 다른 점은 스트림이 여러 청크로 분할되어 있다는 것이다!
public long sumNumber(long n) {
    return Stream.iterate(1L ,i -> i + 1)
        .limit(n)
        .parallel() // 병렬 처리!
        .reduce(0L, Long::sum);
}

주의 및 결론!

스트림을 잘못 병렬화하면 (응답 불가를 포함해) 성능이 나빠질 뿐만 아니라 결과 자체가 잘못되거나 예상 못한 동작이 발생할 수 있다!

계산 결과가 정확하고 성능도 좋아질 것이라는 확신이 없다면 스트림 병렬화를 적용하지마!

 

핵심정리
계산도 올바로 수행하고 성능도 빨라질 거라는 확신 없이는 스트림 파이프라인 병렬화는 시도조차 하지마라! 스트림을 잘못 병렬화 하면 프로그램을 오동작하게 하거나 성능을 급격히 떨어뜨린다. 병렬화하는 편이 낫다고 믿더라도, 수정 후의 코드가 여전히 정확한지 확인하고 운영 환경과 유사한 조건에서 수행해보며 성능지표를 유심히 관찰하라! 그래서 계산도 정확하고 성능도 좋아졌음이 확실해졌을 때, 오직 그럴 때만 병렬화 버전 코드를 운영 코드에 반영하라!

 

 

 

 

 

https://junghyungil.tistory.com/103#:~:text=Fork%20Join%20Pool%20%EC%9D%B4%EB%9E%80%3F,%EB%A5%BC%20%EB%A7%8C%EB%93%A4%EC%96%B4%EB%82%B4%EB%8A%94%20%EB%B0%A9%EC%8B%9D%EC%9D%B4%EB%8B%A4.

 

[Java] Fork Join Pool

Fork Join Pool의 상속구조 java.lang.Object java.util.concurrent.AbstractExecutorService java.util.concurrent.ForkJoinPool Fork Join Pool 이란? ForkJoinPool 은 Java7부터 사용가능한 Java Concurrency 툴이며, 동일한 작업을 여러개의

junghyungil.tistory.com

https://devbksheen.tistory.com/entry/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94-%EB%B3%91%EB%A0%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%B2%98%EB%A6%AC%EC%99%80-%EC%84%B1%EB%8A%A5-%EC%B8%A1%EC%A0%95

 

[모던 자바] 병렬 데이터 처리와 성능 측정

java7이 등장하기 전에는 데이터 컬렉션을 병렬로 처리하기가 어려웠다. 우선 데이터를 서브 파트로 분할해야 하고, 분할된 서브 파트를 각각의 스레드로 할당한다. 스레드로 할당한 다음에는 의

devbksheen.tistory.com

https://girawhale.tistory.com/131#:~:text=%EB%B3%91%EB%A0%AC%20%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%80%20%EA%B0%81%EA%B0%81%EC%9D%98,%EB%B3%91%EB%A0%AC%20%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%84%20%EB%A6%AC%ED%84%B4%ED%95%9C%EB%8B%A4.

 

[Java] 병렬 데이터 처리(병렬 스트림, 포크/조인 프레임워크)

병렬 처리(Parallel Operation)란 멀티 코어 환경에서 하나의 작업을 분할해 각각의 코어가 병렬적으로 처리하는 것이다. 자바7 이전에는 데이터 컬렉션을 병렬 처리하기 위해서는 데이터를 분할하고

girawhale.tistory.com

** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.

이곳 저곳에서 구글링한 것과 강의 들은 내용이 정리가 되었습니다.

그림들은 그림밑에 출처표시를 해놓았습니다.

문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **

반응형

'public void static main() > Book' 카테고리의 다른 글

[CISCO NETWORK] PART 1 - OSI 7 Layer  (0) 2023.02.16
[CISCO NETWORK] PART 1  (0) 2023.02.13
[Effective Java] 아이템 45  (0) 2023.02.07
[Effective Java] 아이템 41  (0) 2023.01.31
[Effective Java] 아이템 35  (0) 2023.01.30

댓글