2014-12-23 3 views
2

У меня есть функция, которая, как предполагается округлить X до ближайшего кратного А.Chrome не будет оптимизировать функцию из-за «меченой к I: не число кучи»

Вот код в 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)); 
}; 

Когда я делаю --trace_deopt --code_comments в V8 Chrome, я получаю это сообщение в логах:

[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 значит?

Заранее благодарен!

ответ

2

tagged-to-i: not a heap number по существу означает, что V8 пытается преобразовать значение, не являющееся примитивным числом в целое число.

Первоначально я думал, что первый аргумент (x) из рамки перевода является Number объектом, поскольку он печатается как <Number: 45>, но, как выясняется, V8 печатает HeapNumber объектов этого пути [1]. В обычных условиях попытка распаковать номер кучи не должна вызывать не кучу deoptimization. Таким образом, это либо деопт из-за разной переменной, либо причина деоптимизации неточна.

;; 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

+0

Первый параметр был элемент из Float32Array, который, казалось, причиной этой проблемы. –

+0

@PaulB Я проверил код, и выяснилось, что моя память потерпела неудачу, и я был фактически неверным: -/Посмотрев на процедуры печати в 'objects.cc' (а именно' HeapObjectShortPrint'), я увидел, что это на самом деле HeapNumbers, которые напечатаны как '' не 'Number' обертки (что несколько запутывает). Поэтому он не должен исчезать из-за 'x'. Таким образом, мой ответ неверен. Я исправил свой ответ. Извините за путаницу. –

 Смежные вопросы

  • Нет связанных вопросов^_^