diff --git a/perf-testing/immutability-benchmarks.mjs b/perf-testing/immutability-benchmarks.mjs index 312fd22b..01d81a44 100644 --- a/perf-testing/immutability-benchmarks.mjs +++ b/perf-testing/immutability-benchmarks.mjs @@ -44,7 +44,8 @@ function createInitialState(arraySize = BENCHMARK_CONFIG.arraySize) { name: `name-${i}`, isActive: i % 2 === 0 })), - largeObject: createLargeObject(BENCHMARK_CONFIG.largeObjectSize), + largeObject1: createLargeObject(BENCHMARK_CONFIG.largeObjectSize1), + largeObject2: createLargeObject(BENCHMARK_CONFIG.largeObjectSize2), api: { queries: {}, provided: { @@ -62,7 +63,8 @@ const BENCHMARK_CONFIG = { iterations: 1, arraySize: 100, nestedArraySize: 10, - largeObjectSize: 1000, + largeObjectSize1: 1000, + largeObjectSize2: 3000, multiUpdateCount: 5, reuseStateIterations: 10 } @@ -104,8 +106,12 @@ const update = index => ({ type: "test/updateItem", payload: {id: index, value: index, nestedData: index} }) -const updateLargeObject = index => ({ - type: "test/updateLargeObject", +const updateLargeObject1 = index => ({ + type: "test/updateLargeObject1", + payload: {value: index} +}) +const updateLargeObject2 = index => ({ + type: "test/updateLargeObject2", payload: {value: index} }) const concat = index => ({ @@ -174,10 +180,12 @@ const actions = { remove, filter, update, - updateLargeObject, concat, mapNested, // dash-named fields to improve readability in benchmark results + + "update-largeObject1": updateLargeObject1, + "update-largeObject2": updateLargeObject2, "update-high": updateHigh, "update-multiple": updateMultiple, "remove-high": removeHigh, @@ -332,11 +340,22 @@ const vanillaReducer = (state = createInitialState(), action) => { ) } } - case "test/updateLargeObject": { + case "test/updateLargeObject1": { + return { + ...state, + largeObject1: { + ...state.largeObject1, + [`propertyAdded${action.payload.value}`]: { + id: action.payload.value + } + } + } + } + case "test/updateLargeObject2": { return { ...state, - largeObject: { - ...state.largeObject, + largeObject2: { + ...state.largeObject2, [`propertyAdded${action.payload.value}`]: { id: action.payload.value } @@ -462,8 +481,14 @@ const createImmerReducer = produce => { item.nested.data = action.payload.nestedData break } - case "test/updateLargeObject": { - draft.largeObject[`propertyAdded${action.payload.value}`] = { + case "test/updateLargeObject1": { + draft.largeObject1[`propertyAdded${action.payload.value}`] = { + id: action.payload.value + } + break + } + case "test/updateLargeObject2": { + draft.largeObject2[`propertyAdded${action.payload.value}`] = { id: action.payload.value } break @@ -597,7 +622,8 @@ function createBenchmarks() { "update-high", "remove", "remove-high", - "updateLargeObject" + "update-largeObject1", + "update-largeObject2" ] for (const action of reuseActions) { summary(function() { @@ -1191,13 +1217,6 @@ function printOverallVersionRankings(versionScores) { return } - console.log( - "\nMethodology: Lower geometric mean = better overall performance" - ) - console.log( - "(Geometric mean is standard for benchmarking as it handles multiplicative performance differences)" - ) - console.log("\n┌──────┬─────────────────────┬─────────────────┬───────────┐") console.log("│ Rank │ Version │ Geometric Mean │ Scenarios │") console.log("├──────┼─────────────────────┼─────────────────┼───────────┤") @@ -1216,22 +1235,6 @@ function printOverallVersionRankings(versionScores) { } console.log("└──────┴─────────────────────┴─────────────────┴───────────┘") - - // Highlight top performers - if (versionScores.length >= 3) { - console.log("\nTop Overall Performers:") - for (let i = 0; i < Math.min(10, versionScores.length); i++) { - const score = versionScores[i] - const [versionName, freezeIndicator] = score.version.split("|") - const shortName = shortenVersionName(versionName) - console.log( - ` ${i + - 1}. ${shortName} (${freezeIndicator}) - ${score.geometricMean.toFixed( - 2 - )}x average` - ) - } - } } function printBenchmarkSummaryTable(benchmarks) {