何时在C#中声明有关效率/速度的变量

时间:2018-07-09 19:59:15

标签: c# performance variables declaration cpu-speed

我正在运行某种为提高效率而完全构建的东西。我对此主题还没有足够的经验,并且想知道何时最好地声明变量。我的代码的以下部分特别是:

//Variables not declared in the next part are declared here (like xx, y1, x1.....)
    for(s = 0; s < this.Width; s++)
        {
            y = ymin;
            for(z = 0; z < this.Height; z++)
            {
                x1 = 0;
                y1 = 0;
                looper = 0;
                while(looper < curMaxIter && Math.Sqrt((x1 * x1) + (y1 * y1)) < 2)
                {
                    looper++;
                    xx = (x1 * x1) - (y1 * y1) + x;
                    y1 = 2 * x1 * y1 + y;
                    x1 = xx;
                }
                double perc = looper / (double)curMaxIter;
                int val = ((int)(perc * 255));
                b.SetPixel(s,z,cs[val]);
                y += intigralY;
            }
            x += intigralX;
        }

大家都可以想象,这个while循环会持续一段时间……而且我想以任何方式减少所花费的时间,而结果将是相同的。整个代码的每一帧再次运行数千次(我为那些好奇的人渲染了Mandelbrot图像)。 我的主要问题:在使用变量之前,先声明变量(例如perc和val,还喜欢xx,y1和x1)会更快吗? (例如perc和val)还是最好在整个循环之前声明它们? (就像我对xx,y1和x1等所做的一样。)

2 个答案:

答案 0 :(得分:5)

我建议阅读Compilers - What Every Programmer Should Know About Compiler Optimization。结果,您尝试进行的微优化最有可能的效果为零。编译器和JIT团队非常聪明。例如:

  

就优化功能而言,RyuJIT和Visual C ++有什么区别?由于RyuJIT可以在运行时完成工作,因此可以执行Visual C ++无法执行的优化。例如,在运行时,RyuJIT可能能够确定if语句的条件在应用程序的特定运行中永远不会为真,因此可以对其进行优化。

Performance example, which one is faster?

List<User> list = new List<User>();
User u;

foreach (string s in l)
{
    u = new User();
    u.Name = s;
    list.Add(u);
}

或者这个:

List<User> list = new List<User>();

foreach (string s in l)
{
    User u = new User();
    u.Name = s;
    list.Add(u);
}

答案:

  

在性能方面,两个示例均编译为相同的IL,因此没有区别。

所以唯一可以告知的方法就是自己运行测试……也就是说,如果您绝对需要这种速度。

其他好文章:

The Sad Tragedy of Micro-Optimization Theater

Hardware is Cheap, Programmers are Expensive

答案 1 :(得分:-1)

您可以使用Visual Studio Performance Profiler https://msdn.microsoft.com/en-us/library/ms182372.aspx