首页 > 解决方案 > 何时在 C# 中声明有关效率/速度的变量

问题描述

我正在运行一个完全为提高效率而构建的东西的实现。我在这个主题上还没有那么有经验,并且想知道何时最好地声明变量。我的代码的以下部分特别是:

//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 等所做的那样)

标签: c#performancevariablesdeclarationcpu-speed

解决方案


我推荐阅读Compilers - What Every Programmer Should Know About Compiler Optimization。因此,您尝试的微优化很可能会产生零效果。编译器和 JIT 团队非常聪明。例如:

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

性能示例,哪个更快?

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,因此没有区别。

所以唯一的判断方法是自己运行测试......也就是说,如果你绝对需要那种速度。

其他好文章:

微优化剧场的悲惨悲剧

硬件便宜,程序员贵


推荐阅读