C#性能问题

时间:2009-10-06 01:04:17

标签: c# .net performance optimization high-availability

quandry是 - 以下两种方法中哪一项表现最佳 目标 - 获取Wrapper类型的对象(在下面定义)
标准 - 速度超过存储
没有。记录 - 约1000-约2000,最大约6K
选择 - 动态创建对象或从字典中查找 执行速度 - 每秒调用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 );    

5 个答案:

答案 0 :(得分:7)

  1. 不首先进行分析,不要进行优化。
  2. 除非代码不符合规格/期望,否则不要进行分析。
  3. 如果您需要对此代码进行分析,请双向编写并以预期负载对其进行基准测试。
  4. 编辑:我尝试支持以下优化,除非性能不可接受:

    • 简单
    • 可读性
    • 可维护性
    • 可测

    我(最近)看到了非常难以调试的高度优化的代码。我重构它以简化它,然后进行性能测试。性能是不可接受的,因此我对其进行了分析,找到了瓶颈,并仅对这些瓶颈进行了优化。我重新运行了性能测试,新代码与高度优化的版本相当。现在它更容易维护。

答案 1 :(得分:5)

这是一个免费的profiling tool

答案 2 :(得分:1)

第一个会更快,因为它实际上没有进行查找,只是进行简单的分配和分配。

这两段代码几乎不相同。但是在功能上,因为方法1可以创建许多重复项。

答案 3 :(得分:0)

如果没有实际测试,我希望在Wrapper中缓存字段值(即避免所有ToString调用和强制转换)可能会对性能产生更大的影响。

然后,当您缓存这些值时,您可能希望保留Wrapper的实例,而不是经常重新创建它们。

答案 4 :(得分:0)

假设你真的担心每个(嘿,它发生),那么你的底层包装器本身就可以改进了。你正在按字符串进行字段查找。如果您要使用行中设置的相同字段进行大量调用,则实际上更快速地缓存序数并按顺序查找。

当然,只有你真的,真的需要担心性能,并且这会产生影响的实例相当罕见(尽管在嵌入式设备中它并不像在桌面上那么罕见)。