2014-02-11 111 views
4

我是一名遊戲程序員,所以我總是試圖優化我的代碼。我最近在玩弄循環,我遇到了一些讓我困惑的事情。我創建了一個簡單的控制檯應用程序,創建了一個非靜態類:靜態字符串vs非靜態字符串

public class CL 
{ 
    static int X; 
    string Z; 
    static string sZ; 

    public CL(int x, int y, string z) 
    { 
     X = x + 1; 
     Z = z; 
     sZ = z; 
    } 

    public void Update(int i) 
    { 
     X *= i + 1; 
     X = X/2; 
     Z += i.ToString() ; 
    } 

    public void UpdateStatic(int i) 
    { 
     X *= i + 1; 
     X = X/2; 
     sZ += i.ToString(); 
    } 
} 

有兩種方法都執行相同的操作:它們都修改靜態整數X,然後他們添加到字符串的整i即靜態(sZUpdateStatic)或不(ZUpdate)。

我跑了一個循環,而這裏的結果:enter image description here

正如你可以看到,修改靜態字符串變量了約260倍,只要修改非靜態的(它可以殺死一個遊戲的FPS) 。我試着把整數X都設爲靜態而不是,但是沒有性能差異。所以我的問題是:爲什麼修改靜態字符串會傷害性能?,但修改一個靜態整數不傷害?以下是其餘代碼:

static void Main(string[] args) 
    { 
     while (Console.ReadLine() != "Q") 
     { 
      int count = 20000; 
      List<CL> l = new List<CL>(); 
      List<CL> sl = new List<CL>(); 
      for (int i = 0; i < count; i++) 
      { 
       var cl = new CL(i, i * 2, ""); 
       l.Add(cl); 
       sl.Add(cl); 
      } 
      Stopwatch s = new Stopwatch(); 
      s.Start(); 
      for (int i = 0; i < count; i++) 
      { 
       l[i].Update(i); 
      } 
      s.Stop(); 
      Console.WriteLine(s.Elapsed + " unsorted list modifying non-static variable"); 
      s.Reset(); 

      s.Start(); 
      for (int i = 0; i < count; i++) 
      { 
       sl[i].UpdateStatic(i); 
      } 
      s.Stop(); 
      Console.WriteLine(s.Elapsed + " unsorted list modifying static variable"); 
      s.Reset(); 
     } 

    } 

我找不到任何有關爲什麼會發生這種情況。對不起,如果答案很明顯。謝謝你的幫助。

回答

9

在非靜態版本中,您在循環的每次迭代中都使用CL的不同實例。因此Z永遠不會很長。

在靜態版本中,sZ繼續變得越來越長。

創建一個字符串並追加運行時間與其長度成正比,所以靜態版本需要更長的時間。

至於整數,由於整數的值,在運行時沒有差別。這是因爲在內部,所有整數在.net中都是相同的大小。 (4字節)

+0

@davidsbro:查看我編輯的關於int的信息。 – recursive

相關問題