c# - 何时在 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 等所做的那样)
解决方案
我推荐阅读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,因此没有区别。
所以唯一的判断方法是自己运行测试......也就是说,如果你绝对需要那种速度。
其他好文章:
推荐阅读
- python - 使用 Pandas 在数据框中组合两行的不同部分
- javascript - 检查变量是否为空,然后在 javascript / jQuery 中将长度设置为默认值 0
- r - 在 plot_PCA(R - Momocs)中更改轴限制的方法?
- javascript - 在asp.net中使用ajax,jquery在回发后保留多个选择下拉值
- go - gqlgen 从解析器设置 cookie
- html - 我将如何在横幅上设置这三个图像的样式,以便它们在保持响应性的同时水平显示?
- javascript - 当文本中的数字为 x 时,如何停止“setInterval”命令?
- java - OpenApi 生成器在注释之间生成空行
- javascript - 来自第二个 BrowserView 的 Electron BrowserView DOM 操作?
- javascript - 为什么要使用 process.nextTick 来确保异步任务的正确执行?