From 08815fa938ba070b0756f37e1efda1b1f8abb0d7 Mon Sep 17 00:00:00 2001 From: Nataniel Borges Date: Wed, 9 Mar 2022 17:32:55 +0100 Subject: [PATCH] Freeze objects for performance Frozen objects don't trigger Vue's reactive Observers and are significantly faster. With this changes, winscope can now load traces with over 100mb Bug: 211049519 Test: build winscope and open a large trace Change-Id: Iec9f91e408db734ce884cf846d5c2826ff346484 --- tools/winscope/src/DataInput.vue | 12 ++++++++++-- tools/winscope/src/dumps/DumpBase.ts | 4 ++-- tools/winscope/src/main.js | 8 ++++++-- tools/winscope/src/traces/SurfaceFlinger.ts | 8 ++++---- tools/winscope/src/traces/TraceBase.ts | 12 ++++++------ 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/tools/winscope/src/DataInput.vue b/tools/winscope/src/DataInput.vue index 8cfa29b29..57fcb9810 100644 --- a/tools/winscope/src/DataInput.vue +++ b/tools/winscope/src/DataInput.vue @@ -356,8 +356,12 @@ export default { } decodedFileTypes.add(dataType); + const frozenData = Object.freeze(decodedFile.data.data); + delete decodedFile.data.data; + decodedFile.data.data = frozenData; + this.$set(this.dataFiles, - dataType, decodedFile.data); + dataType, Object.freeze(decodedFile.data)); } // TODO(b/169305853): Remove this once we have magic numbers or another @@ -369,7 +373,11 @@ export default { const selectedFile = this.getMostLikelyCandidateFile(dataType, files); - this.$set(this.dataFiles, dataType, selectedFile); + const frozenData = Object.freeze(selectedFile.data); + delete selectedFile.data; + selectedFile.data = frozenData; + + this.$set(this.dataFiles, dataType, Object.freeze(selectedFile)); // Remove selected file from overriden list const index = files.indexOf(selectedFile); diff --git a/tools/winscope/src/dumps/DumpBase.ts b/tools/winscope/src/dumps/DumpBase.ts index 9e2bd141e..38c86c4d7 100644 --- a/tools/winscope/src/dumps/DumpBase.ts +++ b/tools/winscope/src/dumps/DumpBase.ts @@ -23,7 +23,7 @@ export default abstract class DumpBase implements IDump { this._files = files; } - get files(): any[] { + get files(): readonly any[] { return Object.values(this._files).flat(); } @@ -31,6 +31,6 @@ export default abstract class DumpBase implements IDump { } interface IDump { - files: Array; + files: readonly Object[]; type: String, } \ No newline at end of file diff --git a/tools/winscope/src/main.js b/tools/winscope/src/main.js index 88aa5f5a2..587f42519 100644 --- a/tools/winscope/src/main.js +++ b/tools/winscope/src/main.js @@ -165,7 +165,9 @@ const store = new Vuex.Store({ } if (Object.keys(traceFiles).length > 0 && typeInfo.constructor) { - traces[traceType] = new typeInfo.constructor(traceFiles); + const newObj = new typeInfo.constructor(traceFiles); + newObj.data = Object.freeze(newObj.data); + traces[traceType] = newObj; } } @@ -198,7 +200,9 @@ const store = new Vuex.Store({ } if (Object.keys(dumpFiles).length > 0 && typeInfo.constructor) { - dumps[dumpType] = new typeInfo.constructor(dumpFiles); + const newObj = new typeInfo.constructor(dumpFiles); + newObj.data = Object.freeze(newObj.data); + dumps[dumpType] = newObj; } } diff --git a/tools/winscope/src/traces/SurfaceFlinger.ts b/tools/winscope/src/traces/SurfaceFlinger.ts index 049dc684a..b8ec6df93 100644 --- a/tools/winscope/src/traces/SurfaceFlinger.ts +++ b/tools/winscope/src/traces/SurfaceFlinger.ts @@ -19,15 +19,15 @@ import TraceBase from './TraceBase'; import { LayersTrace } from '@/flickerlib'; export default class SurfaceFlinger extends TraceBase { - sfTraceFile: Object; - tagGenerationTrace: Object; + readonly sfTraceFile: Object; + readonly tagGenerationTrace: Object; constructor(files) { - const sfTraceFile = files[FILE_TYPES.SURFACE_FLINGER_TRACE]; + const sfTraceFile = Object.freeze(files[FILE_TYPES.SURFACE_FLINGER_TRACE]); const tagGenerationTrace = files[FILE_TYPES.SURFACE_FLINGER_TRACE].tagGenerationTrace; super(sfTraceFile.data, sfTraceFile.timeline, files); - this.tagGenerationTrace = tagGenerationTrace; + this.tagGenerationTrace = Object.freeze(tagGenerationTrace); this.sfTraceFile = sfTraceFile; } diff --git a/tools/winscope/src/traces/TraceBase.ts b/tools/winscope/src/traces/TraceBase.ts index 652dc7ee0..ab9666c6d 100644 --- a/tools/winscope/src/traces/TraceBase.ts +++ b/tools/winscope/src/traces/TraceBase.ts @@ -23,9 +23,9 @@ import JSZip from 'jszip'; export default abstract class Trace implements ITrace { selectedIndex: Number; - data: Object; - timeline: Array; - _files: File[]; + readonly data: Object; + readonly timeline: Array; + readonly _files: File[]; constructor(data: any, timeline: Number[], files: any[]) { this.selectedIndex = 0; @@ -34,7 +34,7 @@ export default abstract class Trace implements ITrace { this._files = files; } - get files(): File[] { + get files(): readonly File[] { return Object.values(this._files).flat(); } @@ -64,6 +64,6 @@ export default abstract class Trace implements ITrace { } interface ITrace { - files: Array; + files: readonly Object[]; type: String, -} \ No newline at end of file +}