注意 - 我需要首先提供工作代码,然后进行优化,因此如果任何理论家能够提供场景信息背后的一瞥,那么在我进行实际性能测试之前可能会有所帮助
定义 -
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 :(得分:7)
编辑:我尝试支持以下优化,除非性能不可接受:
我(最近)看到了非常难以调试的高度优化的代码。我重构它以简化它,然后进行性能测试。性能是不可接受的,因此我对其进行了分析,找到了瓶颈,并仅对这些瓶颈进行了优化。我重新运行了性能测试,新代码与高度优化的版本相当。现在它更容易维护。
答案 1 :(得分:5)
这是一个免费的profiling tool。
答案 2 :(得分:1)
第一个会更快,因为它实际上没有进行查找,只是进行简单的分配和分配。
这两段代码几乎不相同。但是在功能上,因为方法1可以创建许多重复项。
答案 3 :(得分:0)
如果没有实际测试,我希望在Wrapper中缓存字段值(即避免所有ToString调用和强制转换)可能会对性能产生更大的影响。
然后,当您缓存这些值时,您可能希望保留Wrapper的实例,而不是经常重新创建它们。
答案 4 :(得分:0)
假设你真的担心每个(嘿,它发生),那么你的底层包装器本身就可以改进了。你正在按字符串进行字段查找。如果您要使用行中设置的相同字段进行大量调用,则实际上更快速地缓存序数并按顺序查找。
当然,只有你真的,真的需要担心性能,并且这会产生影响的实例相当罕见(尽管在嵌入式设备中它并不像在桌面上那么罕见)。