You will be fine

<모던자바인액션> Stream API, JMH, Parallel Stream

by BFine
반응형

2021/02/20 - [개발공부/Java] - ForkJoinPool의 Thread Size 고정이 안되는 경우

요거를 정리하면서 Parallel 관련된 부분들을 정리가 필요하다는 생각이 들어서 모던자바인액션 책 내용을 정리해보았다.

가.  Stream API

Stream을 쓰다보면 filter만 쓰게 되는데 책을 보니 몰랐던 괜찮은 API들이 있어서 남겨둬야겠다.

 a. takeWhile

  -  Java 9부터 사용가능한 Stream API 로 정렬된 컬렉션에서 조건에 일치하는 값까지만 찾아서 반환한다. 

  -  반대로 동작하는 dropWhile도 있다.

  -  책에 Java8로 구현한 부분이 있어서 요거는 나중에 활용 해야겠다.

 public static <T> List<T> takeWhile(List<T> list, Predicate<T> predicate){
      int i = 0;
      for(T item : list){
           if(!predicate.test(item)){
               return list.subList(0,i);
           }
            i++;
        }
        return list;
    }

 public static void main(String[] args) {
       List<Integer> integers = Arrays.asList(1, 2, 3);

       List<Integer> resultList = Custom.takeWhile(integers, 
        									(item) -> item < 3);

       resultList.forEach(System.out::println);
       // 결과 1 2

 }

 

 b. generate

  -  조건의 값을 무한으로 만드는 API이다. Supplier를 인수로 받아서 새로운 값을 생산한다.

  -  단순 Stream 으로도 쓸수 있지만 오토박싱에 주의하자

public static void main(String[] args) throws Exception {
       
       List<Integer> resultList = Custom.takeWhile(integers, 
       (item) -> item < 3);
       
       IntStream.generate(()-> (int) (Math.random() * 5))
       .limit(2)
       .forEach(System.out::println);


    }

 

나. 성능 측정 

 a. JMH

  -  책에 벤치마크 성능 측정하는 부분이 있었는데 맨날 end - start 만 했던 부분을 반성하게 된다...

  -  Java Microbenchmark Harness 라는 라이브러리를 이용해 성능을 측정한다.

  -  책은 maven으로 되어있어서 gradle은 플러그인으로 추가를 해야한다.

  -  default 패키지에 클래스 만들어서하면 NullPointException이 발생하니 새로운 패키지를 만들어서 해야한다.

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Fork(value = 2,jvmArgs = {"-Xms4G","-Xmx4G"})// value는 측정횟수 지정
public class TestClass {

    @Benchmark
    public long sum(){
        int sum = 0;
        for(int i = 1; i <= 10_000_000;i++){
            sum+=i;
        }
        return sum;
    }

    @Benchmark
    @Threads(Threads.MAX)
    public long parallel(){
        return IntStream.rangeClosed(1,10_000_000)
                        .parallel().sum();
    }

}

  -  테스트 방법은 ./gradlew jmh  결과를 확인하면..

 

다. Parallel Stream 

 a. 메서드

  -  parallel 이나 parallelStream 을 통해서 간단하게 병렬처리를 할 수 있다.

  -  해당 메서드는 스트림에 변화가 있는게 아닌 단순 boolean 형태로 병렬처리 유무에 대한 flag이다.

 

 b. Thread Pool

  -  내부적으로 ForkJoinPool을 사용, Runtime.getRuntime().availableProcessors()의 Thread 개수를 가진다. 

  -  특별한 이유가 없으면 기본값을 그대로 사용하는 걸 권장한다.

반응형

'공부 > Java' 카테고리의 다른 글

<Java> Future  (0) 2022.05.06
<Java> Thread 와 비동기  (0) 2022.01.20
ForkJoinPool의 Thread Size 고정이 안되는 경우  (3) 2021.02.26
<네티인액션> Java로 콜백 만들기  (0) 2021.02.14
Exception, 예외처리에 대해서..  (0) 2021.01.22

블로그의 정보

57개월 BackEnd

BFine

활동하기