diff --git a/scripts/bench-ax-bfs-queue.swift b/scripts/bench-ax-bfs-queue.swift new file mode 100644 index 00000000..585691e1 --- /dev/null +++ b/scripts/bench-ax-bfs-queue.swift @@ -0,0 +1,106 @@ +import Foundation + +private struct Node { + let firstChild: Int + let childCount: Int +} + +private let depthLimit = 8 +private let branching = 3 +private var nodes: [Node] = [] +private var frontier: [(index: Int, depth: Int)] = [(0, 0)] + +nodes.reserveCapacity(9_841) +nodes.append(Node(firstChild: -1, childCount: 0)) + +var frontierIndex = 0 +while frontierIndex < frontier.count { + let (nodeIndex, depth) = frontier[frontierIndex] + frontierIndex += 1 + guard depth < depthLimit else { continue } + + let firstChild = nodes.count + for _ in 0.. Int { + var queue = roots.map { ($0, 0) } + var inspected = 0 + var checksum = 0 + + while let (nodeIndex, depth) = queue.first { + queue.removeFirst() + inspected += 1 + if inspected > maxElements { break } + + checksum &+= nodeIndex &+ depth + if depth >= maxDepth { continue } + + let node = nodes[nodeIndex] + if node.childCount > 0 { + for offset in 0.. Int { + var queue = roots.map { ($0, 0) } + var queueIndex = 0 + var inspected = 0 + var checksum = 0 + + while queueIndex < queue.count { + let (nodeIndex, depth) = queue[queueIndex] + queueIndex += 1 + inspected += 1 + if inspected > maxElements { break } + + checksum &+= nodeIndex &+ depth + if depth >= maxDepth { continue } + + let node = nodes[nodeIndex] + if node.childCount > 0 { + for offset in 0.. Int) -> (label: String, ms: Double, checksum: Int) { + var checksum = 0 + let start = DispatchTime.now().uptimeNanoseconds + for _ in 0.. 0 { let role = copyString(el, kAXRoleAttribute as CFString) ?? "" if TEXT_LEAF_ROLES.contains(role) && hasSelectedTextRange(el) { diff --git a/src/native/get-selected-text.swift b/src/native/get-selected-text.swift index 7e4f4112..3b86892b 100644 --- a/src/native/get-selected-text.swift +++ b/src/native/get-selected-text.swift @@ -163,12 +163,14 @@ private func enqueueChildren(of element: AXUIElement, depth: Int, into queue: in private func findSelectedText(from roots: [AXUIElement]) -> String? { var queue = roots.map { ($0, 0) } + var queueIndex = 0 var inspected = 0 let maxDepth = 8 let maxElements = 240 - while let (element, depth) = queue.first { - queue.removeFirst() + while queueIndex < queue.count { + let (element, depth) = queue[queueIndex] + queueIndex += 1 inspected += 1 if inspected > maxElements { break }