【问题标题】:Which is better to swap numbers? Using temporary variable or without it? Does it even matter?换号码哪个好?使用临时变量还是不使用它?这还重要吗?
【发布时间】:2018-04-03 10:09:49
【问题描述】:

有人问我一个问题,即在不使用临时变量的情况下交换两个数字。用以下答案很容易回答这个问题。

与临时变量交换

int a =10;
int b =20;
int temp = a;
a = b;
b = temp;

没有临时变量的交换

int a =10;
int b =20;
a = a+b;
b = a-b;
a = a-b;

它有效,但在性能方面哪个更好?我认为只有一次操作性能无关紧要。但是,如果我需要使用这种交换方法或在需要交换等的选择排序期间反转大量数字,创建局部变量更好还是使用算术运算来完成?

【问题讨论】:

  • 你问的是Java还是Javascript?它们是完全不同的语言。这看起来像 Java 而不是 Javascript - 如果您实际上只对 Java 感兴趣,请删除 Javascript 标记。
  • 第一个更具可读性。考虑它不应该对性能产生太大影响
  • 在您发布的示例中没有临时变量的交换很容易出现overflow issues。这在 Java 中无关紧要,但其他语言可能会有问题。

标签: java performance reverse swap


【解决方案1】:

我肯定会说 temp 变量,即您的第一个选项。如果您参考第二个示例,您总共完成了三个操作。对于每个操作,您的 java 虚拟机都会生成等效的组装操作。但是在您使用temp 变量的第一个选项中,您只是在交换值。因此,极少的汇编操作仅用于从地址读取和写入地址。

【讨论】:

  • 确实如此。优化后,temp 变量几乎肯定被忽略了——a 被复制到一个寄存器,b 被复制到另一个。然后a的值存储在b中,b的值存储在a中。
【解决方案2】:

除了第二个可能溢出的事实之外,还有三个可能的答案:

  1. 你可以测量它。
  2. 如果您已经测量过这种优化级别,并且这确实被证明是一个问题,请只考虑这种优化级别。 (在这种情况下,您几乎不可能测量出任何明显的差异。)
  3. 如有疑问,通常最好选择更简单/更规范的解决方案。许多优化都是基于您编写“正常”代码的前提,并且会寻找开发人员通常使用的模式。幼稚的优化工作有时会导致 Java Hotspot 的性能下降。

因此,除非您想深入了解奇妙而棘手(但很有趣)的微基准测试世界,否则请使用 temp 变量。

*尽管由于 Java 处理溢出的方式,您仍然会得到正确的结果。但顺便说一句,如果你使用异或而不是算术运算,就不会有溢出的危险。

P.s.:如果你正在反转一个巨大的数组,运行时间将主要由对数组的内存访问支配。

【讨论】:

  • 您能否举一个ab 值的示例,这些值使用第二种方法会产生错误的结果?是的,a+ba-b 可以上溢/下溢,但这会产生错误的交换结果吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2018-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多