2014-05-09 3 views
0

몇 가지 작업 집합에 대해 단일 스레드와 비교하여 8 개의 스레드 (시스템에 8 개의 코어가 있으므로 8 개의 스레드)와 스레드 풀을 비교하고 싶습니다.스레드 풀 성능 테스트

테스트 1 : 스레드 풀에 주어진 작업은 대기열 (std :: queue)을 조사하여 정수를 가져 와서 계승을 계산하여 화면에 표시하는 것이 었습니다. 그래서 500 번, 스레드 풀 클래스에서 addTask 함수를 호출하고 1에서 20 사이의 500 개의 숫자를 추가했습니다. 따라서 병렬로 정수가 추가되고 8 개의 스레드가이를 선택하여 계승을 계산합니다. 대기열에 동기화가 스레드 풀에 추가되었습니다. 스레드 풀 대기열에 작업을 추가하는 시점과 모든 500 개의 작업이 완료된 시점 사이의 시간을 기록합니다. 이 시간을 T1로 호출 할 수 있습니다.

테스트 2 : 간단한 계승 함수를 작성하여 결과를 계산하십시오 (&). 간단한 루프를 500 회 실행하여 1부터 20까지의 숫자를 가진 계승 함수를 호출합니다. 루프 전후의 시간을 기록했습니다. 이 시간을 T2로 호출 할 수 있습니다. 흥미롭게도, T2는 항상 T1보다 작다. 어떻게 가능합니까?

위의 설명이 명확하지 않은 경우를 대비하여 코드 공유에 신경 쓰지 않아도됩니다.

+3

팩토리얼을 계산하는 데 소비되는 시간은 스레드 풀 오버 헤드와 비교하면 사소합니다. 또한 작업 스레드를 사용하여 표시하는 경우 모든 풀 스레드는 공유 자원 인 GUI에 대한 액세스를 기다리지 않고 엄지 손가락을 빙글 빙글 돌리고 있습니다. –

+2

왜 "병렬"이 자동적으로 "빠름"을 의미하지 않는지에 대한 약간의 이론 : http://en.wikipedia.org/wiki/Amdahl%27s_law – oakad

+0

위의 내용에 감사드립니다. 결론을 내리고 이해를 확인하기 위해 나는 아래의 테스트를 실행하여 생각을 증명했습니다. 1. 작업 스레드에서 cout 코드를 제거하고 계산 된 계승을 매번 새 파일에 쓰도록 코드를 추가했습니다. 이것에 의해, 공유 자원 "컴퓨터 화면"이 생략된다. 이로 인해 T1은 T2보다 10 배 정도 작았습니다. 2. 계승을 계산하는 대신 모든 cout과 파일 I/O를 제거하고 각 작업 스레드에서 백만 번 블라인드 루프를 실행했습니다. 그 결과 T1보다 T2가 훨씬 적습니다. 8 개의 모든 스레드에 공유 자원이 없다는 사실 때문에. – Rachit

답변

0

"indeterminately sequenced"및 "oakad"덕분에 위의 내용이 적합합니다.

  1. 작업 스레드, 제거 cout을 코드에서 임의의 이름으로 새 파일에 계산 계승을 작성하는 코드를 추가 : 그냥 결론과 이해를 보장하기 위해, 당신의 생각을 증명하는, 테스트 아래 달렸다. 이를 통해 "컴퓨터 화면에 표시"라는 공유 자원이 생략됩니다. 이로 인해 T1은 T2보다 10 배 정도 작았습니다. 잠금 파일을 확보 한 후 동일한 파일에 빠른 테스트를 수행하여 공유 리소스로 인해 T1> T2가 발생했습니다.

  2. 팩토리얼을 계산하는 대신 모든 cout과 파일 i/o를 제거하고 각 작업 스레드에서 백만 번 블라인드 루프를 실행했습니다. 그 결과 T1보다 T2가 훨씬 적습니다. 8 개의 모든 스레드에 공유 자원이 없다는 사실 때문에.

오해의 여지가 있거나 더 명확히해야 할 부분이 있으면 언제든지 추가하십시오.