Java에서 CompletableFuture로 성능 향상

완성 가능한 선물



저장소 : https://github.com/jorgetovar/completable_futures

Java가 사용 가능한 프로세서 수를 사용하기 때문에 Java의 병렬 스트림에 성능 제한이 있다는 것을 알고 계십니까?

최신 Java 기능을 사용하고 이 문제를 극복하려면 CompletableFuture를 사용하십시오.

사용 가능한 프로세서 수보다 큰 ThreadPool을 생성하고 성능 향상을 얻을 수 있습니다.
CompletableFuture는 람다를 사용하며 코드는 표현력이 뛰어납니다.

내 컴퓨터에는 8개의 프로세서가 있습니다.



   @Test
    public void numberOfProcessors() {
        assertThat(availableProcessors, is(equalTo(8)));
    }

1초: CompletableFuture 구현이 최고의 성능을 발휘합니다.



    @Test
    public void completableFuture_whenBooksAreMoreThanNumberOfProcessors() {
        Executor executor = Executors.newFixedThreadPool(10);

        long start = System.currentTimeMillis();
        var futureCategories = getBooks()
                .map(e -> CompletableFuture.supplyAsync(() -> BookClassifier.apply(e), executor))
                .toList();

        var categories = futureCategories.stream()
                .map(CompletableFuture::join).toList();
        int timeInSeconds = getTimeInSeconds(start);
        assertThat(categories.size(), is(equalTo(10)));
        assertThat(timeInSeconds, OrderingComparison.greaterThanOrEqualTo(1));
        assertThat(timeInSeconds, OrderingComparison.lessThanOrEqualTo(1));

    }

2초: 병렬 스트림 구현에는 몇 가지 제한 사항이 있습니다.



현재 제한 사항은 먼저 8권의 책을 처리한 다음 2권을 더 처리해야 하기 때문입니다.

    @Test
public void parallelStream_whenBooksAreMoreThanNumberOfProcessors() {
        long start = System.currentTimeMillis();
        var categories = getBooks()
        .parallel()
        .map(BookClassifier::apply)
        .toList();
        int timeInSeconds = getTimeInSeconds(start);

        assertThat(categories.size(), is(equalTo(10)));
        assertThat(timeInSeconds, OrderingComparison.greaterThanOrEqualTo(2));
        assertThat(timeInSeconds, OrderingComparison.lessThanOrEqualTo(2));
        }


1초: 제한 내에서 병렬 스트림 구현



사용 가능한 프로세서의 한계 내에 있기 때문에


    @Test
    public void parallelStream_whenBooksAreLessThanNumberOfProcessors() {
        int limit = availableProcessors - 1;
        long start = System.currentTimeMillis();
        var categories = getBooks()
                .limit(limit)
                .parallel()
                .map(BookClassifier::apply)
                .toList();
        int timeInSeconds = getTimeInSeconds(start);

        System.out.printf("The operation took %s ms%n", timeInSeconds - start);
        assertThat(categories.size(), is(equalTo(limit)));
        assertThat(timeInSeconds, OrderingComparison.greaterThanOrEqualTo(1));
        assertThat(timeInSeconds, OrderingComparison.lessThanOrEqualTo(1));

    }


10초: 스트림 동기 구현의 성능이 가장 낮습니다.




   @Test
   public void stream_whenBooksAreLessThanNumberOfProcessors() {
        long start = System.currentTimeMillis();
        var categories = getBooks()
        .map(BookClassifier::apply).toList();

        int timeInSeconds = getTimeInSeconds(start);
        assertThat(categories.size(), is(equalTo(10)));
        assertThat(timeInSeconds, OrderingComparison.greaterThanOrEqualTo(9));
        assertThat(timeInSeconds, OrderingComparison.lessThanOrEqualTo(10));
        System.out.printf("The stream operation took %s ms%n", timeInSeconds);

        }

좋은 웹페이지 즐겨찾기