2013-05-29 1 views
1

나는 모든 자바 모양에 광선을 그릴 수있는 2D Raycaster를 작성했다 :왜 스레드 풀을 사용하는 동안 성능이 향상되지 않습니까?

Line2D, Rectangle2D, Ellipse2D, QuadCurve2D 및 CubicCurve2D.

사실 그 뒤에있는 수학은 사실 매우 복잡하고 집중적인데, 특히 쿼드와 큐빅의 경우에는 스레드 풀을 설정합니다. 사용 가능한 코어 수에 따라 고정 된 스레드 수를 가진 ExcecutionService "exec"를 만들었습니다.

그런 다음 각 셰이프를 담당하는 코드 청크를 정적 실행 파일로 변경했습니다.raycaster 메서드에서 실행 파일을 실행 한 다음 exec.shutdown()을 호출합니다. 마지막으로, id는 exec.isTerminated가 true를 반환 할 때까지 종료하지 않는 while 루프를 만듭니다.

이렇게하면 계속하기 전에 모든 스레드가 실행 완료됩니다.

지금까지 온라인에서 보았던 것에서 이것이 인기있는 방법이지만 개선 된 결과는 보이지 않습니다. 악화되지 않으면 항상 동일합니다. 실제로 오버 헤드와 일치하는 대신 효율을 높이는 스레드 풀을 사용하는 적절한 방법이 있습니까?

+0

아마도 당신의 루프는 많은 CPU를 사용하고 있습니다 – necromancer

+0

코드를 게시하십시오! –

+0

컴퓨터에 CPU 코어가 1 개 있고 프로그램이 이미 CPU 전원을 100 % 사용하고 있습니까? –

답변

1

@Adam Siemion이 말한 것처럼, 먼저 PC가 CPU에 쉽게 묶이지 않고 멀티 코어 CPU를 가지고 있는지 확인하십시오. 그렇지 않으면 어쨌든 더 빠를 수 없습니다.

두 번째로 스레드를 동적으로 생성하지 마십시오. 태스크 큐의 thread 풀을 사용한다 (java.util.concurrent의 ExecutorService 등을 참조). 많은 수의 작은 작업을 위해 끊임없이 스레드를 생성하는 경우 스레드 생성 및 정리 작업에는 상당한 시간이 소요됩니다.

셋째, 스레드 내에서 동시에 기다리는 대신 CyclicBarrier 또는 CountDownLatch 같은 스레드를 사용하는 것이 좋습니다.

위의 방법으로도 문제가 해결되지 않으면 여기에 일부 코드를 게시하십시오. 또 다른 추측은 일부 공유 자원 직렬 의존성을 가지고 있다는 것입니다. 그림 스레드 등

관련 문제