【问题标题】:Without using a third variable at all, swap X and Y values完全不使用第三个变量,交换 X 和 Y 值
【发布时间】:2014-11-21 02:50:15
【问题描述】:
var x=10;
var y=5;

解决方案 1

x= x + y 
y= x - y 
x= x - y 

解决方案 2

x=y+x,y=x-y,x=x-y;

这两个解决方案彼此相等,但第二个解决方案更快,为什么?

谁能告诉我 JS 引擎为这两种解决方案生成的优化操作码?

【问题讨论】:

  • 解决方案 1 和解决方案 2 是相同的代码。
  • 当心你是否期望整数算术并且 x 和 y 是 v.large 数量级 - 因为 x + y 可能超出整数范围。
  • 除此之外,速度可能取决于使用 += 和 -= 运算符(在 C 中曾经如此) x += y; y = x - y; x -= y;
  • 正如预期的那样,一个更快的断言是完全错误的:jsperf.com/two-ways-of-swapping
  • 不,这不是 stackoverflow.com/questions/16201656/… 的副本。实际上阅读上面的问题,它是关于优化的,为什么会比另一个更快。 (这是错误的,但不是重复的。)

标签: javascript optimization


【解决方案1】:

嗯,在 Ecmascript 6 中你可以这样做:

var x=10;
var y=5;

[x,y] = [y,x]
console.log(x,y) // 5, 10

如果没有,这里已经有一个好方法:How to swap two variables in JavaScript

至于你有的2个方法,怀疑有什么不同,你应该先尝试检查多次测试是否存在很大的时间差

【讨论】:

    【解决方案2】:

    无论是解决方案还是使用 XOR,我都找不到任何有意义的性能差异。 Non on the test 总是更快,所以我认为问题的前提是不正确的。

    JSLitmus.test('Solution1', function() {
        var x = 10;
        var y = 5;    
        x = x + y;
        y = x - y;
        x = x - y;
    });
    
    JSLitmus.test('Solution2', function() {
        var x = 10;
        var y = 5;
        x = y + x, y = x - y, x = x - y;
    });
    
    JSLitmus.test('Solution3', function() {
        var x = 10;
        var y = 5;
        x ^= y;
        y ^= x;
        x ^= y;
    });
    

    http://jsfiddle.net/6L0d6rpn/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多