Skip to content

Commit

Permalink
perf: Binary search in token store utils.search (#17066)
Browse files Browse the repository at this point in the history
* perf: Binary search in token store `utils.search`

* Use `Math.trunc`

* Switch back to `| 0`, inline `getStartLocation`
  • Loading branch information
fasttime committed Apr 11, 2023
1 parent 07a4435 commit 9d1b8fc
Showing 1 changed file with 21 additions and 16 deletions.
37 changes: 21 additions & 16 deletions lib/source-code/token-store/utils.js
Expand Up @@ -4,20 +4,6 @@
*/
"use strict";

//------------------------------------------------------------------------------
// Helpers
//------------------------------------------------------------------------------

/**
* Gets `token.range[0]` from the given token.
* @param {Node|Token|Comment} token The token to get.
* @returns {number} The start location.
* @private
*/
function getStartLocation(token) {
return token.range[0];
}

//------------------------------------------------------------------------------
// Exports
//------------------------------------------------------------------------------
Expand All @@ -30,9 +16,28 @@ function getStartLocation(token) {
* @returns {number} The found index or `tokens.length`.
*/
exports.search = function search(tokens, location) {
const index = tokens.findIndex(el => location <= getStartLocation(el));
for (let minIndex = 0, maxIndex = tokens.length - 1; minIndex <= maxIndex;) {

return index === -1 ? tokens.length : index;
/*
* Calculate the index in the middle between minIndex and maxIndex.
* `| 0` is used to round a fractional value down to the nearest integer: this is similar to
* using `Math.trunc()` or `Math.floor()`, but performance tests have shown this method to
* be faster.
*/
const index = (minIndex + maxIndex) / 2 | 0;
const token = tokens[index];
const tokenStartLocation = token.range[0];

if (location <= tokenStartLocation) {
if (index === minIndex) {
return index;
}
maxIndex = index;
} else {
minIndex = index + 1;
}
}
return tokens.length;
};

/**
Expand Down

0 comments on commit 9d1b8fc

Please sign in to comment.