c# - 哪个需要更少的 Cpu/内存/ram... 等?
问题描述
我有一些编码资源相关的问题:
Q1:
A:
for (int i = 0; i < 15; i++)
{
FunA(i);
FunB(i);
}
或者
乙:
for (int i = 0; i < 15; i++)
{
FunA(i);
}
for (int i = 0; i < 15 ; i++)
{
FunB(i);
}
B 是否比 A 占用更多的资源,因为有 2 个循环?为什么?
Q2:
A:
FunA(10*2-15+15/X);
FunA(10*2-15+15/X);
FunA(10*2-15+15/X);
乙:
int result=10*2-15+15/X;
FunA(result);
FunA(result);
FunA(result);
A 是否需要更多资源,因为它必须每次都计算结果或 B 需要更多?编译器是否理解结果相同并从中生成变量?
解决方案
使用分析器。
对于您的第二个问题,C# 编译器将优化编译时常量,例如10*2-15+15
.
B
尽管编译器可能会为您优化示例,但您的第二个示例是更好的代码A
。
抛开性能不谈,第二个A
例子只是糟糕的编码实践。不必要的重复常量(用户出错的可能性更大,特别是如果您稍后更改此代码)。
也就是说,一个好的经验法则是不要依赖编译器优化。尝试使代码可读,对于实际上是不变的东西,你应该将它们定义为const
:
const int WHATEVER = 10 * 2 - 15 + 15;
int result = WHATEVER / X;
FunA(result);
FunA(result);
FunA(result);
最后,这里必须提到的是,分析几乎总是比滚动你自己的基准更准确(我看到写不正确的次数比不正确的次数多)。Visual Studio 2017 有一个内置的分析器,或者您可以使用其他各种分析器。
当对性能有疑问时,不要猜测。获取实际指标。
推荐阅读
- php - 如果图像未在 Laravel 中提交,则显示图像响应 Null
- javascript - HTTP 请求中的 HTML 表返回 null
- python - 测试在对象初始化Python期间是否调用了某个方法
- swift - 如何转换为对象数组?
- firebase - 无法使用 Cloud Firestore 中的快照读取更大的数据
- javascript - 如何使用多个按钮切换可见性?
- python - 如何应用一种方法来计算熊猫中一个值之间的零值的数量?
- spring-boot - java.lang.StackOverflowError(Cyclic Reference) 与 JPA 和 Mapstruct
- vpn - Windows 同时运行两个 VPN 客户端
- python - 以抖动和大小为变量在python中绘图