Skip to content

Commit 334a3ac

Browse files
Giovanni Bucciaduh95
authored andcommitted
assert: make myers_diff function more performant
PR-URL: #56303 Refs: #54862 Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Xuguang Mei <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Pietro Marchini <[email protected]> Reviewed-By: James M Snell <[email protected]>
1 parent c8d1dcb commit 334a3ac

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

‎lib/internal/assert/myers_diff.js‎

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
'use strict';
22

33
const{
4-
Array,
5-
ArrayPrototypeFill,
64
ArrayPrototypePush,
75
ArrayPrototypeSlice,
6+
Int32Array,
87
StringPrototypeEndsWith,
98
}=primordials;
109

@@ -26,7 +25,7 @@ function myersDiff(actual, expected, checkCommaDisparity = false){
2625
constactualLength=actual.length;
2726
constexpectedLength=expected.length;
2827
constmax=actualLength+expectedLength;
29-
constv=ArrayPrototypeFill(Array(2*max+1),0);
28+
constv=newInt32Array(2*max+1);
3029

3130
consttrace=[];
3231

@@ -35,22 +34,24 @@ function myersDiff(actual, expected, checkCommaDisparity = false){
3534
ArrayPrototypePush(trace,newTrace);
3635

3736
for(letdiagonalIndex=-diffLevel;diagonalIndex<=diffLevel;diagonalIndex+=2){
38-
letx;
39-
if(diagonalIndex===-diffLevel||
40-
(diagonalIndex!==diffLevel&&v[diagonalIndex-1+max]<v[diagonalIndex+1+max])){
41-
x=v[diagonalIndex+1+max];
42-
}else{
43-
x=v[diagonalIndex-1+max]+1;
44-
}
45-
37+
constoffset=diagonalIndex+max;
38+
constpreviousOffset=v[offset-1];
39+
constnextOffset=v[offset+1];
40+
letx=diagonalIndex===-diffLevel||(diagonalIndex!==diffLevel&&previousOffset<nextOffset) ?
41+
nextOffset :
42+
previousOffset+1;
4643
lety=x-diagonalIndex;
4744

48-
while(x<actualLength&&y<expectedLength&&areLinesEqual(actual[x],expected[y],checkCommaDisparity)){
45+
while(
46+
x<actualLength&&
47+
y<expectedLength&&
48+
areLinesEqual(actual[x],expected[y],checkCommaDisparity)
49+
){
4950
x++;
5051
y++;
5152
}
5253

53-
v[diagonalIndex+max]=x;
54+
v[offset]=x;
5455

5556
if(x>=actualLength&&y>=expectedLength){
5657
returnbacktrack(trace,actual,expected,checkCommaDisparity);
@@ -71,10 +72,13 @@ function backtrack(trace, actual, expected, checkCommaDisparity){
7172
for(letdiffLevel=trace.length-1;diffLevel>=0;diffLevel--){
7273
constv=trace[diffLevel];
7374
constdiagonalIndex=x-y;
74-
letprevDiagonalIndex;
75+
constoffset=diagonalIndex+max;
7576

76-
if(diagonalIndex===-diffLevel||
77-
(diagonalIndex!==diffLevel&&v[diagonalIndex-1+max]<v[diagonalIndex+1+max])){
77+
letprevDiagonalIndex;
78+
if(
79+
diagonalIndex===-diffLevel||
80+
(diagonalIndex!==diffLevel&&v[offset-1]<v[offset+1])
81+
){
7882
prevDiagonalIndex=diagonalIndex+1;
7983
}else{
8084
prevDiagonalIndex=diagonalIndex-1;
@@ -84,8 +88,11 @@ function backtrack(trace, actual, expected, checkCommaDisparity){
8488
constprevY=prevX-prevDiagonalIndex;
8589

8690
while(x>prevX&&y>prevY){
87-
constvalue=!checkCommaDisparity||
88-
StringPrototypeEndsWith(actual[x-1],',') ? actual[x-1] : expected[y-1];
91+
constactualItem=actual[x-1];
92+
constvalue=
93+
!checkCommaDisparity||StringPrototypeEndsWith(actualItem,',') ?
94+
actualItem :
95+
expected[y-1];
8996
ArrayPrototypePush(result,{__proto__: null,type: 'nop', value });
9097
x--;
9198
y--;
@@ -110,13 +117,15 @@ function printSimpleMyersDiff(diff){
110117

111118
for(letdiffIdx=diff.length-1;diffIdx>=0;diffIdx--){
112119
const{ type, value }=diff[diffIdx];
120+
letcolor=colors.white;
121+
113122
if(type==='insert'){
114-
message+=`${colors.green}${value}${colors.white}`;
123+
color=colors.green;
115124
}elseif(type==='delete'){
116-
message+=`${colors.red}${value}${colors.white}`;
117-
}else{
118-
message+=`${colors.white}${value}${colors.white}`;
125+
color=colors.red;
119126
}
127+
128+
message+=`${color}${value}${colors.white}`;
120129
}
121130

122131
return`\n${message}`;
@@ -129,17 +138,16 @@ function printMyersDiff(diff, operator){
129138

130139
for(letdiffIdx=diff.length-1;diffIdx>=0;diffIdx--){
131140
const{ type, value }=diff[diffIdx];
132-
constpreviousType=(diffIdx<(diff.length-1)) ? diff[diffIdx+1].type : null;
133-
consttypeChanged=previousType&&(type!==previousType);
141+
constpreviousType=diffIdx<diff.length-1 ? diff[diffIdx+1].type : null;
134142

135-
if(typeChanged&&previousType==='nop'){
136-
// Avoid grouping if only one line would have been grouped otherwise
143+
// Avoid grouping if only one line would have been grouped otherwise
144+
if(previousType==='nop'&&type!==previousType){
137145
if(nopCount===kNopLinesToCollapse+1){
138146
message+=`${colors.white}${diff[diffIdx+1].value}\n`;
139147
}elseif(nopCount===kNopLinesToCollapse+2){
140148
message+=`${colors.white}${diff[diffIdx+2].value}\n`;
141149
message+=`${colors.white}${diff[diffIdx+1].value}\n`;
142-
}if(nopCount>=(kNopLinesToCollapse+3)){
150+
}elseif(nopCount>=kNopLinesToCollapse+3){
143151
message+=`${colors.blue}...${colors.white}\n`;
144152
message+=`${colors.white}${diff[diffIdx+1].value}\n`;
145153
skipped=true;

0 commit comments

Comments
(0)