If语句中的内存效率

时间:2013-10-06 12:50:40

标签: vb.net if-statement memory-efficient

我正在考虑我的程序现在将使用多少系统内存。我目前正在大学进行A Level计算,我知道在大多数程序中,差异可以忽略不计,但我想知道以下任何语言是否真的有任何区别。

说我想输出" True"或"错误"取决于条件是否为真。我个人喜欢这样做:

Dim result As String

If condition Then
   Result = "True"
Else
   Result = "False"
EndIf

Console.WriteLine(result)

但是,我想知道以下是否会消耗更少的内存等等:

If condition Then
   Console.WriteLine("True")
Else
   Console.WriteLine("False")
EndIf

显然这是一个非常简单的例子,在我的大多数情况下还有更多的输出,我意识到在大多数商业程序中这种陈述很少见,但希望你能得到这个原则。

我在这里专注于VB.NET,因为这是该课程使用的语言,但我真的很想知道它在不同编程语言中的区别。

2 个答案:

答案 0 :(得分:3)

使if快或慢的主要问题是可预测性。

现代CPU(2000年以后的任何内容)使用mechanism called branch prediction 首先阅读上面的链接,然后在下面阅读...

哪个更快?
if语句构成一个分支,因为CPU需要决定是否跟随或跳过if部分 如果它正确猜测分支,则跳转将在0或1个周期内执行(1Ghz计算机上为1纳秒)。
如果它没有正确地猜测分支,那么跳跃将花费50个周期(给予或接受)(微软的1/200)。

因此,即使将这些差异视为人类,您也需要执行数百万次的if语句。

上述两个陈述可能会在完全相同的时间内执行,因为:

  1. 为变量赋值需要的时间可以忽略不计;在多标量CPU上平均不到一个cpu周期*。
  2. 使用常量参数调用函数需要使用不可见的临时变量;所以很可能代码A编译的代码几乎与代码B完全相同。
  3. *)所有当前的CPU都是多标量的。

    消耗更少的内存
    如上所述,两个版本都需要将布尔值放入变量中 版本A使用由您声明的显式版本;版本B使用编译器声明的隐式版本。

    但是,版本A保证只能调用函数WriteLine 虽然版本B可能(或可能不)对函数WriteLine进行两次调用 如果编译器中的优化器是好的,代码B将转换为代码A,如果不是,它将保留冗余调用。

    浪费有多糟糕
    该调用大约需要10个字节来分配字符串(每个字符串2个Unicode) 但其他版本也是如此,所以也是如此 这为调用留下了5个字节。另外可能需要几个额外的字节来设置堆栈帧 所以我们说,由于你完全可怕的编码,你现在浪费了10个字节。

    不用担心。

    从可维护性的角度来看
    计算机代码是为人而不是机器编写的 因此,从这个角度来看,代码A显然是优越的。 想象一下,不要在两个选项之间选择-true或false-而是20 你只需要调用一次该功能 如果您决定将WriteLine更改为另一个功能,您只需在一个地方更改它,而不是两个或20个。

    如何加快速度?
    有2个值几乎是不可能的,但如果你有20个值,你可以使用查找表 显然,除非代码执行很多次,否则优化是不值得的。

答案 1 :(得分:2)

如果您需要了解说明书的准确内存量,可以在代码上使用ildasm,并亲自查看。但是,当内存如此便宜和丰富时,代码消耗的内存量相关性要低得多,并且编译器足够聪明,可以查看常见模式并减少它们生成的代码量。

更令人担忧的是代码的可读性:如果复杂的条件链总是导致打印有条件设置的结果,那么第一个代码块会以比第二个代码块更清晰的方式表达这个想法。在其他条件相同的情况下,您应该更喜欢您认为最易读的任何形式的代码,并让编译器担心优化。

P.S。毫无疑问Console.WriteLine(condition)会产生相同的结果,但这当然不是你问题的重点。

相关问题