【问题标题】:Javascript deoptimizationJavascript 去优化
【发布时间】:2014-10-10 11:20:18
【问题描述】:

我不确定这段代码有什么问题。 src 是一个长度大于 0 的Uint8Array 对象。

function makeImageFromChannel(src) {
  var image = new Uint8Array(src.length * 4),
      i = 0,
      index = 0,
      value = 0;

  console.log(src.BYTES_PER_ELEMENT)
  console.log(src.map)

  for (i=0; i<src.length; i++) {
    value = src[i]|0;
    image[index]     = value;
    image[index + 1] = value;
    image[index + 2] = value;
    image[index + 3] = 255;
    index += 4;
  }

  return image;
}

var vars = new Uint8Array(23034);
for(var i=0; i<23034; i++) {
  vars[i] = (i % 254) + 1
}
makeImageFromChannel(vars);

当我运行此命令node --trace_deopt --allow-natives-syntax script.js 时,我可以在终端中多次读取以下内容。

[deoptimizing: begin 0x36125ec63a21 makeImageFromChannel @13]
  translating makeImageFromChannel => node=59, height=24
    0x7fff5fbfe798: [top + 64] <- 0x3feb15c04121 ; r8 0x3feb15c04121 <undefined>
    0x7fff5fbfe790: [top + 56] <- 0x2bc986d9ffc1 ; rdi 0x2bc986d9ffc1 <an Uint8Array>
    0x7fff5fbfe788: [top + 48] <- 0x2ea32af21c29 ; caller's pc
    0x7fff5fbfe780: [top + 40] <- 0x7fff5fbfe808 ; caller's fp
    0x7fff5fbfe778: [top + 32] <- 0x3feb15c414b1; context
    0x7fff5fbfe770: [top + 24] <- 0x36125ec63a21; function
    0x7fff5fbfe768: [top + 16] <- 0x2bc986c218d1 ; rdx 0x2bc986c218d1 <an Uint8Array>
    0x7fff5fbfe760: [top + 8] <- 135448 ; rbx (smi)
    0x7fff5fbfe758: [top + 0] <- 541792 ; rax (smi)
[deoptimizing: end 0x36125ec63a21 makeImageFromChannel => node=59, pc=0x2ea32af27c70, state=NO_REGISTERS, alignment=no padding, took 0.033 ms]
[removing optimized code for: makeImageFromChannel]

我不确定它是如何在其中找到未定义值的。

【问题讨论】:

  • 也许src 有一些?
  • 这是一个类型化数组,它不能有未定义的值。
  • 请提供重现问题的代码。也就是说,某些src 会发生这种情况。
  • 也许你只有认为 src是一个类型化数组?
  • 不,如果我输出 BYTES_PER_ELEMENT 它会在控制台中写入 1。

标签: node.js deoptimization


【解决方案1】:

由于某些原因,V8 会去优化一个像这样访问数组的函数:

  for (i=0; i<src.length; i++) {
    value = src[i]|0;
    image[index]     = value;
    image[index + 1] = value;
    image[index + 2] = value;
    image[index + 3] = 255;
    index += 4;
  }

为了让V8不去优化这个功能,你可以像这样倒序重新排序做作:

    image[index + 3] = 255;
    image[index + 2] = value;
    image[index + 1] = value;
    image[index] = value;

V8 会很高兴。这或多或少听起来像是 v8 引擎中的错误,而不是其他任何东西。引擎应该能够检测到重新排序这 4 行对结果没有任何影响。这意味着即使行是任何顺序的,v8 也应该能够优化功能。

还不清楚 spidermonkey 如何优化这些行。

我会接受任何能够更好地解释为什么 V8 会被取消优化的答案。

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2011-08-01
    • 2020-06-20
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多