-8

qudry 是 - 以下两种方法中哪一种表现最好
目标 - 获得 Wrapper 类型的对象(定义如下)
标准 - 存储速度
不。记录 - 大约 1000 - 大约 2000,最多大约 6K
选择 - 动态创建对象或从字典中查找
执行速度 - 称为每秒 x 次

注意 - 我需要先提供工作代码然后进行优化,因此如果任何理论家可以提供幕后信息的一瞥,这将有助于在我可能通过 eod thu 进行实际性能测试之前

定义 -

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;  

方法一

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

方法二

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 );    
4

5 回答 5

7
  1. 永远不要在没有先分析的情况下进行优化。
  2. 除非代码不符合规范/预期,否则切勿配置文件。
  3. 如果您需要分析此代码,请以两种方式编写它并使用您的预期负载对其进行基准测试。

编辑:除非性能不可接受,否则我尝试支持以下优化:

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

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

于 2009-10-06T01:08:19.277 回答
5

这是一个免费的分析工具

于 2009-10-06T01:14:34.437 回答
2

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

两段代码几乎不等价。然而,在功能上,因为方法 1 可能会创建许多重复项。

于 2009-10-06T01:15:08.210 回答
0

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

然后,一旦您缓存了这些值,您可能希望保留 Wrapper 的实例,而不是频繁地重新创建它们。

于 2009-10-06T01:23:53.450 回答
0

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

当然,这只是在您真的、真的需要担心性能的情况下,而这会产生影响的情况相当罕见(尽管在嵌入式设备中它不像在桌面设备上那么罕见)。

于 2009-10-06T01:24:46.023 回答