【问题标题】:Is it faster (or more efficient) to create a variable rather than use an operation in the output?创建变量而不是在输出中使用操作是否更快(或更有效)?
【发布时间】:2014-05-07 15:30:41
【问题描述】:

我目前正在创建一个程序(实际上,我已经完成了),它将千字节转换为字节和兆字节。

这很容易,我花了几秒钟的时间来创建它。我的问题是我设法找到了大量的解决方案,这让我想知道哪个更有效。

这是字节输出的示例:

System.out.println(kiloByte + " KB = " + (1024 * kiloByte) + " bytes");

但想象一下,如果我必须在不同的地方打印字节,而不是我必须有类似的东西

System.out.println((1024 * kiloByte) + " " + (1024 * kiloByte));

在我看来,最好创建一个变量,而不是两次执行相同的操作,因此看起来像这样:

int vbyte = 1024 * kiloByte;
System.out.println( vbyte + " " + vbyte);  // vbyte as a variable for bytes

虽然,我不能完全确定是这样,所以,我假设第一个版本比第二个慢是正确的吗?

【问题讨论】:

  • 换句话说,如果我要多次重复相同的操作,是否最好创建一个变量然后调用它?
  • 您可以测试它并与我们分享结果。
  • 通常,只有在多次发出调用(例如在循环中)时,操作才有意义,您也可以查看String 连接与使用StringBuilder。但是,如果您不断重复信息,那么所有这些都非常重要,定期重复这些信息并没有那么重要。
  • @CeilingGecko 这里不需要 StringBuilder,javac 会自动为您完成。
  • @arghtype 在没有安全环境的情况下进行测试(例如,在这种情况下,几乎不可能保证速度降低仅仅是程序的错误;)

标签: java variables output


【解决方案1】:

JVM 可能会发现它们是相同的计算并且只执行一次。但即使没有,在任何现代 CPU 上乘法所需的时间都不到一纳秒,因此您不会注意到差异,尤其是在打印时,这需要比这多几个数量级的时间...

现在从可读性的角度来看,使用命名良好的变量通常是一件好事,所以选择选项 2。

【讨论】:

  • 我同意你关于可读性的观点(我实际上在它下面有一行解释了这个过程)。但是,很高兴您提到 JVM 会这样做,我不知道,非常感谢 :)
  • +1 用于提及以良好的变量名称表达意图。
【解决方案2】:

一般而言,您无需担心此类操作。您编写的代码将由编译器自动优化;所以这不会让你的程序变慢。

在这种情况下,编译器会在打印操作之前生成一个temp变量并将值存储到temp var中。这个 temp 变量 将替换要打印的字符串中的 (1024 * 千字节);同样,该操作不会多次执行。这是一种由编译器完成的基本优化,称为 "Common_subexpression_elimination" (http://en.wikipedia.org/wiki/Common_subexpression_elimination)。 并且通常Java编译器相比其他编译器在优化方面非常出色。

如果您想了解更多关于通用编译器优化技术,您可以阅读:http://en.wikipedia.org/wiki/Optimizing_compiler

在传递给 println 之前,编译器甚至会为您正在打印的组合字符串生成一个临时变量。以Click here 为例。

【讨论】:

  • 很抱歉延迟接受 awnser,我本来打算马上做的,但是 stackoverflow 没有让我再等 'x' 分钟,然后我忘记了:/,无论如何,谢谢:)
【解决方案3】:

是的,第一个版本可能比第二个版本慢,但是对于这样一个微不足道的例子,它几乎不会引起注意,甚至可能会被编译器优化。当您有更复杂和更昂贵的操作时,重用该值将产生明显更好的性能。

【讨论】:

  • 是的,我明白这一点,不过,如果我将操作 'n' 次使用到真正重要的程度,那将是矫枉过正,因为这只是一个简单的示例 =)跨度>
  • @user3126359 同意,但 n 必须真的 很大才能起作用,在这种情况下,可能还有其他操作会减慢进一步降低您的代码,例如字符串连接。 ;)
  • 没错,我这样做只是为了理论,通常当我编写简单的事情时,我会尝试思考如何改进它们,这样当我重用代码时效率会更高
  • @user3126359 反思你的代码总是好的,只要注意不要陷入过早的优化陷阱。 :)
【解决方案4】:

我们在数据结构中有时间空间权衡的概念;我想用谁的本质来给你解释答案。

时间与记忆成反比。

当您将计算分配给变量时,它只计算一次计算,并且仅使用该变量即可在程序中的许多地方使用存储的结果。这里我们使用内存来弥补计算所用的时间。

在程序中将计算放在多个位置的另一部分会导致在多个位置重复计算。在这里,我们牺牲了时间来节省内存。

时间空间折衷适用于所有计算机语言,是各种程序复杂性最小化的基础。这取决于我们选择什么,时间效率或空间(内存)效率取决于问题所涉及的情况。

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    相关资源
    最近更新 更多