2015-01-02 8 views
-1

내 프로젝트는 BackgroundThread를 사용하여 휴즈 목록을 목록보기에로드합니다. 매우 빠른 성능을 보였지만 거의 100 %의 CPU를 사용합니다. CPU 사용량을 줄이지 않고도 높은 CPU 사용량을 피할 수있는 해결 방법이 있습니까? 공연? 사전에대용량 파일을 읽을 때 높은 CPU 사용을 피하는 방법

 void readfile() { 

     deg_readfile read = new deg_readfile(readfileasync); 
     read.BeginInvoke(new AsyncCallback(callback),null); 
    } 

    void readfileasync(){ 
     string[] strs = File.ReadAllLines("hughlist.txt"); 
     List<ListViewItem> _itemlst = new List<ListViewItem>(); 
     ListViewItem _item; 
     int x = 0; 
     //problem start here 
     foreach (string str in strs) { 
      _item = new ListViewItem(str); 

      for (int i = 0; i < 6; i++) { 
       _item.SubItems.Add("");    
      }    
      _itemlst.Add(_item); 
      x++; 
      _item = null; 
     } 
    } 

    void callback(IAsyncResult ae) { 
     Console.WriteLine("finished"); 

    } 

    delegate void deg_readfile(); 

    static void Main(string[] args) 
    { 
     Program prog = new Program(); 

     Thread t=new Thread(new ThreadStart(prog.readfile)) 
     { 
      IsBackground = true, 
      Priority = ThreadPriority.Lowest 

     }; 
     t.SetApartmentState(ApartmentState.MTA); 
     t.Start(); 
     Console.Read(); 

    } 

감사 : 나는 netframework 3.5

코드를 사용합니다.

업데이트 :

시스템 구성 :

프로세서 인텔 (R) 코어 (TM) i3-2328M CPU에서 @의 2.20GHZ 2.11 GHZ 설치된 메모리 1.00 GB 시스템 유형 : 32 비트 운영 시스템

파일이 있습니다 비동기 아니라 1 개 백만 라인

+0

시스템 구성, 보유한 논리 프로세서의 수는 얼마입니까? CPU가 얼마나 오래 100 %를 유지합니까? 파일의 크기는 얼마나됩니까? –

+0

@SriramSakthivel 파일의 크기가 중요하다고 생각하지 않습니다. 중요한 것은 큰 문제입니다. :) 그러나 mysticgirltk는 OS 구성, OS 및 CPU 구조, 메모리 크기 및 CPU 클럭을 입력하십시오. 시간 – niceman

+0

@niceman 거대한 용어입니다. 얼마나 거대한 거죠? 이 질문에 대답 할 수 있습니까? 아마도 그렇지 않습니다. 그래서 혼란을 피하기 위해 나는 파일 크기를 물었다. –

답변

1

와 35,939킬로바이트 크기 : 당신은 그냥 호출 전화를 다른 스레드를 사용하고, 전달 된 대리인이 실행됩니다 N (주 GUI) 스레드가 동기식으로 생성됩니다 (컨트롤은 스레드를 생성 한 스레드 (메인 스레드)에 연결되기 때문에).

그래서 작업자 스레드는 두 가지 일을 수행합니다

  • 는 스레드 스레드

에 스레드에게

  • 전화 작업을 생성하고이 이루어집니다.

    스레드 풀 스레드는 파일을 동 기적으로 읽는 것을 포함하여 모든 작업을 수행합니다.

    그러나 은 단일 파일 IO에 많은 시간이 걸릴 것 같지 않습니다. 첫 번째 실행 후 메모리에 캐싱되어 IO를 커널 호출을 디스패치하는 시간으로 줄입니다.

    asychronously 일을 수행해도 필요한 CPU 리소스의 양이 줄어들지는 않습니다 (가능한 경우 - 데이터 구조를 설정하여 추적하십시오 - 더 많은 시간이 소요될 수 있습니다) : CPU가 파일 내용 처리에 관여합니다 .

    최적화 할 수는 있지만 프로필러 데이터로 시작하여 CPU 시간이 어디인지 이해하고 싶을 것입니다. 파일이 대기 시간이나 낮은 대역폭 연결을 통해 네트워크 공유에있는 경우


    1

    은 아마 다를 수 있습니다.

    엄밀히 말하면 스레드 풀 스레드에서 차단 작업을 수행하는 것은 좋지 않지만 다른 작업에서는 사용할 수 없지만 파일 IO에서는 문제가되지 않을 수 있습니다. (이전 각주 참조)

  • +0

    잘못 들었습니다. 'read.BeginInvoke'는'Control.BeginInvoke'가 아닌'Delegate.BeginInvoke'입니다. 따라서 코드는 UI 스레드에서 실행되지 않고'ThreadPool'에서 실행됩니다. –

    +0

    @SriramSakthivel 죄송합니다. 그러나 차이는 없습니다. CPU가 제한적이라면 CPU는 여전히 제한적입니다. – Richard

    관련 문제