]> git.wincent.com - hextrapolate.git/commitdiff
Massive speed-up by avoiding Chrome de-opt in hottest function
authorGreg Hurrell <greg@hurrell.net>
Sun, 2 Aug 2015 06:19:05 +0000 (23:19 -0700)
committerGreg Hurrell <greg@hurrell.net>
Sun, 2 Aug 2015 06:20:01 +0000 (23:20 -0700)
I became suspicious of the Math calls thanks to this thread:

https://groups.google.com/forum/#!msg/google-chrome-developer-tools/Y0J2XQ9iiqU/H60qqZNlQa8J

Turns out, those were the culprit.

src/addDigits.js

index 4a3de34e1a85c21f30e9919630fa45b3aa77c783..27d998ec93860ed0ba4eede1ed47b9facd00998c 100644 (file)
@@ -14,16 +14,15 @@ export default function addDigits(
 ): Array<number> {
   let result = [];
   let carry = 0;
-  for (
-    let i = 0, max = Math.max(aDigits.length, bDigits.length);
-    i < max || carry;
-    i++
-  ) {
-    const aDigit = aDigits[i] || 0;
-    const bDigit = bDigits[i] || 0;
+  for (let i = 0; i < aDigits.length || i < bDigits.length || carry; i++) {
+    const aDigit = i < aDigits.length ? aDigits[i] : 0;
+    const bDigit = i < bDigits.length ? bDigits[i] : 0;
     const sum = aDigit + bDigit + carry;
     result.push(sum % base);
-    carry = Math.floor(sum / base);
+
+    // ~~ here is the equivalent of Math.floor; used to avoid V8 de-opt,
+    // "Reference to a variable which requires dynamic lookup".
+    carry = ~~(sum / base);
   }
   return result.length ? result : [0];
 }