2009-10-06 201 views
-7

奎德里是 - 這以下兩種方法的執行最好
目標 - 得到式包裝(下文定義)
標準的一個目的 - 速度超過存儲
沒有。記錄 - 約1000-約2000,最大約6K
選擇 - 動態創建的對象還是從字典
執行速度查找 - 每秒C#性能問題

NB稱爲x次 - 我需要交付工作代碼第一,然後去優化,因此,如果任何理論可以提供瞥見在後方的場景信息,這將幫助之前,我實際的性能測試可能由排爆週四

定義 -

class Wrapper 
{ 
    public readonly DataRow Row; 
    public Wrapper(DataRow dr) 
    { 
     Row = dr; 
    } 
    public string ID { get { return Row["id"].ToString(); } } 
    public string ID2 { get { return Row["id2"].ToString(); } } 
    public string ID3 { get { return Row["id3"].ToString(); } } 
    public double Dbl1 { get { return (double)Row["dbl1"]; } } 
    // ... total about 12 such fields ! 
} 
Dictionary<string,Wrapper> dictWrappers; 

方法1種

Wrapper o = new Wrapper(dr); 
/// some action with o 
myMethod(o); 

方法2

Wrapper o;  
if (! dictWrappers.TryGetValue(dr["id"].ToString(), out o))  
{  
    o = new Wrapper(dr);  
    dictWrapper.Add(o.ID, o);  
}  

/// some action with o  
myMethod(o);  
+0

你的問題是什麼?如果您想知道哪個運行最好,請查看System.Diagnostics.Stopwatch,並計算大量運行時間。 – abelenky 2009-10-06 01:08:11

+7

嗯......你爲什麼不自己測試一下? -1 – spender 2009-10-06 01:10:18

+0

ummm,再次閱讀這個問題 - 它清楚地表明,如果任何理論家能夠提供我在實際基準測試之前發生的事情的一瞥 – Kumar 2009-10-13 15:38:25

回答

1

第一個會更快,因爲它實際上並沒有進行查找,它只是做一個簡單的分配和分配。

這兩段代碼並不完全相同。然而,在函數中,因爲方法1可能會創建很多重複項。

7
  1. 而不首先仿形決不優化。
  2. 除非代碼不符合規格/期望,否則千萬不要進行配置文件。
  3. 如果您需要對此代碼進行配置文件編寫,請使用兩種方式編寫代碼並使用您的預期負載進行基準測試。

編輯:我試圖偏向於優化以下,除非表現是不可接受的:

  • 簡單
  • 可讀性
  • 可維護性
  • 可測

我已經(最近)看到高度優化的代碼非常難以確定錯誤。我重構它來簡化它,然後運行性能測試。性能是不可接受的,所以我對它進行了描述,發現了瓶頸,並僅對這些瓶頸進行了優化。我重新運行了性能測試,新代碼與高度優化版本相媲美。現在它更容易維護。

+0

&因此,NoteBnene(NB)高於 – Kumar 2009-10-06 01:09:28

+1

@Kumar:如果我說我是專家和方法2更快,你會相信我嗎?唯一確定的方法就是對它進行基準測試。即使如此,問題在於它是否會對您的情況產生重大影響。我會選擇一個,提供代碼,運行性能測試,並且只有在它無法滿足規格要求時纔會對代碼進行剖析。 – TrueWill 2009-10-06 01:19:10

+0

夠公平的,我不會相信你的面值,但像上面指出的那樣,我想知道更多關於什麼和爲什麼而不是IJWTW(它就是這樣工作的)或者其他的,我最終會得到正如上面指出的 – Kumar 2009-10-06 01:34:58

5

這是免費的profiling tool

+1

+1這幾天再次分析 - 這是我使用的那個;這是基本的,但價格是正確的。 – TrueWill 2009-10-06 17:34:44

0

沒有真正的測試,我期望在Wrapper中緩存字段值(即避免所有的ToString調用和強制轉換)可能會對性能產生更多影響。

然後,一旦你緩存這些值,你可能會想要保持Wrapper的實例,而不是經常重新創建它們。

+0

不錯的主意,但它只適用於5-6個字段/屬性,其餘都非常不穩定 – Kumar 2009-10-06 01:37:57

0

假設你真的真的擔心每(嘿,它發生),那麼你的底層包裝本身可以改善。你正在通過字符串進行字段查找。如果您打算通過在該行中設置的相同字段進行大量調用,那麼緩存序號並按序號查找實際上會更快。

當然,這隻有在您確實需要擔心性能的情況下才會發生,而且這種情況會產生變化的情況非常罕見(儘管在嵌入式設備中並不像桌面上那麼少見)。

+0

是的,性能是關鍵,每秒鐘至少幾百次 – Kumar 2009-10-06 01:36:42