2012-06-14 3 views
0

내가 라인 잘 작동는 더 이상 성능

ExecutorService executor = Executors.newFixedThreadPool(2); 
FutureTask<Integer> futureOne = new FutureTask<Integer>(new Calcul1()); 
FutureTask<Integer> futureTwo = new FutureTask<Integer>(new Calcul2()); 
executor.execute(futureOne); 
executor.execute(futureTwo); 
while (!(futureOne.isDone() && futureTwo.isDone())) { 

} 

System.out.println(futureOne.get() + futureTwo.get()); 
executor.shutdown(); 

의 수를 같은 시간에 파일을 읽어 반환하려고 같은 시간에이 파일을 읽을 수 있지만 난 후 파일 하나를 읽고 경우 빠른 발견 파일 2 ... 그래서 미래의 성능 향상을 얻지 못한다.

왜?

+0

완성도 테스트를 위해 회전 루프가 있습니까? 그 표정은 무엇을합니까? "파일 1 읽기"라고 말하지만 "Calc'1 new Calcul1(). run()'"을 호출 하시겠습니까? – Gray

+0

예, 읽기 파일 1 = Calcul1, 읽기 fil2 = Calcul2, 2 초 걸리는 스레드 없음 ... futureTask와 4.5 초 받기 –

답변

2

귀하의 신청서가 IO 묶음으로 간주됩니다. 한 스레드에서 하나의 파일을 읽을 때 순차적으로 파일에 액세스하기 때문에 성능이 향상됩니다. 두 개의 스레드를 시작하면 사실상 두 개의 서로 다른 파일을 읽고 디스크를 두 파일 사이에서 앞뒤로 탐색하게됩니다. 플래터 형 디스크를 회전시키는 것에 대해 이야기하는 경우 검색 시간은 IO의 중요한 부분입니다.

5

스핀 루프는 하나의 코어를 완전히 낭비합니다. 즉, 스레드 간 신호가 원인입니다. 두 개의 파일이있는 디스크가 하나뿐이라면 속도가 훨씬 빨라지며 작동면에서 부정적인 결과를 초래할 수 있습니다. 서로 다른 디스크에 파일이있는 경우 (특히 지연 시간이 긴 연결이있는 네트워크 디스크) 성능이 크게 향상됩니다.

+0

가치가있는 점은 OS가 파일을 버퍼링하기 때문입니다. – Griwes