Javascript 确定去优化的原因

Javascript 确定去优化的原因,javascript,node.js,optimization,v8,Javascript,Node.js,Optimization,V8,首先,问题是: 我如何确定我的功能去优化的原因? 例如,下面是我的一个函数的去优化条目: [deoptimizing (DEOPT eager): begin 0x3ca09e9f4d1 mergeObjects (opt #50) @12, FP to SP delta: 96] ;;; jump table entry 8: deoptimization bailout 12. translating mergeObjects => node=43, hei

首先,问题是:

我如何确定我的功能去优化的原因? 例如,下面是我的一个函数的去优化条目:

[deoptimizing (DEOPT eager): begin 0x3ca09e9f4d1 mergeObjects (opt #50) @12, FP to SP delta: 96]
            ;;; jump table entry 8: deoptimization bailout 12.
  translating mergeObjects => node=43, height=64
    0x7fff5fbfecd0: [top + 128] <- 0xcd290004121 ; [sp + 144] 0xcd290004121 <undefined>
    0x7fff5fbfecc8: [top + 120] <- 0x3ca09e9ca19 ; [sp + 136] 0x3ca09e9ca19 <an Object with map 0x4c8d818621>
    0x7fff5fbfecc0: [top + 112] <- 0x2c9b8b1b95a9 ; [sp + 128] 0x2c9b8b1b95a9 <an Object with map 0x7e33a207821>
    0x7fff5fbfecb8: [top + 104] <- 0x2c9b8b1b9229 ; rax 0x2c9b8b1b9229 <JS Array[0]>
    0x7fff5fbfecb0: [top + 96] <- 0xcd290004181 ; [sp + 112] 0xcd290004181 <false>
    0x7fff5fbfeca8: [top + 88] <- 0x2481f54fb4b6 ; caller's pc
    0x7fff5fbfeca0: [top + 80] <- 0x7fff5fbfed40 ; caller's fp
    0x7fff5fbfec98: [top + 72] <- 0x3ca09e8eae1; context
    0x7fff5fbfec90: [top + 64] <- 0x3ca09e9f4d1; function
    0x7fff5fbfec88: [top + 56] <- 0x70a69429aa1 ; [sp + 32] 0x70a69429aa1 <String[3]: key>
    0x7fff5fbfec80: [top + 48] <- 0xcd290004121 <undefined> ; literal
    0x7fff5fbfec78: [top + 40] <- 0xcd290004121 <undefined> ; literal
    0x7fff5fbfec70: [top + 32] <- 0x3ca09e9ca19 ; [sp + 136] 0x3ca09e9ca19 <an Object with map 0x4c8d818621>
    0x7fff5fbfec68: [top + 24] <- 0x4c8d818621 ; [sp + 64] 0x4c8d818621 <Map(elements=3)>
    0x7fff5fbfec60: [top + 16] <- 0x2c9b8b014341 ; [sp + 56] 0x2c9b8b014341 <FixedArray[3]>
    0x7fff5fbfec58: [top + 8] <- 0x300000000 ; [sp + 48] 3
    0x7fff5fbfec50: [top + 0] <- 0 ; [sp + 40] (smi)
[deoptimizing (eager): end 0x3ca09e9f4d1 mergeObjects @12 => node=43, pc=0x2481f54ecd00, state=NO_REGISTERS, alignment=no padding, took 0.060 ms]
[removing optimized code for: mergeObjects]
[deoptimize(DEOPT-eager):开始0x3ca09e9f4d1合并对象(opt#50)@12,FP到SP增量:96]
;;; 跳转表条目8:去优化援助12。
转换合并对象=>节点=43,高度=64
0x7fff5fbfecd0:[top+128]Petka Antonov(蓝鸟的创造者)。我不知道如何解释您的V8输出,但确实包含for-in循环,这在某些情况下会导致去优化。例如,如果正在迭代的对象处于。从书面文件:

对象将进入哈希表模式,例如,当您动态添加太多属性(在构造函数外部)、删除属性、使用不能作为有效标识符的属性等。换句话说,当您像使用哈希表一样使用对象时,它将转换为哈希表。在Node.JS中启用标志--allow natives语法时,可以通过调用console.log(%HasFastProperties(obj))来判断对象是否处于哈希表模式


这一级别的V8优化看起来确实像某种黑暗的艺术:)希望能有所帮助

您是如何从node获得该输出的?这看起来很有趣。我已经更新了答案以包含这些信息。这些是v8的选项-例如,您可以在Node的
man
页面上看到所有这些选项,或者通过运行
Node--v8 options
。如果您的节点足够新(最好是io.js,但我认为0.12也可以),那么您可以使用IRHydra-@VyacheslavEgorov,我认为您可以将其作为答案发布。我最近试过Hydra,它看起来是目前用于这些目的的最好的产品。