javascript - Chrome的V8不会因为 "tagged-to-i: not a heap number"而优化功能

标签 javascript optimization v8 profiler deoptimization

我有一个函数,应该将 X 舍入到 A 的最接近的倍数。

这是 JavaScript 代码:

var round = function (x, a) {
  "use strict";

  if (typeof a === "undefined") {
    return Math.round(x);
  }

  var half = a / 2,
      sign = this.sign(x),
      absolute = Math.abs(x),
      factor = absolute / a|0,
      remainder = absolute % a;

  return sign * a * (factor + (remainder < half ? 0 : 1));
};

当我在 Chrome 的 V8 中执行 --trace_deopt --code_comments 时,我在日志中收到以下消息:

[deoptimizing (DEOPT eager): begin 0x988464b35b1 round (opt #13) @13, FP to SP delta: 24]
 591             ;;; deoptimize at <0:70499> tagged-to-i: not a heap number
 592   translating round => node=67, height=48
 593     0x7fff571f2ed0: [top + 96] <- 0x11b5fb674cf9 ; rdi 0x11b5fb674cf9 <JS Object>
 594     0x7fff571f2ec8: [top + 88] <- 0x2459b11f1d89 ; r8 0x2459b11f1d89 <Number: 45>
 595     0x7fff571f2ec0: [top + 80] <- 0x2d00000000 ; [sp + 40] 45
 596     0x7fff571f2eb8: [top + 72] <- 0xbef1cdacfe5 ; caller's pc
 597     0x7fff571f2eb0: [top + 64] <- 0x7fff571f3090 ; caller's fp
 598     0x7fff571f2ea8: [top + 56] <- 0x11b5fb674d61 ; [sp + 0] 0x11b5fb674d61 <FixedArray[133]>
 599     0x7fff571f2ea8: [top + 56] <- 0x11b5fb674d61; context
 600     0x7fff571f2ea0: [top + 48] <- 0x988464b35b1; function
 601     0x7fff571f2e98: [top + 40] <- 22 ; rcx (smi)
 602     0x7fff571f2e90: [top + 32] <- 0x34565d404121 <undefined> ; literal
 603     0x7fff571f2e88: [top + 24] <- 0x34565d404121 <undefined> ; literal
 604     0x7fff571f2e80: [top + 16] <- 0x34565d404121 <undefined> ; literal
 605     0x7fff571f2e78: [top + 8] <- 0x34565d404121 <undefined> ; literal
 606     0x7fff571f2e70: [top + 0] <- 1 ; rsi (smi)
 607 [deoptimizing (eager): end 0x988464b35b1 round @13 => node=67, pc=0xbef1cd97be6, state=TOS_REG, alignment=no padding, took 0.084 ms]
 608 [removing optimized code for: round]
 609 [evicting entry from optimizing code map (notify deoptimized) for 0x34565d492be1 <SharedFunctionInfo round>]

有人知道tagged-to-i: not a heap number是什么意思吗?

提前致谢!

最佳答案

tagged-to-i: not a heap number本质上意味着 V8 正在尝试将非原始数字的值转换为整数。

最初我认为翻译框架中的第一个参数( x )是 Number对象,因为它被打印为 <Number: 45> ,但事实证明 V8 打印 HeapNumber以这种方式对象[1]。在正常情况下,尝试对堆号进行拆箱不应导致非堆号去优化。因此,这要么是由于不同的变量而导致的取消优化,要么是取消优化的原因不准确。

;; this
0x7fff571f2ed0: [top + 96] <- 0x11b5fb674cf9 ; rdi 0x11b5fb674cf9 <JS Object>
;; x
0x7fff571f2ec8: [top + 88] <- 0x2459b11f1d89 ; r8 0x2459b11f1d89 <Number: 45>
;; a
0x7fff571f2ec0: [top + 80] <- 0x2d00000000 ; [sp + 40] 45

[1] https://github.com/v8/v8-git-mirror/blob/4f9193e047d50b1ffbca95e8185576af82c722b3/src/objects.cc#L1546-L1551

关于javascript - Chrome的V8不会因为 "tagged-to-i: not a heap number"而优化功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27616028/

相关文章:

c++ - gcc中使用内联汇编的调用方法

javascript - 使元素仅在窗口缩小时水平移动

javascript - 如何使用 jQuery 将 HTML 覆盖动态添加到表格行?

javascript - 将 jquery 插件 (selectric) 应用到 ko 绑定(bind)下拉列表

java - 内存重新排序如何帮助处理器和编译器?

javascript - Node.js 0.12 中提供的 ECMAScript 6 功能

javascript - 如何计算 openweathermap.org JSON 中返回的摄氏温度?

mysql - 如何过滤多个连接表中的相似字段

c++ - 优化 C++ 模板执行

php - PHP 的 LESS 编译器