>  기사  >  Java  >  항목 병렬 스트림을 할 때 주의할 점

항목 병렬 스트림을 할 때 주의할 점

王林
王林원래의
2024-08-23 18:02:36400검색

Item  Tenha cuidado ao fazer streams paralelas

Java 및 경쟁:

  • Java는 1996년부터 기본 스레드 지원을 제공하고 java.util.concurrent 및 포크 조인 프레임워크와 같은 라이브러리를 포함하도록 발전하여 동시 프로그래밍을 촉진하는 데 항상 선두에 있었습니다.

스트림 및 병렬성:

  • Java 8에 스트림이 도입되면서 병렬() 메서드를 한 번만 호출하여 작업을 병렬화하는 것이 쉬워졌습니다. 그러나 간편함에도 불구하고 정확하고 빠른 동시 프로그램을 작성하는 것은 여전히 ​​어려운 일입니다.

성능 및 실패:

  • 스트림 파이프라인을 부주의하게 병렬화하면 성능 및 활성 오류(프로그램이 종료되지 않음)로 이어질 수 있습니다. 주어진 예에서는 스트림을 병렬화하면 눈에 띄는 결과 없이 CPU 사용량이 크게 증가할 수 있음을 보여줍니다.

휴리스틱 및 제한 사항:

  • 작업을 분할하는 데 사용되는 휴리스틱이 적합하지 않으면 스트림 병렬화가 실패할 수 있으며, 특히 추가 요소 계산 비용이 매우 높을 수 있는 Stream.iterate 및 제한과 같은 작업에서는 더욱 그렇습니다.

이상적인 데이터 구조:
ArrayList, HashMap, HashSet, ConcurrentHashMap, 배열 및 범위를 통한 스트림은 스레드 간 작업 분할이 용이하고 참조 위치가 우수하므로 병렬화에 더 적합한 후보입니다.

터미널 운영:

  • 병렬 실행의 효율성은 스트림의 터미널 작동에 따라 달라집니다. Reduce, min, max, count, sum 등의 축소 연산과 anyMatch, allMatch, noneMatch 등의 단락 연산이 병렬 처리에 더 좋습니다.

엄격한 사양:

  • 병렬 파이프라인에 사용되는 함수는 연관성이 있고 간섭이 없으며 상태가 없어야 합니다. 이러한 규칙을 위반하면 잘못된 결과나 치명적인 실패가 발생할 수 있습니다.

실행 명령:

  • 파이프라인을 병렬화하면 출력이 복잡해질 수 있으며 순서를 유지하려면 forEachOrdered와 같은 작업이 필요할 수 있습니다.

정의된 병렬성:

  • 확실한 근거가 있는 경우에만 스트림을 병렬화하세요. 부적절한 병렬 처리로 인해 충돌이 발생하거나 성능이 저하될 수 있습니다. 항상 병렬화 전후에 성능을 측정하여 유익한지 확인하세요.

효과의 예:

  • 간단한 예에서는 π(n) 계산을 병렬화하면 실행 시간이 31초에서 9.2초로 단축되어 특정 시나리오에서 병렬화가 효율적일 수 있음을 보여줍니다.

SplittableRandom 사용:

  • 병렬 난수 스트림의 경우 ThreadLocalRandom 또는 Random보다 SplittableRandom을 선호합니다. 이 용도로 특별히 설계되었으며 더 나은 성능을 제공하기 때문입니다.

결론:

  • 계산 정확도가 유지되고 속도가 향상될 것이라는 타당한 이유 없이 스트림 파이프라인을 병렬화하려고 시도하지 마세요. 프로덕션 코드에 병렬성을 적용하기 전에 엄격한 테스트를 수행하여 병렬성이 타당한지 확인하세요.


1. 순차 및 순차 스트림 예 병렬

  • 이 예는 순차 스트림과 병렬 스트림 간의 성능 차이를 보여줍니다. ParallelStreamExample.java

2. 병렬()의 비효율적인 사용 예

  • 이 예는 병렬화가 어떻게 예상치 못한 동작으로 이어질 수 있는지 보여줍니다. 비효율적인ParallelStream.java

3. 병렬()의 효율적인 사용 예

  • 이 예는 병렬화가 실제로 성능을 향상시킬 수 있는 상황을 보여줍니다. 효율적인ParallelStream,java

4. 병렬 스트림의 보안 결함 예

  • 이 예에서는 잘못 구현된 축소 작업을 병렬로 사용할 때 실패할 수 있는 방법을 보여줍니다. ParallelStreamSafetyExample.java

5. 병렬 스트림을 위한 SplittableRandom의 예

  • 이 예에서는 더 나은 성능을 얻기 위해 병렬 스트림에서 SplittableRandom을 사용하는 방법을 보여줍니다. SplittableRandomExample.java

이러한 예는 병렬화가 유용할 수 있는 상황을 설명하는 데 도움이 되며 병렬()을 무분별하게 사용할 때 발생할 수 있는 잠재적인 위험도 보여줍니다.

위 내용은 항목 병렬 스트림을 할 때 주의할 점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.