Skip to content

Commit

Permalink
perf: various performance improvements (#17135)
Browse files Browse the repository at this point in the history
* perf: addParensIndent replaced shifting with reverse iteration

* perf: changed string handling from regex to manual parsing

* refactor: more explicit

* perf: remove unnessisary array and object creation

* pref: opimized out reduce for basic iteration

* perf: replaced reduce with basic iteration

* perf: optimized unessisary array creation and objects

* perf: replaced reduce with basic iteration

* perf: replaced reduce with basic iteration

* perf: replaced filter with basic loop for counting valid elements

* perf: removed array creation in indent program exit
  • Loading branch information
moonlightaria committed Jun 22, 2023
1 parent da81e66 commit f82e56e
Show file tree
Hide file tree
Showing 8 changed files with 203 additions and 173 deletions.
45 changes: 27 additions & 18 deletions lib/cli-engine/cli-engine.js
Expand Up @@ -158,7 +158,17 @@ function validateFixTypes(fixTypes) {
* @private
*/
function calculateStatsPerFile(messages) {
return messages.reduce((stat, message) => {
const stat = {
errorCount: 0,
fatalErrorCount: 0,
warningCount: 0,
fixableErrorCount: 0,
fixableWarningCount: 0
};

for (let i = 0; i < messages.length; i++) {
const message = messages[i];

if (message.fatal || message.severity === 2) {
stat.errorCount++;
if (message.fatal) {
Expand All @@ -173,14 +183,8 @@ function calculateStatsPerFile(messages) {
stat.fixableWarningCount++;
}
}
return stat;
}, {
errorCount: 0,
fatalErrorCount: 0,
warningCount: 0,
fixableErrorCount: 0,
fixableWarningCount: 0
});
}
return stat;
}

/**
Expand All @@ -190,20 +194,25 @@ function calculateStatsPerFile(messages) {
* @private
*/
function calculateStatsPerRun(results) {
return results.reduce((stat, result) => {
stat.errorCount += result.errorCount;
stat.fatalErrorCount += result.fatalErrorCount;
stat.warningCount += result.warningCount;
stat.fixableErrorCount += result.fixableErrorCount;
stat.fixableWarningCount += result.fixableWarningCount;
return stat;
}, {
const stat = {
errorCount: 0,
fatalErrorCount: 0,
warningCount: 0,
fixableErrorCount: 0,
fixableWarningCount: 0
});
};

for (let i = 0; i < results.length; i++) {
const result = results[i];

stat.errorCount += result.errorCount;
stat.fatalErrorCount += result.fatalErrorCount;
stat.warningCount += result.warningCount;
stat.fixableErrorCount += result.fixableErrorCount;
stat.fixableWarningCount += result.fixableWarningCount;
}

return stat;
}

/**
Expand Down
44 changes: 26 additions & 18 deletions lib/eslint/flat-eslint.js
Expand Up @@ -103,7 +103,17 @@ const importedConfigFileModificationTime = new Map();
* @private
*/
function calculateStatsPerFile(messages) {
return messages.reduce((stat, message) => {
const stat = {
errorCount: 0,
fatalErrorCount: 0,
warningCount: 0,
fixableErrorCount: 0,
fixableWarningCount: 0
};

for (let i = 0; i < messages.length; i++) {
const message = messages[i];

if (message.fatal || message.severity === 2) {
stat.errorCount++;
if (message.fatal) {
Expand All @@ -118,14 +128,8 @@ function calculateStatsPerFile(messages) {
stat.fixableWarningCount++;
}
}
return stat;
}, {
errorCount: 0,
fatalErrorCount: 0,
warningCount: 0,
fixableErrorCount: 0,
fixableWarningCount: 0
});
}
return stat;
}

/**
Expand All @@ -135,20 +139,24 @@ function calculateStatsPerFile(messages) {
* @private
*/
function calculateStatsPerRun(results) {
return results.reduce((stat, result) => {
stat.errorCount += result.errorCount;
stat.fatalErrorCount += result.fatalErrorCount;
stat.warningCount += result.warningCount;
stat.fixableErrorCount += result.fixableErrorCount;
stat.fixableWarningCount += result.fixableWarningCount;
return stat;
}, {
const stat = {
errorCount: 0,
fatalErrorCount: 0,
warningCount: 0,
fixableErrorCount: 0,
fixableWarningCount: 0
});
};

for (let i = 0; i < results.length; i++) {
const result = results[i];

stat.errorCount += result.errorCount;
stat.fatalErrorCount += result.fatalErrorCount;
stat.warningCount += result.warningCount;
stat.fixableErrorCount += result.fixableErrorCount;
stat.fixableWarningCount += result.fixableWarningCount;
}
return stat;
}

/**
Expand Down
74 changes: 33 additions & 41 deletions lib/rules/accessor-pairs.js
Expand Up @@ -223,54 +223,46 @@ module.exports = {
}
}

/**
* Creates a new `AccessorData` object for the given getter or setter node.
* @param {ASTNode} node A getter or setter node.
* @returns {AccessorData} New `AccessorData` object that contains the given node.
* @private
*/
function createAccessorData(node) {
const name = astUtils.getStaticPropertyName(node);
const key = (name !== null) ? name : sourceCode.getTokens(node.key);

return {
key,
getters: node.kind === "get" ? [node] : [],
setters: node.kind === "set" ? [node] : []
};
}

/**
* Merges the given `AccessorData` object into the given accessors list.
* @param {AccessorData[]} accessors The list to merge into.
* @param {AccessorData} accessorData The object to merge.
* @returns {AccessorData[]} The same instance with the merged object.
* @private
*/
function mergeAccessorData(accessors, accessorData) {
const equalKeyElement = accessors.find(a => areEqualKeys(a.key, accessorData.key));

if (equalKeyElement) {
equalKeyElement.getters.push(...accessorData.getters);
equalKeyElement.setters.push(...accessorData.setters);
} else {
accessors.push(accessorData);
}

return accessors;
}

/**
* Checks accessor pairs in the given list of nodes.
* @param {ASTNode[]} nodes The list to check.
* @returns {void}
* @private
*/
function checkList(nodes) {
const accessors = nodes
.filter(isAccessorKind)
.map(createAccessorData)
.reduce(mergeAccessorData, []);
const accessors = [];
let found = false;

for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];

if (isAccessorKind(node)) {

// Creates a new `AccessorData` object for the given getter or setter node.
const name = astUtils.getStaticPropertyName(node);
const key = (name !== null) ? name : sourceCode.getTokens(node.key);

// Merges the given `AccessorData` object into the given accessors list.
for (let j = 0; j < accessors.length; j++) {
const accessor = accessors[j];

if (areEqualKeys(accessor.key, key)) {
accessor.getters.push(...node.kind === "get" ? [node] : []);
accessor.setters.push(...node.kind === "set" ? [node] : []);
found = true;
break;
}
}
if (!found) {
accessors.push({
key,
getters: node.kind === "get" ? [node] : [],
setters: node.kind === "set" ? [node] : []
});
}
found = false;
}
}

for (const { getters, setters } of accessors) {
if (checkSetWithoutGet && setters.length && !getters.length) {
Expand Down
14 changes: 10 additions & 4 deletions lib/rules/array-element-newline.js
Expand Up @@ -240,19 +240,25 @@ module.exports = {
.some(element => element.loc.start.line !== element.loc.end.line);
}

const linebreaksCount = node.elements.map((element, i) => {
let linebreaksCount = 0;

for (let i = 0; i < node.elements.length; i++) {
const element = node.elements[i];

const previousElement = elements[i - 1];

if (i === 0 || element === null || previousElement === null) {
return false;
continue;
}

const commaToken = sourceCode.getFirstTokenBetween(previousElement, element, astUtils.isCommaToken);
const lastTokenOfPreviousElement = sourceCode.getTokenBefore(commaToken);
const firstTokenOfCurrentElement = sourceCode.getTokenAfter(commaToken);

return !astUtils.isTokenOnSameLine(lastTokenOfPreviousElement, firstTokenOfCurrentElement);
}).filter(isBreak => isBreak === true).length;
if (!astUtils.isTokenOnSameLine(lastTokenOfPreviousElement, firstTokenOfCurrentElement)) {
linebreaksCount++;
}
}

const needsLinebreaks = (
elements.length >= options.minItems ||
Expand Down
75 changes: 33 additions & 42 deletions lib/rules/grouped-accessor-pairs.js
Expand Up @@ -137,43 +137,6 @@ module.exports = {
});
}

/**
* Creates a new `AccessorData` object for the given getter or setter node.
* @param {ASTNode} node A getter or setter node.
* @returns {AccessorData} New `AccessorData` object that contains the given node.
* @private
*/
function createAccessorData(node) {
const name = astUtils.getStaticPropertyName(node);
const key = (name !== null) ? name : sourceCode.getTokens(node.key);

return {
key,
getters: node.kind === "get" ? [node] : [],
setters: node.kind === "set" ? [node] : []
};
}

/**
* Merges the given `AccessorData` object into the given accessors list.
* @param {AccessorData[]} accessors The list to merge into.
* @param {AccessorData} accessorData The object to merge.
* @returns {AccessorData[]} The same instance with the merged object.
* @private
*/
function mergeAccessorData(accessors, accessorData) {
const equalKeyElement = accessors.find(a => areEqualKeys(a.key, accessorData.key));

if (equalKeyElement) {
equalKeyElement.getters.push(...accessorData.getters);
equalKeyElement.setters.push(...accessorData.setters);
} else {
accessors.push(accessorData);
}

return accessors;
}

/**
* Checks accessor pairs in the given list of nodes.
* @param {ASTNode[]} nodes The list to check.
Expand All @@ -182,11 +145,39 @@ module.exports = {
* @private
*/
function checkList(nodes, shouldCheck) {
const accessors = nodes
.filter(shouldCheck)
.filter(isAccessorKind)
.map(createAccessorData)
.reduce(mergeAccessorData, []);
const accessors = [];
let found = false;

for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];

if (shouldCheck(node) && isAccessorKind(node)) {

// Creates a new `AccessorData` object for the given getter or setter node.
const name = astUtils.getStaticPropertyName(node);
const key = (name !== null) ? name : sourceCode.getTokens(node.key);

// Merges the given `AccessorData` object into the given accessors list.
for (let j = 0; j < accessors.length; j++) {
const accessor = accessors[j];

if (areEqualKeys(accessor.key, key)) {
accessor.getters.push(...node.kind === "get" ? [node] : []);
accessor.setters.push(...node.kind === "set" ? [node] : []);
found = true;
break;
}
}
if (!found) {
accessors.push({
key,
getters: node.kind === "get" ? [node] : [],
setters: node.kind === "set" ? [node] : []
});
}
found = false;
}
}

for (const { getters, setters } of accessors) {

Expand Down

0 comments on commit f82e56e

Please sign in to comment.