>

병렬 스트림에 대한이 기사 를 읽었습니다. . 꽤 오래 걸리고 병렬 스트림의 작동 방식과 관련하여 모든 것을 이해했습니다. 이해하기 어려운 부분을 인용하겠습니다 :

병렬화에는 다음이 필요합니다. 하위 작업을 실행하기위한 스레드 풀 초기 작업을 하위 작업으로 나누기 서브 태스크를 스레드에 분배 결과 정렬 세부 사항을 입력하지 않으면이 모든 것이 약간의 오버 헤드를 의미합니다. 다음과 같은 경우 놀라운 결과가 표시됩니다 :

  • 원격 서비스에 액세스하거나

  • 와 같은 일부 작업은 오랜 시간 동안 차단하는 것을 암시합니다.
  • 동시에 실행되는 스레드가 많지 않으며, 특히 다른 병렬 스트림이 없습니다.

모든 하위 작업이 강렬한 계산을 의미하는 경우 사용 가능한 프로세서 수에 따라 잠재적 인 게인이 제한됩니다. Java 8은 기본적으로 컴퓨터의 프로세서만큼 많은 스레드를 사용하므로 집중적 인 작업의 경우 다른 스레드가 동시에 수행하는 작업에 따라 결과가 크게 달라집니다.물론, 각 하위 작업이 본질적으로 대기중인 경우 이익이 크게 나타날 수 있습니다."

위에서 굵게 강조 표시된 두 문장을 이해하지 못합니다.

첫 번째 문장 :일부 작업은 원격 서비스 액세스와 같은 오랜 시간 차단을 암시합니다

내가 이해하는 것은 병렬 처리 환경이 아니라 동시 프로그래밍 환경에서 실행되는 동일한 작업에 비해 성능 향상이 상대적으로 강하다는 것입니다.

이것 :물론, 각 서브 태스크가 본질적으로 기다리고 있다면, 이득은 엄청납니다.

저는 저자가 여기서 의미하는 바를 전혀 알지 못했습니다.

  • 답변 # 1

    CPU를 많이 사용하는 작업 (예 : 배열 정렬)은 CPU 처리 능력의 일부를 차지합니다. 병렬화를 사용하면 작업을 여러 코어로 분할하여 시스템에서 사용할 수있는 모든 처리 능력을 사용할 수 있습니다. 그러나 작업은 동시에 CPU를 사용해야하는 다른 작업, 스레드 풀, 프로세스, OS 등과 경쟁해야합니다. 따라서 프로세서에서 얼마나 많은 컴퓨팅 성능을 활용할 수 있는지 항상 제한이 있습니다. 따라서

    와이즈 비즈

    이제 10 번의 데이터베이스 호출이 필요한 작업이 있다고 가정 해 봅시다. 각 호출은 데이터베이스가 쿼리를 실행하고 결과를 수집하여 사용자에게 반환하는 데 1 초가 걸립니다. 단일 순차 스레드에서 해당 태스크를 실행하면 해당 데이터베이스 호출에 대한 실행 시간이 총 10 초까지 추가됩니다. 각 호출은 이전 호출이 완료된 후에 만 ​​실행될 수 있기 때문입니다. 10 초 동안 프로그램은 기본적으로 유휴 상태이므로 응답을 기다리는 것 외에는 아무것도하지 않습니다.

    여기서 병렬화가 실제로 빛납니다. 작업을 10 개의 하위 작업으로 분할하고 각각의 스레드에서 각 작업을 실행하면 각각 동시에 쿼리를 제출하고 결과를 기다릴 수 있습니다. 즉, 전체적으로 1 초의 다운 타임 만 있습니다. 하위 작업은컴퓨팅이 아니라차단이므로 사용 가능한 시스템 리소스에 제한을받지 않습니다. 유일한 제약은 단일 작업을 논리적으로 분류 할 수있는 거리입니다. 따라서

    와이즈 비즈

    It will show amazing results when... There are not many threads running at the same time, and in particular no other parallel stream.

  • 이전 javascript - reconnectionAttempts와 pingTimeout의 차이점은 무엇입니까?
  • 다음 .htaccess - htaccess - 동일한 이름의 파일로 디렉토리를 리디렉션