Skip to content

Commit 962fba5

Browse files
committed
improve test comparison report
1 parent f74dafd commit 962fba5

File tree

2 files changed

+86
-35
lines changed

2 files changed

+86
-35
lines changed

test/ExampleWorker.js

+21-11
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ const runExample = options => {
2727
let render;
2828
let extrinsicCapture;
2929

30-
const bodyOverlap = (bodyA, bodyB) => {
31-
const collision = Matter.Collision.collides(bodyA, bodyB);
32-
return collision ? collision.depth : 0;
30+
const pairOverlap = (pair) => {
31+
const collision = Matter.Collision.collides(pair.bodyA, pair.bodyB);
32+
return collision ? Math.max(collision.depth - pair.slop, 0) : -1;
3333
};
3434

3535
for (i = 0; i < options.repeats; i += 1) {
@@ -66,20 +66,30 @@ const runExample = options => {
6666
timeDeltaAverage = smoothExp(timeDeltaAverage, timeDelta);
6767
}
6868

69-
if (j === 1) {
70-
const pairsList = engine.pairs.list;
71-
const pairsListLength = engine.pairs.list.length;
69+
let overlapTotalUpdate = 0;
70+
let overlapCountUpdate = 0;
7271

73-
for (let p = 0; p < pairsListLength; p += 1) {
74-
const pair = pairsList[p];
72+
const pairsList = engine.pairs.list;
73+
const pairsListLength = engine.pairs.list.length;
7574

76-
if (pair.isActive && !pair.isSensor) {
77-
overlapTotal += bodyOverlap(pair.bodyA, pair.bodyB);
78-
overlapCount += 1;
75+
for (let p = 0; p < pairsListLength; p += 1) {
76+
const pair = pairsList[p];
77+
78+
if (pair.isActive && !pair.isSensor){
79+
const overlap = pairOverlap(pair);
80+
81+
if (overlap >= 0) {
82+
overlapTotalUpdate += overlap;
83+
overlapCountUpdate += 1;
7984
}
8085
}
8186
}
8287

88+
if (overlapCountUpdate > 0) {
89+
overlapTotal += overlapTotalUpdate / overlapCountUpdate;
90+
overlapCount += 1;
91+
}
92+
8393
if (!extrinsicCapture && engine.timing.timestamp >= 1000) {
8494
extrinsicCapture = captureExtrinsics(engine, Matter);
8595
extrinsicCapture.updates = j;

test/TestTools.js

+65-24
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,22 @@ const equalityThreshold = 1;
1212
const colors = { Red: 31, Green: 32, Yellow: 33, White: 37, BrightWhite: 90, BrightCyan: 36 };
1313

1414
const comparisonReport = (capturesDev, capturesBuild, devSize, buildSize, buildVersion, save, benchmark) => {
15-
const performanceDev = capturePerformanceTotals(capturesDev);
16-
const performanceBuild = capturePerformanceTotals(capturesBuild);
15+
const {
16+
durationChange,
17+
memoryChange,
18+
overlapChange
19+
} = captureBenchmark(capturesDev, capturesBuild);
1720

18-
const perfChange = noiseThreshold(1 - (performanceDev.duration / performanceBuild.duration), 0.01);
19-
const memoryChange = noiseThreshold((performanceDev.memory / performanceBuild.memory) - 1, 0.01);
20-
const overlapChange = (performanceDev.overlap / (performanceBuild.overlap || 1)) - 1;
2121
const filesizeChange = (devSize / buildSize) - 1;
2222

23-
const similaritys = extrinsicSimilarity(capturesDev, capturesBuild);
24-
const similarityAverage = extrinsicSimilarityAverage(similaritys);
25-
const similarityEntries = Object.entries(similaritys);
26-
similarityEntries.sort((a, b) => a[1] - b[1]);
27-
2823
const firstCapture = Object.entries(capturesDev)[0][1];
2924
const updates = firstCapture.extrinsic.updates;
3025

26+
const similaritys = extrinsicSimilarity(capturesDev, capturesBuild);
27+
const similarityAverage = extrinsicSimilarityAverage(similaritys);
3128
const similarityAveragePerUpdate = Math.pow(1, -1 / updates) * Math.pow(similarityAverage, 1 / updates);
29+
const similarityEntries = Object.entries(similaritys);
30+
similarityEntries.sort((a, b) => a[1] - b[1]);
3231

3332
const devIntrinsicsChanged = {};
3433
const buildIntrinsicsChanged = {};
@@ -51,8 +50,6 @@ const comparisonReport = (capturesDev, capturesBuild, devSize, buildSize, buildV
5150
})
5251
.sort((a, b) => a.name.localeCompare(b.name));
5352

54-
const formatColor = green => green ? colors.Green : colors.Yellow;
55-
5653
const report = (breakEvery, format) => [
5754
[`Output sample comparison estimates of ${similarityEntries.length} examples`,
5855
`against previous release ${format('matter-js@' + buildVersion, colors.Yellow)}:`
@@ -70,7 +67,7 @@ const comparisonReport = (capturesDev, capturesBuild, devSize, buildSize, buildV
7067

7168
...(benchmark ? [
7269
`\n${format('Performance', colors.White)}`,
73-
` ${format(formatPercent(perfChange), formatColor(perfChange >= 0))}%`,
70+
` ${format(formatPercent(durationChange), formatColor(durationChange >= 0))}%`,
7471

7572
` ${format('Memory', colors.White)} `,
7673
` ${format(formatPercent(memoryChange), formatColor(memoryChange <= 0))}%`,
@@ -102,9 +99,13 @@ const comparisonReport = (capturesDev, capturesBuild, devSize, buildSize, buildV
10299
};
103100

104101
const similarityRatings = similarity => similarity < equalityThreshold ? color('●', colors.Yellow) : '·';
102+
105103
const changeRatings = isChanged => isChanged ? color('◆', colors.White) : '·';
104+
106105
const color = (text, number) => number ? `\x1b[${number}m${text}\x1b[0m` : text;
107106

107+
const formatColor = isGreen => isGreen ? colors.Green : colors.Yellow;
108+
108109
const formatPercent = (val, showSign=true, showFractional=false, padStart=6) => {
109110
let fractionalSign = '';
110111

@@ -127,10 +128,35 @@ const noiseThreshold = (val, threshold) => {
127128
return sign * Math.max(0, magnitude - threshold) / (1 - threshold);
128129
};
129130

131+
const median = (values, lower, upper) => {
132+
const valuesSorted = values.slice(0).sort();
133+
134+
return mean(valuesSorted.slice(
135+
Math.floor(valuesSorted.length * lower),
136+
Math.floor(valuesSorted.length * upper)
137+
));
138+
};
139+
140+
const mean = (values) => {
141+
const valuesLength = values.length;
142+
let result = 0;
143+
144+
for (let i = 0; i < valuesLength; i += 1) {
145+
result += values[i];
146+
}
147+
148+
return (result / valuesLength) || 0;
149+
};
150+
130151
const smoothExp = (last, current) => {
131152
const delta = current - last;
132153
const sign = delta < 0 ? -1 : 1;
133154
const magnitude = Math.abs(delta);
155+
156+
if (magnitude < 1) {
157+
return last + 0.01 * delta;
158+
}
159+
134160
return last + Math.sqrt(magnitude) * sign;
135161
};
136162

@@ -143,20 +169,35 @@ const equals = (a, b) => {
143169
return true;
144170
};
145171

146-
const capturePerformanceTotals = (captures) => {
147-
const totals = {
148-
duration: 0,
149-
overlap: 0,
150-
memory: 0
151-
};
172+
const captureBenchmark = (capturesDev, capturesBuild) => {
173+
const overlapChanges = [];
174+
175+
let durationDev = 0;
176+
let durationBuild = 0;
177+
let memoryDev = 0;
178+
let memoryBuild = 0;
179+
180+
for (const name in capturesDev) {
181+
durationDev += capturesDev[name].duration;
182+
durationBuild += capturesBuild[name].duration;
183+
184+
memoryDev += capturesDev[name].memory;
185+
memoryBuild += capturesBuild[name].memory;
152186

153-
for (const [ name ] of Object.entries(captures)) {
154-
totals.duration += captures[name].duration;
155-
totals.overlap += captures[name].overlap;
156-
totals.memory += captures[name].memory;
187+
if (capturesBuild[name].overlap > 0.1 && capturesDev[name].overlap > 0.1){
188+
overlapChanges.push(capturesDev[name].overlap / capturesBuild[name].overlap);
189+
}
157190
};
158191

159-
return totals;
192+
const durationChange = 1 - noiseThreshold(durationDev / durationBuild, 0.02);
193+
const memoryChange = noiseThreshold(memoryDev / memoryBuild, 0.02) - 1;
194+
const overlapChange = noiseThreshold(median(overlapChanges, 0.45, 0.55), 0.001) - 1;
195+
196+
return {
197+
durationChange,
198+
memoryChange,
199+
overlapChange
200+
};
160201
};
161202

162203
const extrinsicSimilarity = (currentCaptures, referenceCaptures, key='extrinsic') => {

0 commit comments

Comments
 (0)