Java에서 CompletableFuture로 성능 향상
12181 단어 javaproductivitybeginnersprogramming
완성 가능한 선물
저장소 : 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);
}
Reference
이 문제에 관하여(Java에서 CompletableFuture로 성능 향상), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/jorgetovar/improve-performance-with-completablefuture-in-java-1jb6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@Test
public void numberOfProcessors() {
assertThat(availableProcessors, is(equalTo(8)));
}
@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));
}
@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));
}
@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));
}
@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);
}
Reference
이 문제에 관하여(Java에서 CompletableFuture로 성능 향상), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jorgetovar/improve-performance-with-completablefuture-in-java-1jb6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)