首页 > 解决方案 > 哪个需要更少的 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#resourcescpu

解决方案


使用分析器。

对于您的第二个问题,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 有一个内置的分析器,或者您可以使用其他各种分析器。

当对性能有疑问时,不要猜测。获取实际指标。


推荐阅读