Skip to content

Commit 033faf9

Browse files
Rollup merge of #80515 - GuillaumeGomez:js-for-loop-perf, r=Nemo157,jyn514
Improve JS performance by storing length before comparing to it in loops Since #79052 is quite complicated to review, I suggested to split into smaller parts. This first part is mostly about saving the array length into a variable (I tried to not change anything else as much as possible 😃 ). r? `@jyn514`
2 parents b7a9d6a + e727600 commit 033faf9

File tree

2 files changed

+50
-56
lines changed

2 files changed

+50
-56
lines changed

src/librustdoc/html/static/main.js

Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -648,8 +648,7 @@ function defocusSearchBar() {
648648
*/
649649
function execQuery(query, searchWords, filterCrates) {
650650
function itemTypeFromName(typename) {
651-
var length = itemTypes.length;
652-
for (var i = 0; i < length; ++i) {
651+
for (var i = 0, len = itemTypes.length; i < len; ++i) {
653652
if (itemTypes[i] === typename) {
654653
return i;
655654
}
@@ -667,8 +666,7 @@ function defocusSearchBar() {
667666

668667
function transformResults(results, isType) {
669668
var out = [];
670-
var length = results.length;
671-
for (var i = 0; i < length; ++i) {
669+
for (var i = 0, len = results.length; i < len; ++i) {
672670
if (results[i].id > -1) {
673671
var obj = searchIndex[results[i].id];
674672
obj.lev = results[i].lev;
@@ -697,11 +695,11 @@ function defocusSearchBar() {
697695
}
698696
}
699697
results = ar;
700-
var i;
701-
var nresults = results.length;
702-
for (i = 0; i < nresults; ++i) {
703-
results[i].word = searchWords[results[i].id];
704-
results[i].item = searchIndex[results[i].id] || {};
698+
var i, len, result;
699+
for (i = 0, len = results.length; i < len; ++i) {
700+
result = results[i];
701+
result.word = searchWords[result.id];
702+
result.item = searchIndex[result.id] || {};
705703
}
706704
// if there are no results then return to default and fail
707705
if (results.length === 0) {
@@ -775,8 +773,7 @@ function defocusSearchBar() {
775773
return 0;
776774
});
777775

778-
var length = results.length;
779-
for (i = 0; i < length; ++i) {
776+
for (i = 0, len = results.length; i < len; ++i) {
780777
var result = results[i];
781778

782779
// this validation does not make sense when searching by types
@@ -833,11 +830,10 @@ function defocusSearchBar() {
833830
var vlength = val.generics.length;
834831
for (var y = 0; y < vlength; ++y) {
835832
var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1};
836-
var elength = elems.length;
837833
var firstGeneric = getObjectFromId(val.generics[y]).name;
838-
for (var x = 0; x < elength; ++x) {
834+
for (var x = 0, elength = elems.length; x < elength; ++x) {
839835
var tmp_lev = levenshtein(getObjectFromId(elems[x]).name,
840-
firstGeneric);
836+
firstGeneric);
841837
if (tmp_lev < lev.lev) {
842838
lev.lev = tmp_lev;
843839
lev.pos = x;
@@ -861,7 +857,7 @@ function defocusSearchBar() {
861857
// Check for type name and type generics (if any).
862858
function checkType(obj, val, literalSearch) {
863859
var lev_distance = MAX_LEV_DISTANCE + 1;
864-
var x;
860+
var len, x, y, e_len, firstGeneric;
865861
if (obj[NAME] === val.name) {
866862
if (literalSearch === true) {
867863
if (val.generics && val.generics.length !== 0) {
@@ -870,10 +866,12 @@ function defocusSearchBar() {
870866
var elems = obj[GENERICS_DATA].slice(0);
871867
var allFound = true;
872868

873-
for (var y = 0; allFound === true && y < val.generics.length; ++y) {
869+
len = val.generics.length;
870+
for (y = 0; allFound === true && y < len; ++y) {
874871
allFound = false;
875-
var firstGeneric = getObjectFromId(val.generics[y]).name;
876-
for (x = 0; allFound === false && x < elems.length; ++x) {
872+
firstGeneric = getObjectFromId(val.generics[y]).name;
873+
e_len = elems.length;
874+
for (x = 0; allFound === false && x < e_len; ++x) {
877875
allFound = getObjectFromId(elems[x]).name === firstGeneric;
878876
}
879877
if (allFound === true) {
@@ -903,12 +901,10 @@ function defocusSearchBar() {
903901
// Names didn't match so let's check if one of the generic types could.
904902
if (literalSearch === true) {
905903
if (obj.length > GENERICS_DATA && obj[GENERICS_DATA].length > 0) {
906-
var length = obj[GENERICS_DATA].length;
907-
for (x = 0; x < length; ++x) {
908-
if (obj[GENERICS_DATA][x] === val.name) {
909-
return true;
910-
}
911-
}
904+
return obj[GENERICS_DATA].some(
905+
function(name) {
906+
return name === val.name;
907+
});
912908
}
913909
return false;
914910
}
@@ -965,7 +961,7 @@ function defocusSearchBar() {
965961
if (typeof ret[0] === "string") {
966962
ret = [ret];
967963
}
968-
for (var x = 0; x < ret.length; ++x) {
964+
for (var x = 0, len = ret.length; x < len; ++x) {
969965
var tmp = ret[x];
970966
if (typePassesFilter(typeFilter, tmp[1]) === false) {
971967
continue;
@@ -1072,23 +1068,22 @@ function defocusSearchBar() {
10721068
// aliases to be before the others in the displayed results.
10731069
var aliases = [];
10741070
var crateAliases = [];
1075-
var i;
10761071
if (filterCrates !== undefined) {
10771072
if (ALIASES[filterCrates] && ALIASES[filterCrates][query.search]) {
1078-
for (i = 0; i < ALIASES[filterCrates][query.search].length; ++i) {
1079-
aliases.push(
1080-
createAliasFromItem(
1081-
searchIndex[ALIASES[filterCrates][query.search][i]]));
1073+
var query_aliases = ALIASES[filterCrates][query.search];
1074+
var len = query_aliases.length;
1075+
for (var i = 0; i < len; ++i) {
1076+
aliases.push(createAliasFromItem(searchIndex[query_aliases[i]]));
10821077
}
10831078
}
10841079
} else {
10851080
Object.keys(ALIASES).forEach(function(crate) {
10861081
if (ALIASES[crate][query.search]) {
10871082
var pushTo = crate === window.currentCrate ? crateAliases : aliases;
1088-
for (i = 0; i < ALIASES[crate][query.search].length; ++i) {
1089-
pushTo.push(
1090-
createAliasFromItem(
1091-
searchIndex[ALIASES[crate][query.search][i]]));
1083+
var query_aliases = ALIASES[crate][query.search];
1084+
var len = query_aliases.length;
1085+
for (var i = 0; i < len; ++i) {
1086+
pushTo.push(createAliasFromItem(searchIndex[query_aliases[i]]));
10921087
}
10931088
}
10941089
});
@@ -1123,11 +1118,12 @@ function defocusSearchBar() {
11231118

11241119
// quoted values mean literal search
11251120
var nSearchWords = searchWords.length;
1126-
var i;
1121+
var i, it;
11271122
var ty;
11281123
var fullId;
11291124
var returned;
11301125
var in_args;
1126+
var len;
11311127
if ((val.charAt(0) === "\"" || val.charAt(0) === "'") &&
11321128
val.charAt(val.length - 1) === val.charAt(0))
11331129
{
@@ -1175,7 +1171,7 @@ function defocusSearchBar() {
11751171
var input = parts[0];
11761172
// sort inputs so that order does not matter
11771173
var inputs = input.split(",").map(trimmer).sort();
1178-
for (i = 0; i < inputs.length; ++i) {
1174+
for (i = 0, len = inputs.length; i < len; ++i) {
11791175
inputs[i] = extractGenerics(inputs[i]);
11801176
}
11811177
var output = extractGenerics(parts[1]);
@@ -1200,7 +1196,7 @@ function defocusSearchBar() {
12001196
is_module = true;
12011197
} else {
12021198
var allFound = true;
1203-
for (var it = 0; allFound === true && it < inputs.length; it++) {
1199+
for (it = 0, len = inputs.length; allFound === true && it < len; it++) {
12041200
allFound = checkType(type, inputs[it], true);
12051201
}
12061202
in_args = allFound;
@@ -1243,7 +1239,7 @@ function defocusSearchBar() {
12431239

12441240
var paths = valLower.split("::");
12451241
var j;
1246-
for (j = 0; j < paths.length; ++j) {
1242+
for (j = 0, len = paths.length; j < len; ++j) {
12471243
if (paths[j] === "") {
12481244
paths.splice(j, 1);
12491245
j -= 1;
@@ -1365,7 +1361,7 @@ function defocusSearchBar() {
13651361
* @return {[boolean]} [Whether the result is valid or not]
13661362
*/
13671363
function validateResult(name, path, keys, parent) {
1368-
for (var i = 0; i < keys.length; ++i) {
1364+
for (var i = 0, len = keys.length; i < len; ++i) {
13691365
// each check is for validation so we negate the conditions and invalidate
13701366
if (!(
13711367
// check for an exact name match
@@ -1686,7 +1682,7 @@ function defocusSearchBar() {
16861682
function getSmallest(arrays, positions, notDuplicates) {
16871683
var start = null;
16881684

1689-
for (var it = 0; it < positions.length; ++it) {
1685+
for (var it = 0, len = positions.length; it < len; ++it) {
16901686
if (arrays[it].length > positions[it] &&
16911687
(start === null || start > arrays[it][positions[it]].lev) &&
16921688
!notDuplicates[arrays[it][positions[it]].fullPath]) {
@@ -1701,7 +1697,7 @@ function defocusSearchBar() {
17011697
var positions = [];
17021698
var notDuplicates = {};
17031699

1704-
for (var x = 0; x < arrays.length; ++x) {
1700+
for (var x = 0, arrays_len = arrays.length; x < arrays_len; ++x) {
17051701
positions.push(0);
17061702
}
17071703
while (ret.length < MAX_RESULTS) {
@@ -1710,7 +1706,7 @@ function defocusSearchBar() {
17101706
if (smallest === null) {
17111707
break;
17121708
}
1713-
for (x = 0; x < arrays.length && ret.length < MAX_RESULTS; ++x) {
1709+
for (x = 0; x < arrays_len && ret.length < MAX_RESULTS; ++x) {
17141710
if (arrays[x].length > positions[x] &&
17151711
arrays[x][positions[x]].lev === smallest &&
17161712
!notDuplicates[arrays[x][positions[x]].fullPath]) {
@@ -1730,7 +1726,7 @@ function defocusSearchBar() {
17301726
"others": [],
17311727
};
17321728

1733-
for (var i = 0; i < queries.length; ++i) {
1729+
for (var i = 0, len = queries.length; i < len; ++i) {
17341730
query = queries[i].trim();
17351731
if (query.length !== 0) {
17361732
var tmp = execQuery(getQuery(query), searchWords, filterCrates);
@@ -1884,7 +1880,7 @@ function defocusSearchBar() {
18841880
ALIASES[crate][alias_name] = [];
18851881
}
18861882
local_aliases = aliases[alias_name];
1887-
for (j = 0; j < local_aliases.length; ++j) {
1883+
for (j = 0, len = local_aliases.length; j < len; ++j) {
18881884
ALIASES[crate][alias_name].push(local_aliases[j] + currentIndex);
18891885
}
18901886
}
@@ -2052,8 +2048,7 @@ function defocusSearchBar() {
20522048
div.appendChild(h3);
20532049
var ul = document.createElement("ul");
20542050

2055-
var length = filtered.length;
2056-
for (var i = 0; i < length; ++i) {
2051+
for (var i = 0, len = filtered.length; i < len; ++i) {
20572052
var item = filtered[i];
20582053
var name = item[0];
20592054
var desc = item[1]; // can be null
@@ -2122,21 +2117,18 @@ function defocusSearchBar() {
21222117
}
21232118

21242119
var libs = Object.getOwnPropertyNames(imp);
2125-
var llength = libs.length;
2126-
for (var i = 0; i < llength; ++i) {
2120+
for (var i = 0, llength = libs.length; i < llength; ++i) {
21272121
if (libs[i] === currentCrate) { continue; }
21282122
var structs = imp[libs[i]];
21292123

2130-
var slength = structs.length;
21312124
struct_loop:
2132-
for (var j = 0; j < slength; ++j) {
2125+
for (var j = 0, slength = structs.length; j < slength; ++j) {
21332126
var struct = structs[j];
21342127

21352128
var list = struct.synthetic ? synthetic_implementors : implementors;
21362129

21372130
if (struct.synthetic) {
2138-
var stlength = struct.types.length;
2139-
for (var k = 0; k < stlength; k++) {
2131+
for (var k = 0, stlength = struct.types.length; k < stlength; k++) {
21402132
if (inlined_types.has(struct.types[k])) {
21412133
continue struct_loop;
21422134
}
@@ -2853,7 +2845,7 @@ function defocusSearchBar() {
28532845
return 0;
28542846
});
28552847
var savedCrate = getSettingValue("saved-filter-crate");
2856-
for (var i = 0; i < crates_text.length; ++i) {
2848+
for (var i = 0, len = crates_text.length; i < len; ++i) {
28572849
var option = document.createElement("option");
28582850
option.value = crates_text[i];
28592851
option.innerText = crates_text[i];

src/librustdoc/html/static/source-script.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ function getCurrentFilePath() {
88
var parts = window.location.pathname.split("/");
99
var rootPathParts = window.rootPath.split("/");
1010

11-
for (var i = 0; i < rootPathParts.length; ++i) {
11+
for (var i = 0, len = rootPathParts.length; i < len; ++i) {
1212
if (rootPathParts[i] === "..") {
1313
parts.pop();
1414
}
@@ -35,12 +35,14 @@ function createDirEntry(elem, parent, fullPath, currentFile, hasFoundFile) {
3535
};
3636
name.innerText = elem["name"];
3737

38+
var i, len;
39+
3840
var children = document.createElement("div");
3941
children.className = "children";
4042
var folders = document.createElement("div");
4143
folders.className = "folders";
4244
if (elem.dirs) {
43-
for (var i = 0; i < elem.dirs.length; ++i) {
45+
for (i = 0, len = elem.dirs.length; i < len; ++i) {
4446
if (createDirEntry(elem.dirs[i], folders, fullPath, currentFile,
4547
hasFoundFile) === true) {
4648
addClass(name, "expand");
@@ -53,7 +55,7 @@ function createDirEntry(elem, parent, fullPath, currentFile, hasFoundFile) {
5355
var files = document.createElement("div");
5456
files.className = "files";
5557
if (elem.files) {
56-
for (i = 0; i < elem.files.length; ++i) {
58+
for (i = 0, len = elem.files.length; i < len; ++i) {
5759
var file = document.createElement("a");
5860
file.innerText = elem.files[i];
5961
file.href = window.rootPath + "src/" + fullPath + elem.files[i] + ".html";

0 commit comments

Comments
 (0)