Perf: slightly faster getShapeAtPoint
(#3416)
This PR makes a small improvement to the speed of `getShapeAtPoint`. It removes `Editor.getCurrentPageRenderingShapesSorted`. ### Change Type - [x] `sdk` — Changes the tldraw SDK - [x] `improvement` — Improving existing features
This commit is contained in:
parent
5347c5f30e
commit
3f64bf8c5b
4 changed files with 35 additions and 6 deletions
|
@ -4657,11 +4657,9 @@ export class Editor extends EventEmitter<TLEventMap> {
|
||||||
*
|
*
|
||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
@computed getCurrentPageRenderingShapesSorted(): TLShape[] {
|
@computed
|
||||||
return this.getUnorderedRenderingShapes(true)
|
getCurrentPageRenderingShapesSorted(): TLShape[] {
|
||||||
.filter(({ id }) => !this.isShapeCulled(id))
|
return this.getCurrentPageShapesSorted().filter((shape) => !this.isShapeCulled(shape))
|
||||||
.sort((a, b) => a.index - b.index)
|
|
||||||
.map(({ shape }) => shape)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -176,6 +176,9 @@ export function mapObjectMapValues<Key extends string, ValueBefore, ValueAfter>(
|
||||||
[K in Key]: ValueAfter;
|
[K in Key]: ValueAfter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// @internal (undocumented)
|
||||||
|
export function measureAverageDuration(_target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor;
|
||||||
|
|
||||||
// @internal (undocumented)
|
// @internal (undocumented)
|
||||||
export function measureCbDuration(name: string, cb: () => any): any;
|
export function measureCbDuration(name: string, cb: () => any): any;
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ export {
|
||||||
objectMapKeys,
|
objectMapKeys,
|
||||||
objectMapValues,
|
objectMapValues,
|
||||||
} from './lib/object'
|
} from './lib/object'
|
||||||
export { measureCbDuration, measureDuration } from './lib/perf'
|
export { measureAverageDuration, measureCbDuration, measureDuration } from './lib/perf'
|
||||||
export { PngHelpers } from './lib/png'
|
export { PngHelpers } from './lib/png'
|
||||||
export { type IndexKey } from './lib/reordering/IndexKey'
|
export { type IndexKey } from './lib/reordering/IndexKey'
|
||||||
export {
|
export {
|
||||||
|
|
|
@ -20,3 +20,31 @@ export function measureDuration(_target: any, propertyKey: string, descriptor: P
|
||||||
}
|
}
|
||||||
return descriptor
|
return descriptor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const averages = new Map<any, { total: number; count: number }>()
|
||||||
|
|
||||||
|
/** @internal */
|
||||||
|
export function measureAverageDuration(
|
||||||
|
_target: any,
|
||||||
|
propertyKey: string,
|
||||||
|
descriptor: PropertyDescriptor
|
||||||
|
) {
|
||||||
|
const originalMethod = descriptor.value
|
||||||
|
descriptor.value = function (...args: any[]) {
|
||||||
|
const start = performance.now()
|
||||||
|
const result = originalMethod.apply(this, args)
|
||||||
|
const end = performance.now()
|
||||||
|
const value = averages.get(descriptor.value)!
|
||||||
|
const length = end - start
|
||||||
|
const total = value.total + length
|
||||||
|
const count = value.count + 1
|
||||||
|
averages.set(descriptor.value, { total, count })
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(
|
||||||
|
`${propertyKey} took ${(end - start).toFixed(2)}ms | average ${(total / count).toFixed(2)}ms`
|
||||||
|
)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
averages.set(descriptor.value, { total: 0, count: 0 })
|
||||||
|
return descriptor
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue