From 9b08ca34ffb82a26d8f2b2cc037791b6490a6c97 Mon Sep 17 00:00:00 2001 From: Semenov Aleksandr Date: Wed, 30 Apr 2025 21:16:35 +0300 Subject: [PATCH 1/3] Dependencies: replace Set to Array Signed-off-by: Semenov Aleksandr --- .../runtime/src/states/Dependency.ts | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts b/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts index ac791e5cd49..d00499d55f2 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/incremental/runtime/src/states/Dependency.ts @@ -27,14 +27,14 @@ export interface Dependency { /** This class allows to store and update all dependencies. */ export class Dependencies { private frame = 0 - private dependencies: Set | undefined = undefined + private dependencies: Array | undefined = undefined private latest: Dependency | undefined = undefined /** Returns `true` if there are no dependencies to invalidate. */ get empty(): boolean { const dependencies = this.dependencies return dependencies - ? (dependencies.size == 0) + ? (dependencies.length == 0) : (this.latest === undefined) } @@ -43,13 +43,14 @@ export class Dependencies { if (dependency === undefined || dependency == this.latest || dependency.obsolete) return let dependencies = this.dependencies if (dependencies) { - dependencies.add(dependency) + // Array includes repeated elements, they will be processed in updateDependencies + dependencies.push(dependency) } else { const latest = this.latest if (latest) { - dependencies = new Set() - dependencies.add(latest) - dependencies.add(dependency) + dependencies = new Array() + dependencies.push(latest) + dependencies.push(dependency) this.dependencies = dependencies } } @@ -62,23 +63,15 @@ export class Dependencies { this.frame = 0 const dependencies = this.dependencies if (dependencies) { - let disposed: Array | undefined = undefined - const it = dependencies.values() - while (true) { - const result = it.next() - if (result.done) break - const dependency = result.value as Dependency - if (!updateDependency(invalidate, dependency)) { - if (disposed) { - disposed.push(dependency) - } else { - disposed = Array.of(dependency) + let dependenciesSet = new Set(dependencies); + this.dependencies = []; + const newDependencies = this.dependencies; + if (newDependencies) { + dependenciesSet.forEach((dependency: Dependency) => { + if (updateDependency(invalidate, dependency)) { + newDependencies.push(dependency); } - } - } - if (disposed) { - let index = disposed.length - while (0 < index--) dependencies.delete(disposed[index]) + }); } } else { const latest = this.latest -- Gitee From 0256c72ea0df86e9c96e476114db413758d3a7fb Mon Sep 17 00:00:00 2001 From: Semenov Aleksandr Date: Mon, 5 May 2025 19:22:14 +0300 Subject: [PATCH 2/3] SerializerBase.ts: optimization for detecting runtimeType Signed-off-by: Semenov Aleksandr --- .../interop/src/arkts/SerializerBase.ts | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts b/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts index 7342ad5a265..22de06eabbf 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/interop/src/arkts/SerializerBase.ts @@ -50,7 +50,29 @@ export class Tags { static OBJECT = 107 } -export function runtimeType(value: Object|String|number|undefined|null): int32 { +export function runtimeType(value: T): int32 { + if (value === undefined) + return RuntimeType.UNDEFINED; + + if (value === null) + return RuntimeType.OBJECT; + + if (value instanceof String) + return RuntimeType.STRING + + if (value instanceof Numeric) + return RuntimeType.NUMBER + + if (value instanceof Boolean) + return RuntimeType.BOOLEAN + + if (value instanceof BigInt) + return RuntimeType.BIGINT + + if (value instanceof Function) + return RuntimeType.FUNCTION + + let type = typeof value if (type == "number") return RuntimeType.NUMBER if (type == "string") return RuntimeType.STRING @@ -61,7 +83,7 @@ export function runtimeType(value: Object|String|number|undefined|null): int32 { if (type == "function") return RuntimeType.FUNCTION if (type == "symbol") return RuntimeType.SYMBOL - throw new Error(`bug: ${value} is ${type}`) + return RuntimeType.OBJECT } export function registerCallback(value: object): int32 { -- Gitee From e680b947313f44c448866229e1ebb38218821bd4 Mon Sep 17 00:00:00 2001 From: Semenov Aleksandr Date: Wed, 13 Aug 2025 13:17:51 +0300 Subject: [PATCH 3/3] PeerNode: optimization for fast insertion in hot cycle Signed-off-by: Semenov Aleksandr --- .../arkoala-arkts/arkui-ohos/src/PeerNode.ts | 19 ++++++++++++++++++- .../arkoala-arkts/arkui/src/PeerNode.ts | 19 ++++++++++++++++++- .../arkoala/framework/src/PeerNode.ts | 18 +++++++++++++++++- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts index 40192ab6dd0..ac6a568071f 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/PeerNode.ts @@ -45,6 +45,7 @@ export class PeerNode extends IncrementalNode { } setId(id: int32) { + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this.id = id PeerNode.peerNodeMap.set(this.id, this) @@ -121,7 +122,22 @@ export class PeerNode extends IncrementalNode { private static peerNodeMap = new Map() + // peerNodeRawTail needs for perf optimizations. Insert into array much faster + private static peerNodeRawTail = new Array() + + private static updatePeerNodeMap() { + if (PeerNode.peerNodeRawTail.length === 0) + return + + PeerNode.peerNodeRawTail.forEach((peer: PeerNode) => { + PeerNode.peerNodeMap.set(peer.id, peer) + }) + + PeerNode.peerNodeRawTail = [] + } + static findPeerByNativeId(id: number): PeerNode | undefined { + PeerNode.updatePeerNodeMap() return PeerNode.peerNodeMap.get(id) } readonly name: string @@ -137,7 +153,7 @@ export class PeerNode extends IncrementalNode { super(derivedNodeType ?? PeerNodeType) this.id = id this.peer = NativePeerNode.create(this, peerPtr, flags) - PeerNode.peerNodeMap.set(this.id, this) + PeerNode.peerNodeRawTail.push(this) this.onChildInserted = (child: IncrementalNode) => { // TODO: rework to avoid search let peer = findPeerNode(child) @@ -181,6 +197,7 @@ export class PeerNode extends IncrementalNode { (parent as PeerNode).peer.removeChild(this.peer.ptr) } this.peer.close() + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this._reusePool?.forEach((pool: ReusablePool) => pool.dispose() diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts index 8b0cd2a5b0e..b10eebaecac 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui/src/PeerNode.ts @@ -39,6 +39,7 @@ export class PeerNode extends IncrementalNode { private _reusable: boolean = false setId(id: int32) { + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this.id = id PeerNode.peerNodeMap.set(this.id, this) @@ -99,7 +100,22 @@ export class PeerNode extends IncrementalNode { private static peerNodeMap = new Map() + // peerNodeRawTail needs for perf optimizations. Insert into array much faster + private static peerNodeRawTail = new Array() + + private static updatePeerNodeMap() { + if (PeerNode.peerNodeRawTail.length === 0) + return + + PeerNode.peerNodeRawTail.forEach((peer: PeerNode) => { + PeerNode.peerNodeMap.set(peer.id, peer) + }) + + PeerNode.peerNodeRawTail = [] + } + static findPeerByNativeId(id: number): PeerNode | undefined { + PeerNode.updatePeerNodeMap() return PeerNode.peerNodeMap.get(id) } readonly name: string @@ -115,7 +131,7 @@ export class PeerNode extends IncrementalNode { super(derivedNodeType ?? PeerNodeType) this.id = id this.peer = NativePeerNode.create(this, peerPtr, flags) - PeerNode.peerNodeMap.set(this.id, this) + PeerNode.peerNodeRawTail.push(this) this.onChildInserted = (child: IncrementalNode) => { // TODO: rework to avoid search let peer = findPeerNode(child) @@ -158,6 +174,7 @@ export class PeerNode extends IncrementalNode { (parent as PeerNode).peer.removeChild(this.peer.ptr) } this.peer.close() + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) this._onRecycle = undefined this._onReuse = undefined diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts index 7f0a2c144c6..bf862aa657f 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala/framework/src/PeerNode.ts @@ -259,7 +259,22 @@ export class PeerNode extends IncrementalNode implements CustomizableNode { protected static currentId = initialId private static peerNodeMap = new Map() + // peerNodeRawTail needs for perf optimizations. Insert into array much faster + private static peerNodeRawTail = new Array() + + private static updatePeerNodeMap() { + if (PeerNode.peerNodeRawTail.length === 0) + return + + PeerNode.peerNodeRawTail.forEach((peer: PeerNode) => { + PeerNode.peerNodeMap.set(peer.id, peer) + }) + + PeerNode.peerNodeRawTail = [] + } + static findPeerByNativeId(id: number): PeerNode | undefined { + PeerNode.updatePeerNodeMap() return PeerNode.peerNodeMap.get(id) } @@ -276,7 +291,7 @@ export class PeerNode extends IncrementalNode implements CustomizableNode { this.flags = flags this._name = name - PeerNode.peerNodeMap.set(this.id, this) + PeerNode.peerNodeRawTail.push(this) this.onChildInserted = (child: IncrementalNode) => { let peer = findPeerNode(child)! if (peer) { @@ -589,6 +604,7 @@ export class PeerNode extends IncrementalNode implements CustomizableNode { let parent = parentWithPeer(this) parent?.peer?.removeChild(this.peer) this.peer.dispose() + PeerNode.updatePeerNodeMap() PeerNode.peerNodeMap.delete(this.id) super.dispose() } -- Gitee