首先,问题是:

如何确定功能未优化的原因?

例如,这是我其中一项功能的去优化条目:

[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]

我怀疑原因虽然不是很清楚,但这是:



在哪里可以找到有关此以及其他非优化原因的更多信息?更重要的是,如何确定我的JS代码的哪一部分导致了这种去优化?

对于其他功能,这是我看到的其他一些不优化的原因:
  • deoptimize: Insufficient type feedback for generic named access
  • deoptimize: Insufficient type feedback for RHS of binary operation
  • jump table entry X: deoptimization bailout Y.-许多带有不同数字的

  • 用通俗易懂的话来说,我希望能够查看此日志并说:“好吧,我的函数未优化,因为v8预测我只会使用字符串作为其函数参数,在这里我用整数来调用它”(或类似的东西) 。

    我也想了解更多有关在这些日志中可以看到的其他信息的信息,例如,各种不优化的含义是什么(渴望,软等)?第一行中的数字是什么意思?在提高性能的同时,我对本日志还有什么兴趣呢?

    如果以任何方式相关,则上面的日志中未优化的代码为here,并通过运行项目的根目录来生成日志(通过运行库的基准):
    node --trace_deopt --code_comments bench

    最佳答案

    Petka Antonov(蓝鸟的创建者)describes some optimization killers here。我不知道如何解释您的V8输出,但是your code确实包含for-in循环,在某些情况下可能会导致优化不足。例如,如果要迭代的对象在hashtable mode中。从本文中:



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

    关于javascript - 确定去优化的原因,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31036060/

    10-15 23:02