2012-07-18 36 views
1

這是優化的一部分,3寫文件需要爲交通繁忙部分4

Write file need to optimised for heavy traffic part 3

繼續爲我的代碼有所改變,我認爲這是更好地打開一個新的線程。

public class memoryStreamClass 
    { 
     static MemoryStream ms1 = new MemoryStream(); 
     static MemoryStream ms2 = new MemoryStream(); 
     static int c = 1; 

     public void fillBuffer(string outputString) 
     { 
      byte[] outputByte = Encoding.ASCII.GetBytes(outputString); 

      if (c == 1) 
      { 
       ms1.Write(outputByte, 0, outputByte.Length); 

       if (ms1.Length > 8100) 
       { 
        c = 2; 

        Thread thread1 = new Thread(() => emptyBuffer(ref ms1)); 
        thread1.Start(); 
       } 
      } 
      else 
      { 
       ms2.Write(outputByte, 0, outputByte.Length); 

       if (ms2.Length > 8100) 
       { 
        c = 1; 

        Thread thread2 = new Thread(() => emptyBuffer(ref ms2)); 
        thread2.Start(); 
       } 
      } 
     } 

     void emptyBuffer(ref MemoryStream ms) 
     { 
      FileStream outStream = new FileStream(string.Format("c:\\output.txt", FileMode.Append); 

      ms.WriteTo(outStream); 
      outStream.Flush(); 
      outStream.Close(); 

      ms.SetLength(0); 
      ms.Position = 0; 

      Console.WriteLine(ms.Position); 
     } 

有2件事情我已經改變從代碼改變部分3

  1. 類和方法被改變成非靜態,變量仍然靜態壽。
  2. 我已經將memorystream復位長度移動到emptyBuffer方法中,並且我使用ref參數將引用而不是副本傳遞給方法。

這段代碼編譯得很好,運行正常。但是,我將它與單線程程序並行運行,在同一網絡上使用2臺計算機,一臺計算機運行單線程,一臺計算機運行多線程版本。我跑它大約5分鐘。單線程版本收集8333KB數據,而多線程版本收集僅8222KB數據。 (98.6%的單線版本)

它的第一次我做了任何2版本之間的性能比較。也許一個應該運行更多的測試來確認它。但是基於查看代碼,那裏的任何主人都會指出任何問題?

我現在還沒有把任何代碼放在鎖或線程池上,也許我應該,但是如果代碼運行良好,我不想改變它並打破它。我唯一會改變的就是緩衝區大小,所以我將消除緩衝區填滿之前另一個被清空的機會。

對我的代碼有任何意見?

+0

我看了這個問題的所有以前的分期付款,它看起來像**你沒有實際的問題**。你只是預料到一個問題,並試圖搶先解決它。首先,以最簡單的形式實施它,明確「實際」問題,從中推導出一個要求並試圖滿足這一要求。解決問題將會容易得多,因爲SO用戶將有更大的想法空間。 – 2012-07-18 15:23:16

回答

0

問題仍然是靜態。您正在清除可能沒有寫入磁盤的數據的緩衝區。

我想這種情況正在發生1.4%的時間。

 
ms1 fills up, empty buffer1 thread started, switch to ms2 
empty buffer1 is writing to disk 
ms2 fills up, empty buffer2 thread started, switch to ms1 
empty buffer1 to disk finishes 
ms1 is cleared while it is the active stream 

當進行多線程編程,靜態是罰款,但靜態狀態是沒有的。理想情況下,你在線程之間沒有共享內存,你的代碼完全依賴於它。

想想這樣 - 如果你希望一個值能夠一致地改變,那不是完全是static是嗎?

+0

我有一個印象,如果我的變量不是靜態的,它會得到一個新的每一次,所以我不能填滿我的記憶流和輸出它的文件,我錯了嗎? – 2012-07-19 06:16:20

+0

我改變我的變量爲非靜態的,我無法執行寫操作,我想這個變量每次都會重新聲明,永遠不會寫滿,因此永遠不會寫入文件。我嘗試更改緩衝區大小並查看性能是否提高 – 2012-07-19 09:21:32