2009-10-06 118 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