C# C语言中的性能和内存消耗#

C# C语言中的性能和内存消耗#,c#,asp.net,.net,memory-management,C#,Asp.net,.net,Memory Management,我有两个问题: 1) 我需要一些专家的意见,在维特代码方面,这将是性能和内存消耗明智的声音足够 2) 从性能和内存消耗的角度看,下面的代码有多好/坏,为什么 需要将计数器的最大值增加100,并编写如下代码: 一些示例代码如下所示: for(int i=0;i=100;i++) { Some Code } for(long i=0;i=1000;i++) { Some Code } for(int i=0;i=100;i++) { 一些代码 } 用于(长i=0;i=1000;

我有两个问题:

1) 我需要一些专家的意见,在维特代码方面,这将是性能和内存消耗明智的声音足够

2) 从性能和内存消耗的角度看,下面的代码有多好/坏,为什么

需要将计数器的最大值增加100,并编写如下代码:

一些示例代码如下所示:

for(int i=0;i=100;i++) { Some Code } for(long i=0;i=1000;i++) { Some Code } for(int i=0;i=100;i++) { 一些代码 } 用于(长i=0;i=1000;i++) { 一些代码 } 如果要求相同,使用Int16或其他任何东西代替int,long有多好

DateTime dtStart = DateTime.Now;


for(int i=0;i=10000;i++)
{
     Some Code
}

response.write ((DateTime.Now - dtStart).TotalMilliseconds.ToString());
同样的方法也会持续很长时间,你可以知道哪一个更好……;)

同样的方法也会持续很长时间,你可以知道哪一个更好……;)

需要将计数器的最大值增加100,并编写如下代码:

给出的选项:

for(int i=0;i=100;i++)

for(long i=0;i=1000;i++)
编辑:如前所述,这两个表达式实际上都不会编译,因为中间的表达式是赋值表达式,而不是
bool
类型的表达式

这说明了一个非常重要的问题:在快速运行代码之前,先让代码正常工作。你的两个循环做的事情不同——一个循环的上限为1000,另一个循环的上限为100。如果你必须在“快速”和“正确”之间选择,你几乎总是想选择“正确”。(当然也有例外——但这通常是指在大量数据中结果的绝对正确性,而不是代码的正确性。)

在此变量类型之间的更改不太可能产生任何可测量的差异。微观优化通常就是这样。说到性能,体系结构通常比方法优化重要得多,而且以后也很难改变。一般来说,你应该:

  • 编写尽可能干净的代码,使用最正确、最简单地表示数据的类型
  • 确定合理的性能要求
  • 衡量你的清洁执行
  • 如果它的性能不够好,请使用分析等方法来解决如何改进它
需要将计数器的最大值增加100,并编写如下代码:

给出的选项:

for(int i=0;i=100;i++)

for(long i=0;i=1000;i++)
编辑:如前所述,这两个表达式实际上都不会编译,因为中间的表达式是赋值表达式,而不是
bool
类型的表达式

这说明了一个非常重要的问题:在快速运行代码之前,先让代码正常工作。你的两个循环做的事情不同——一个循环的上限为1000,另一个循环的上限为100。如果你必须在“快速”和“正确”之间选择,你几乎总是想选择“正确”。(当然也有例外——但这通常是指在大量数据中结果的绝对正确性,而不是代码的正确性。)

在此变量类型之间的更改不太可能产生任何可测量的差异。微观优化通常就是这样。说到性能,体系结构通常比方法优化重要得多,而且以后也很难改变。一般来说,你应该:

  • 编写尽可能干净的代码,使用最正确、最简单地表示数据的类型
  • 确定合理的性能要求
  • 衡量你的清洁执行
  • 如果它的性能不够好,请使用分析等方法来解决如何改进它

当你做的事情需要一个表示迭代次数的数字,或者某件事情的数量时,你应该始终使用
int
,除非你有很好的语义理由使用不同的类型(即数据不能是负数,也可以大于2^31)。此外,在编写c#代码时,担心这种纳米优化问题基本上是无关紧要的

这就是说,如果你想知道这类事情之间的区别(增加4字节寄存器与增加8字节寄存器),你总是可以得出Agner先生的精彩的结论

在Amd64机器上,递增
long
所用的时间与递增
int
所用的时间相同**

在32位x86机器上,递增
int
所需的时间更少


**几乎所有逻辑和数学操作都是如此,只要值不受内存限制且未对齐。在.NET中,
long
始终是对齐的,因此两者始终是相同的。

当你做的事情需要一个表示迭代次数或某件事情数量的数字时,你应该始终使用
int
,除非你有很好的语义理由使用不同的类型(即数据不能是负数,也可以大于2^31)。此外,在编写c代码时,担心这种纳米优化问题基本上是无关紧要的

这就是说,如果你想知道这类事情之间的区别(增加4字节寄存器与增加8字节寄存器),你总是可以得出Agner先生的精彩的结论

在Amd64机器上,递增
long
所用的时间与递增
int
所用的时间相同**

在32位x86机器上,递增
int
所需的时间更少


**几乎所有的逻辑和数学运算都是如此,只要值不是内存绑定的和未对齐的。在.NET中,
long
总是对齐的,所以两者总是相同的。

实际上,两个循环都做相同的事情,因为两个循环体都不会执行一次(我们一直在谈论如何使代码正确)。事实上,这段代码根本不起作用,因为循环条件在第一次运行时不会为真(更重要的是,循环条件甚至不是一个条件)。我只想知道在一个大型项目中,架构是关键,那么什么才是最好的计划……@Sham:那是