2013-10-06 59 views
2

我在考虑更多我的程序现在将使用多少系统内存。我目前在大学做一级计算,我知道在大多数程序中,差异可以忽略不计,但我想知道下列实际上是否在任何语言中都有所不同。If语句中的内存效率

说我想输出“真”或“假”取决于条件是否为真。就个人而言,我更愿意做这样的事情:

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,因为这是用于该课程的语言,但真的我很想知道这在不同的编程语言中有何不同。

+0

正如dasblinkenlight所说,除非在特定情况下(高内存要求复杂系统),否则内存现在不是问题。无论如何,你应该把你的记忆力最大化的努力集中在其他方面,这可能会得到更多的关注效果。中间变量的声明(这里的“结果”)几乎没有任何影响(你正在实例化给定类,字符串;在写第二个代码的时候也是“True”/“False”)。有些人倾向于将代码的长度与实际的性能/内存利用率等联系起来,这两种情况都没有关系... – varocarbas

+0

...打算优化代码的编写方式(并且构建程序以使内存开销为尽可能低)毫无疑问是一件好事,但你应该把重点放在真正重要的事情上(做一些关于高度记忆消耗实践的研究),并且有一个想法很明确:从代码的大小你不能获得任何有价值的信息;做一些研究或者实施一种确定内存消耗的方法,如果你想知道每一点“昂贵”是多少。 – varocarbas

+0

@varocarbas感谢您的意见。我看到你的观点,我认为这将是关于声明中间变量的情况......我知道示例代码的大小意味着没有什么是真正相关的,但是它只是将我想要问的概念。 – Andy

回答

3

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

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

哪个更快?
if语句构成一个分支,因为CPU需要决定是关注还是跳过if部分。
如果它正确地猜测分支跳跃将执行0或1个周期(1Ghz计算机上1纳秒)。
如果它没有正确猜测分支,则跳跃将需要50个周期(给定或取出)(微秒的1/200)。

因此,即使感觉到这些差异作为人类,您也需要执行if语句数百万次。

这两个语句以上有可能在完全相同相同量的时间来执行,这是因为:

  1. 将值分配给变量取忽略不计的时间;在多分量CPU上平均少于一个CPU周期*。使用常量参数调用函数需要使用不可见的临时变量;所以很可能代码A编译成与代码B几乎完全相同的目标代码。

*)所有当前的CPU都是多分量的。

消耗更少的内存
如上所述,两个版本需要把布尔到一个变量。
版本A使用明确的版本,由您声明;版本B使用由编译器声明的隐式版本。

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

是多么糟糕的浪费
通话大约需要10个字节的字符串的分配(每Unicode的字符2个字节)。
但其他版本也是如此,所以也是如此。
为呼叫留下5个字节。另外可能需要一些额外的字节来设置堆栈。
所以,让我们说由于你的代码完全可怕,你现在浪费了10个字节。

没什么好担心的。

从可维护性的角度来看
计算机代码是为人类而不是机器写的。
所以从这个角度来看,代码A显然是优越的。 想象一下,不要在2个选项 - 真或假 - 而是20之间进行选择。
您只能调用一次该功能。
如果您决定改变WriteLine的其他功能,您只需在一处改变它,而不是两个或20个。

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

+0

+1谢谢你的回答。分支预测非常有趣,并提供了进一步的证据来支持代码A.感谢您的思考 – Andy

2

如果您需要知道指令要执行的精确内存量,您可以在代码上使用ildasm,然后亲自查看。但是,如果内存非常便宜且丰富,并且编译器足够智能以查看常见模式并减少它们生成的代码量,那么代码所消耗的内存量就会少得多。

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

P.S.不用说Console.WriteLine(condition)会产生相同的结果,但这当然不是您问题的要点。

+0

+1感谢您的回答。我会看看'ildasm',但是因为我提供的示例代码确实毫无意义。 – Andy