2011-09-02 38 views
1

我正在製作一款XNA遊戲,並且我正在調用以下代碼,每次更新2到20次。我試着用Google搜索,看起來這是半緩慢的,所以我只是想我會問是否有更快的方法來比較類型?GetType()==類型的性能

代碼:

public Modifier this[Type type] 
    { 
     get 
     { 
      for (int i = 0; i < this.Count; i++) 
      { 
       if (this[i].GetType() == type) 
       { 
        return this[i]; 
       } 
      } 

      throw new NotImplementedException("Fix this"); 
     } 

     set 
     { 
      for (int i = 0; i < this.Count; i++) 
      { 
       if (this[i].GetType() == type) 
       { 
        this[i] = value; 
       } 
      } 

      if(System.Diagnostics.Debugger.IsAttached) 
       System.Diagnostics.Debugger.Break(); 
     } 
    } 

這個代碼,其中從名單繼承ModifierCollection類。修飾符是粒子引擎的一部分。另外,我的遊戲不是在我可以真正測試這個的情況下,所以我不能測試這個,但是這應該是正確的?

我讀了一些關於RunTimeTypeHandles的內容,應該更快一些,我應該使用它嗎?

編輯:什麼我的目標與此有關的是,我能做到以下幾點:

(particleEffect["NameOfEmitter"].Modifiers[typeof(SomeCoolModifier)] as SomeCoolModifier).Variable = Value; 

基本上我只是想改變在運行某些更動的價值。編輯2:我只是意識到,我可以將修飾語的引用保存到我現在調用此類的類中:P也許不是乾淨的代碼,如果我有5-10個修飾符但應該刪除此問題。

+0

爲什麼你需要一個由* type *索引的映射?我能想到的唯一用途是元編程,並且每幀不會發生20次。你確定你不能只使用多態嗎? – delnan

+0

不是重複的,但http://stackoverflow.com/questions/378643/fastest-type-comparison應該有所幫助。 – Yuck

+0

最好有更明確的異常數據:'NotImplementedException(「修復此」);' – mydogisbox

回答

4

如果您不需要Type公開的任何額外功能,並且您只關心類型之間的絕對平等 - 即,您不需要支持繼承 - RuntimeTypeHandle是最快的方式做這個比較。

真的,我會質疑這不是你班級設計的弱點。除非你有直接檢查類型的強制性理由,否則最好在你的對象上展示一些代表它們的值(可能是一個枚舉),然後對它進行比較。

0

您可以將值存儲在按類型索引的字典中而不是列表中,這樣您就不必每次都在列表上執行O(n)迭代。

正如在評論中指出的那樣,這取決於n的大小並且可能是一個微優化。我建議分析你的應用程序。

+1

嗯,取決於。如果只有少數項目,散列和幻想查找算法可能會使其比線性搜索更慢,JIT知道散列表內部的數量和集合的範圍等因素也可能會產生影響。 – delnan

+0

這並沒有擺脫GetType()調用,如果列表很小,可能會比循環更昂貴 –

+0

@delnan - true,它取決於n的大小。修改我的答案。 – TrueWill

0

如果你想成爲真的是速度很快,並且可以信任調用你的代碼,請將索引器更改爲int。然後,無論調用者用什麼方法(您沒有顯示)將類型添加到列表中,都返回相應的int。這是一個糟糕的API,但它意味着你不必做任何循環或查找。