f597eec152
This CL adds support for two byte string comparisons to the StringEqual builtin, which so far was bailing out to the generic %StringEqual runtime function whenever any two-byte string was involved. This made comparisons that involved two-byte strings, either comparing them to one-byte strings or comparing two two-byte strings, up to 3x slower than if only one-byte strings were involved. With this change, all direct string (SeqString or ExternalString) equality checks are roughly on par now, and the weird performance cliff is gone. On the micro-benchmark from the bug we go from stringEqualBothOneByteSeqString: 162 ms. stringEqualTwoByteAndOneByteSeqString: 446 ms. stringEqualOneByteAndTwoByteSeqString: 438 ms. stringEqualBothTwoByteSeqString: 472 ms. to stringEqualBothOneByteSeqString: 151 ms. stringEqualTwoByteAndOneByteSeqString: 158 ms. stringEqualOneByteAndTwoByteSeqString: 166 ms. stringEqualBothTwoByteSeqString: 160 ms. which is the desired result. On the esprima test of the web-tooling-benchmark we seem to improve by 1-2%, which corresponds to the savings of going to the runtime for many StringEqual comparisons. Drive-by-cleanup: Introduce LoadAndUntagStringLength helper into the CSA with proper typing to avoid the unnecessary shifts on 64-bit platforms when keeping the length tagged initially in StringEqual. Bug: v8:4913, v8:6365, v8:6371, v8:6936, v8:7022 Change-Id: I566f4b80e217513775ffbd35e0480154abf59b27 Reviewed-on: https://chromium-review.googlesource.com/749223 Reviewed-by: Yang Guo <yangguo@chromium.org> Commit-Queue: Benedikt Meurer <bmeurer@chromium.org> Cr-Commit-Position: refs/heads/master@{#49067}
18 lines
507 B
JavaScript
18 lines
507 B
JavaScript
// Copyright 2017 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
(function() {
|
|
const s = '\u8765abc';
|
|
|
|
assertTrue(s === s);
|
|
assertFalse(s === 'abc');
|
|
assertFalse('abc' === s);
|
|
assertTrue(s.slice(-3) === 'abc');
|
|
assertTrue('abc' === s.slice(-3));
|
|
assertTrue(s.slice(0, 1) === '\u8765');
|
|
assertTrue('\u8765' === s.slice(0, 1));
|
|
assertTrue(s === '' + s);
|
|
assertTrue('' + s === s);
|
|
})();
|