我正在创建一个程序(实际上,我已经完成了它),它将kiloBytes转换为字节和MegaBytes。
这很简单,创建它花了我几秒钟。我的问题是我设法找到了大量的解决方案,这让我感到奇怪,这更有效率。
这是字节输出的示例:
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
尽管如此,我并不完全确定是这种情况,所以,我认为第一个版本比第二个版本慢吗?
答案 0 :(得分:5)
JVM可能会发现它们是相同的计算并且只执行一次。但即使它没有,在任何现代CPU上乘法都需要不到一纳秒的时间,因此你不会注意到这种差异,特别是在打印时,这需要花费几个数量级的时间...... < / p>
现在从可读性的角度来看,使用命名良好的变量通常是一件好事,所以选择2。
答案 1 :(得分:2)
通常,您无需担心此类操作。您编写的代码将由编译器自动优化;所以这不会让你的程序变慢。
在这种情况下,编译器将生成 temp变量,并在打印操作之前将值存储到 temp var中。此 temp变量将替换要打印的字符串中的(1024 * kiloByte);因此,操作不会多次进行。这是由编译器完成的一种基本优化,称为“Common_subexpression_elimination”(http://en.wikipedia.org/wiki/Common_subexpression_elimination)。 通常,与其他编译器相比,Java编译器在优化方面非常出色。
如果您想了解有关常规编译器优化技术的更多信息,请阅读:http://en.wikipedia.org/wiki/Optimizing_compiler
在传递给println之前,编译器甚至会为您要打印的组合字符串生成临时变量。 Click here举个例子。
答案 2 :(得分:1)
是的,第一个版本可能比第二个版本慢,但是有了这样一个简单的例子,它几乎是不可察觉的,甚至可能被编译器优化。如果您有更复杂和昂贵的操作,那么重用该值将会产生明显更好的性能。
答案 3 :(得分:1)
我们有一个数据结构中时空权衡的概念;我想用它来解释你的答案。
时间与记忆成反比。
当您为变量分配计算时,它只计算一次计算,并且只需使用该变量,存储的结果就可以在程序的许多地方使用。在这里,我们使用内存来弥补计算中使用的时间。
将计算放在程序中多个位置的另一部分会导致多个位置重复计算。在这里,我们牺牲了时间来节省记忆。
时空权衡适用于所有计算机语言,是各种程序复杂性最小化的基础。根据问题所涉及的情况,我们选择的是时间效率还是空间(记忆)效率。