以下是我正在使用的代码
private void TestFunction()
{
foreach (MySampleClass c in dictSampleClass)
{
String sText = c.VAR1 + c.VAR2 + c.VAR3
PerformSomeTask(sText,c.VAR4);
}
}
Run Code Online (Sandbox Code Playgroud)
我的朋友已经建议改为(以提高性能.dictSampleClass是一个字典.它有10K对象)
private void TestFunction()
{
String sText="";
foreach (MySampleClass c in dictSampleClass)
{
sText = c.VAR1 + c.VAR2 + c.VAR3
PerformSomeTask(sText,c.VAR4);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,"上述变化会改善绩效吗?如果是,怎么样?"
哇,这比预期的反应更多.大多数人都说"C#编译器可以解决这个问题".那么c编译器呢?
编译器具有在需要时将变量声明移入/移出循环的智能.但是,在您的示例中,您使用的字符串是不可变的.通过在外面声明它我相信你正在尝试"创建一次,使用多次",但是每次修改时都会创建字符串,因此无法实现.
不要听起来很糟糕,但这是一个不成熟的优化,可能是一个失败的 - 由于字符串不变性.
如果集合很大,请沿着将许多字符串附加到StringBuilder的路径 - 由分隔符分隔.然后在此分隔符上拆分字符串并迭代数组以添加它们,而不是连接它们并在一个循环中添加它们.
StringBuilder sb = new StringBuilder();
foreach (MySampleClass c in dictSampleClass)
{
sb.Append(c.VAR1);
sb.Append(c.VAR2);
sb.Append(c.VAR3);
sb.Append("|");
}
string[] results = sb.ToString().Split('|');
for (int i = 0; i < dictSampleClass.Count; i++)
{
string s = results[i];
MySampleClass c = dictSampleClass[i];
PerformSomeTask(s,c.VAR4);
}
Run Code Online (Sandbox Code Playgroud)
我推断使用此代码没有任何好处 - 很可能甚至不起作用!
更新:鉴于从多个字符串创建字符串的快速性能,如果PerformSomeTask是您的瓶颈,尝试将字符串的迭代分解为多个线程 - 它不会提高代码的效率但是您将能够利用多个核心.
归档时间: |
|
查看次数: |
312 次 |
最近记录: |