From f0ea725b40ac29a3a9ee2a050617b631a62d757e Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sat, 26 Oct 2019 17:59:28 +0700 Subject: [PATCH] add a workaround of V8 deoptimization which causes serious performance degradation of `Array#concat`, #679 --- CHANGELOG.md | 1 + packages/core-js/modules/es.array.concat.js | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94af26a51e00..b2669a962603 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## Changelog ##### Unreleased +- Added a workaround of V8 deoptimization which causes serious performance degradation (~4x in my tests) of `Array#concat`, [#679](https://github.com/zloirock/core-js/issues/679) - Added compat data for Chromium-based Edge ##### 3.3.4 - 2019.10.25 diff --git a/packages/core-js/modules/es.array.concat.js b/packages/core-js/modules/es.array.concat.js index c819dd58ed1c..d850844ae571 100644 --- a/packages/core-js/modules/es.array.concat.js +++ b/packages/core-js/modules/es.array.concat.js @@ -9,12 +9,16 @@ var createProperty = require('../internals/create-property'); var arraySpeciesCreate = require('../internals/array-species-create'); var arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support'); var wellKnownSymbol = require('../internals/well-known-symbol'); +var V8_VERSION = require('../internals/v8-version'); var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable'); var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF; var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded'; -var IS_CONCAT_SPREADABLE_SUPPORT = !fails(function () { +// We can't use this feature detection in V8 since it causes +// deoptimization and serious performance degradation +// https://github.com/zloirock/core-js/issues/679 +var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () { var array = []; array[IS_CONCAT_SPREADABLE] = false; return array.concat()[0] !== array;