以下是我正在使用的代码
private void TestFunction()
{
foreach (MySampleClass c in dictSampleClass)
{
String sText = c.VAR1 + c.VAR2 + c.VAR3
PerformSomeTask(sText,c.VAR4);
}
}
我的朋友已经建议改为(以提高性能。 dictSampleClass 是一本字典。它有10K对象)
private void TestFunction()
{
String sText="";
foreach (MySampleClass c in dictSampleClass)
{
sText = c.VAR1 + c.VAR2 + c.VAR3
PerformSomeTask(sText,c.VAR4);
}
}
我的问题是,“上述变化会改善效果吗?如果是,怎么样?”
这比预期的反应还要多。大多数人都说“C#编译器可以解决这个问题”。那么c编译器呢?
答案 0 :(得分:7)
编译器具有在需要时将变量声明移入/移出循环的智能。但是,在您的示例中,您使用的字符串是不可变的。通过在外面声明它我相信你正在尝试“创建一次,使用很多”,但是每次修改时都会创建字符串,因此你无法实现它。
不要听起来很糟糕,但由于字符串不变性,这是一个不成熟的优化,可能是一个失败的优化。
如果集合很大,请沿着将许多字符串附加到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);
}
我推断使用此代码没有任何好处 - 很可能甚至不起作用!
UPDATE:鉴于来自多个字符串的字符串创建的快速性能,如果PerformSomeTask是您的瓶颈,请尝试将字符串的迭代分解为多个线程 - 这不会提高效率代码,但你将能够使用多个核心。
答案 1 :(得分:2)
通过反射器运行这两个函数,并查看生成的程序集。它可能会提供一些见解,但充其量,性能改进将是最小的。
答案 2 :(得分:1)
我会改为:
private void TestFunction()
{
foreach (MySampleClass c in dictSampleClass)
{
PerformSomeTask(c.VAR1 + c.VAR2 + c.VAR3, c.VAR4);
}
}
可能仍然没有真正的性能优势,但它会删除创建一个您并不真正需要的变量。
答案 3 :(得分:0)
不,它没有。像这样的东西是由C#编译器处理的,这是非常智能的,你基本上不需要关心这些细节。
使用促进可读性的代码。
您可以通过反汇编程序来检查。
答案 4 :(得分:0)
Ii不会提高性能。但另一方面说明:假设的改进容易出错。您必须测量您的应用程序,并且只在需要时才优化慢速部分。我不相信循环是你的appliacations的瓶颈。