2011-02-24 45 views
1

大家好,最近我正在調試一個提高性能的程序。我注意到了一個關於賦值性能的興趣。下面的代碼是我的測試代碼。c#不同方式的分配表現

代碼

public class Word{....} 

public class Chunk 
{ 
    private Word[] _items; 
    private int _size; 
    public Chunk() 
    { 
     _items = new Word[3]; 
    } 

    public void Add(Word word) 
    { 
     _items[_size++] = word; 
    } 
} 

 Chunk chunk = new Chunk(); 

     for (int i = 0; i < 3; i++) 
     { 
      chunk.Add(new Word() { });// 
     } 

代碼B

public class Chunk 
{ 
    private Word[] _items; 
    private int _size; 
    public Chunk() 
    { 
     _items = new Word[3]; 
    } 

    public Word[] Words 
    { 
     get 
     { 
      return _items; 
     } 
    } 

    public int Size 
    { 
     get{return _size;} 
     set{_size=value;} 
    } 
} 

 Chunk chunk = new Chunk(); 
     for (int i = 0; i < 3; i++) 
     { 
      chunk.Words[i] = new Word() { }; 
      chunk.Size + = 1; 
     } 

在我用visual studio'profiling工具測試時,調用主要方法32000次,即性能顯示CODE B FASTER比CODE A.爲什麼CODE B比CODE A更快?誰能給我一個建議? 感謝

更新:對不起,我忘了在代碼B增加_size代碼,我已經更新了我的代碼B

更新:@Shiv庫瑪是,代碼A在30000呼叫的情況與代碼B相似倍。我測試了700K文件,代碼可以被稱爲29000次左右。 同時,代碼B比代碼A快100毫秒,而實際代碼B在實際段中更好。 這裏還有一件事,我想知道爲什麼Code B比Code A更快,即使是相同的任務?無論如何,謝謝你的回覆。

+0

有多少差異?你能告訴我們你用來分析的代碼嗎?如果您要調用代碼A然後調用代碼B,請嘗試交換,以便調用代碼B,然後調用代碼A.向我們展示如何分析此代碼非常重要,因爲分析代碼中可能有許多錯誤。 – 2011-02-24 03:16:01

+0

我justed測試了這一點,你說的1毫秒(有時和有利於任何一種方法)在30,000次迭代中幾乎沒有區別。除非你另有所見,否則這是對每個人時間的浪費。 – 2011-02-24 03:32:33

+0

接受一個答案或留下評論或編輯你的問題,你在找什麼。 – 2011-03-18 00:15:30

回答

1

我能想到的三個理由。

  1. Chunk.Add()是一個方法調用,與內聯運行的相同代碼相比,方法調用總是很昂貴。
  2. 第一個代碼示例中有兩個增量(_size ++和i ++)
  3. chunk.Words數組可能本地緩存(第二個示例)因此,每次調用Add時都不需要評估chunk.items(第1個示例)。
1

在代碼A中,您正在遞增兩次。一旦您的循環:

for (int i = 0; i < 3; i++) 
在你的方法

而且一旦:

_items[_size++] = word; 

在代碼B,你只在遞增一次循環。

它並不多,但肯定會造成性能差異。

是的,方法調用也會增加少量的開銷。

+1

加上A中方法的實際調用與不調用B中的方法可能會增加少量開銷。 – knightpfhor 2011-02-24 03:20:59

+0

嗨,dubmun,我忘了代碼B在主循環中的一個代碼,我修改了我的代碼。 – zhengchun 2011-02-24 03:25:51

+0

我編輯了我的回覆,但knightpfhor是正確的,方法調用也有一個小的影響。在另一個例子中,你只使用屬性,它們對性能的影響與直接訪問變量的效果差不多,除非嵌入了邏輯。 – Dubmun 2011-02-24 03:29:41

相關問題