【问题标题】:Performance and Memory Consumption in C#C# 中的性能和内存消耗
【发布时间】:2012-08-03 06:12:20
【问题描述】:

我有两个问题:

1) 我需要一些专家意见来了解代码,这对于性能和内存消耗来说足够明智。

2) 从性能和内存消耗来看,一段代码的好坏程度以及为什么???

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

部分示例代码如下:

for(int i=0;i=100;i++) { 一些代码 } 对于(长 i=0;i=1000;i++) { 一些代码 }

如果要求相同,使用 Int16 或其他任何东西而不是 int 有多好。

【问题讨论】:

    标签: c# asp.net .net memory-management


    【解决方案1】:

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

    给出的选项:

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

    编辑:如前所述,由于中间表达式是赋值而不是 bool 类型的表达式,因此它们都不会真正编译。

    这表明了一个非常重要的观点:在快速运行之前让您的代码正常运行。您的两个循环不做同样的事情 - 一个的上限为 1000,另一个的上限为 100。如果您必须在“快速”和“正确”之间进行选择,您几乎总是 em> 想选择“正确”。 (当然,这也有例外 - 但这通常是关于大量数据结果的绝对正确性,而不是 代码 正确性。)

    在此处更改变量类型不太可能产生任何可测量的差异。微优化通常就是这种情况。在性能方面,架构通常比方法内优化更重要 - 而且以后也更难改变。一般来说,您应该:

    • 尽可能编写最简洁的代码,使用最正确、最简单地表示您的数据的类型
    • 确定合理的性能要求
    • 衡量您的干净实施
    • 如果它的性能不够好,请使用分析等来找出如何改进它

    【讨论】:

    • 实际上,两个循环都做同样的事情,因为两个循环体都不会执行一次(毕竟我们讨论的是使代码正确)。
    • 事实上这段代码根本不起作用,因为循环条件在第一次运行时不会为真(而且更多的,甚至不是条件)。
    • 我只是想知道在一个建筑是关键的大项目中,什么是最好的计划......
    • @Sham:这个问题太宽泛了,无法在这里真正回答。考虑你的瓶颈在哪里,等等。
    【解决方案2】:
    DateTime dtStart = DateTime.Now;
    
    
    for(int i=0;i=10000;i++)
    {
         Some Code
    }
    
    response.write ((DateTime.Now - dtStart).TotalMilliseconds.ToString());
    

    Long 也一样,您可以知道哪个更好... ;)

    【讨论】:

      【解决方案3】:

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

      话虽如此,如果您想知道这样的事情之间的区别(递增 4 字节寄存器与递增 8 字节),您可以随时参考 Agner 先生的精彩 instruction tables

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

      在 32 位 x86 机器上,递增 int 将花费更少的时间。

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

      【讨论】:

        猜你喜欢
        • 2017-02-09
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        • 1970-01-01
        • 2016-01-05
        • 2015-02-21
        • 2014-01-01
        • 2012-06-03
        相关资源
        最近更新 更多