在C#的for循环中,以下哪种码块的性能最好?还是没有区别呢?区别在于条件是保存在局部变量中还是直接从对象中读取。
选项1
float maxDepth = 0;
int maxnumber = 0;
for (int i = 0; i < defects.Total; i++)
{
if (defects[i].Depth > maxDepth)
{
maxDepth = defects[i].Depth;
maxnumber = i;
}
}选项2
float maxDepth = 0;
int maxnumber = 0
int defectNumber = defects.Total;
for (int i = 0; i < defectNumber; i++)
{
if (defects[i].Depth > maxDepth)
{
maxDepth = defects[i].Depth;
maxnumber = i;
}
}如果这个问题被问了很多次,我很抱歉,但我在任何地方都找不到它。
安德斯
发布于 2011-11-22 21:13:38
对于所有这样的问题,您可以像这样使用System.Diagnostics.Stopwatch。
var stopwatch = new Stopwatch();
stopwatch.Start();
float maxDepth = 0;
int maxnumber = 0;
for (int i = 0; i < defects.Total; i++)
{
if (defects[i].Depth > maxDepth)
{
maxDepth = defects[i].Depth;
maxnumber = i;
}
}
stopwatch.Stop();
Debug.WriteLine("Elapesed time for method 1: {0} msec.", stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
stopwatch.Start();
maxDepth = 0;
maxnumber = 0;
int defectNumber = defects.Total;
for (int i = 0; i < defectNumber; i++)
{
if (defects[i].Depth > maxDepth)
{
maxDepth = defects[i].Depth;
maxnumber = i;
}
}
stopwatch.Stop();
Debug.WriteLine("Elapesed time for method 2: {0} msec.", stopwatch.ElapsedMilliseconds);然后你就得到了确切的信息。(最好的方法是多次运行并使用平均值)
发布于 2011-11-22 21:14:19
您的第一个示例必须在循环中的每一次传递中都保持解析defects.Total。一般来说,这将比在原生int中拥有一个值要慢。我不了解C#的内部工作原理,所以我不能确定哪种方法更快,或者快多少,但总的来说,我会说第二种方法更好。
发布于 2011-11-22 21:15:38
选项2将使用更多的少量内存,但由于一个较少的取消引用步骤,它将会更快一点。
无论哪种方式都不会有太大的区别,除非你是通过迭代的billions+来计算的。
https://stackoverflow.com/questions/8227289
复制相似问题