<모던자바인액션> Stream API, JMH, Parallel Stream
by BFine2021/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