2017-04-15 6 views
-3

내 C# Brute Force 프로그램은 런타임시 CPU의 20 %를 사용합니다. Im은 1 명의 Backgroundworker 만 사용합니다. 이 작업을 여러 부분으로 나누어 7-8 Backgroundworkers에 삽입하면 더 빠르며 더 많은 CPU를 사용하게 될까요?여러 BackgroundWorkers에 대한 무차별 강요가 더 빠릅니까?

+1

시도해 보셨습니까? – Fabio

+0

아직 없습니다. 하지만 어쩌면 누구든지 시도하기 전에 나에게 답을 줄 수 있습니다. – KotMaster

+2

@AxelKemper 반드시 그런 것은 아니지만, 그 20 % CPU 사용량은 단일 코어의 전체가 될 수 있습니다 ... –

답변

1

아마도 짧은 답변 일 것입니다.

긴 대답

은 여러 요인에 달려 있다는 것입니다 : 그 다음 멀티 스레딩은 아마 도움이되지 않습니다 작업을 유지하는 CPU 아니라면

  1. , 당신의 작업 CPU 바인딩입니다.

  2. 프로세서에 몇 개의 코어가 있고 하이퍼 스레딩이 활성화되어 있습니까? 하나의 스레드 만있는 경우 멀티 스레드를 시도하면 실제로 속도가 느려집니다. 더 많은 것이 있으면 OS에서 사용할 수있는만큼 많은 스레드를 프로그램에서 사용할 수 있습니다. (당신이 시작하는 스레드의 수를 결정하기 위해 Environment.ProcessorCount 값을 사용하는 것이 좋습니다).

  3. 얼마나 많은 크로스 스레드 동기화가 발생해야합니다. 쓰레드가 잠긴 공유 변수에 쓰기를 기다리거나 그 사이에 데이터를 전달하는 데 시간이 오래 걸리면 애플리케이션 속도가 느려질 수 있습니다.

내 주요 제안은 테스트하는 것입니다.

직관적 인 Stopwatch 클래스를 사용하면 코드 세그먼트의 실행 시간을 상당히 정확하게 계산할 수 있습니다.

마지막으로 배경 작업자가 아닌 Thread[]을 사용해 볼 수도 있습니다. 일반적으로 이러한 작업은 오버 헤드가 낮기 때문에 약간 빨라집니다.

+0

감사합니다. 현재 메신저 테스트 중입니다 ... – KotMaster

+1

프로파일 러 사용 (예 : ANTS Performance Profiler 또는 VS 내장형 성능 프로파일 러를 사용하면 성능을 이해하는 데 도움이됩니다. –

0

"스택"이라는 단어를 테스트했습니다. Backgroundworker 1은 길이가 1 인 단어를 검색합니다. 2는 길이가 2 인 단어에 대한 배경 작업자입니다.

Word: stack 
Backgroundworker Time 
1     1min 8sec 
5     35sec