Add ability to spread Map entries (optimization) (#1612)

This commit is contained in:
Jaco
2022-07-20 11:23:26 +03:00
committed by GitHub
parent 41e2e67fd0
commit 9c05257046
3 changed files with 26 additions and 4 deletions
+13 -1
View File
@@ -17,5 +17,17 @@ describe('objectSpread', (): void => {
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 } });
});
perf('objectSpread', 500_000, [[]], () => objectSpread({}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 }));
it('spreads a Map', (): void => {
const map = new Map<string, string>([['foo', '123']]);
expect(
objectSpread({ bar: '123' }, map)
).toEqual({
bar: '123',
foo: '123'
});
});
perf('objectSpread', 350_000, [[{}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 }]], objectSpread);
perf('objectSpread', 350_000, [[{}, new Map<string, number>([['a', 1], ['b', 2], ['c', 3]]), new Map<string, number>([['d', 4], ['e', 5], ['f', 6]])]], objectSpread);
});
+7 -1
View File
@@ -10,7 +10,13 @@ export function objectSpread <T extends object> (dest: object, ...sources: (obje
const src = sources[i];
if (src) {
Object.assign(dest, src);
if ((src as Map<unknown, unknown>).entries) {
for (const [key, value] of (src as Map<string, unknown>).entries()) {
(dest as Record<string, unknown>)[key] = value;
}
} else {
Object.assign(dest, src);
}
}
}
+6 -2
View File
@@ -39,19 +39,23 @@ ${formatFixed(ops).padStart(NUM_PAD + PRE_PAD + 1)} ops/s
${formatFixed(micro).padStart(NUM_PAD + PRE_PAD + 1)} μs/op`;
}
export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn): void {
export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn, withLog?: boolean): void {
if (process.env.GITHUB_REPOSITORY) {
return;
}
it(`performance: ${name}`, (): void => {
const [time] = loop(count, inputs, exec);
const [time, results] = loop(count, inputs, exec);
console.log(`
performance run for ${name} completed with ${formatNumber(count)} iterations.
${`${name}:`.padStart(PRE_PAD)} ${time.toFixed(2).padStart(NUM_PAD)} ms${formatOps(count, time)}
`);
if (withLog) {
console.log(results);
}
});
}