diff --git a/.gitignore b/.gitignore
index f2a8a6a..cda242a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -48,3 +48,14 @@ local.properties
*.swo
# Bun lockfile is committed for reproducible CI installs
+
+# Performance lab: local runs and micro-benchmark output are not committed;
+# baselines under performance/results/baseline are.
+performance/results/runs/*
+!performance/results/runs/.gitkeep
+performance/results/bench/*
+!performance/results/bench/.gitkeep
+
+# The performance lab keeps helper modules in lib/ directories; only build output is ignored.
+!performance/scripts/lib/
+!performance/benchmarks/lib/
diff --git a/.prettierignore b/.prettierignore
index 7a4cf2b..a9fed31 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -6,3 +6,5 @@ coverage/
android/
ios/
nitrogen/
+performance/results/
+performance/PERFORMANCE.md
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e57e65e..1cf28e8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -33,6 +33,7 @@ Thank you for your interest in contributing!
| `bun run nitrogen` | Run Nitrogen codegen (when specs are ready) |
| `bun run format` | Format all files with Prettier |
| `bun run doctor` | Run React Doctor locally |
+| `bun perf …` | Performance lab: run scenarios on a device, record baselines, compare (see [performance/README.md](performance/README.md)) |
## React Doctor
diff --git a/docs/roadmap.md b/docs/roadmap.md
index 81cae13..bf9266a 100644
--- a/docs/roadmap.md
+++ b/docs/roadmap.md
@@ -73,7 +73,7 @@ Delivered incrementally during Phases 3–5; polished for platform consistency i
- [x] Public README and package metadata
- [x] Expo setup documentation
- [x] CI quality checks
-- [ ] Release performance benchmark pass
+- [ ] Release performance benchmark pass — the [performance lab](../performance/README.md) records baselines; a physical-device baseline is still pending
- [ ] Migration guide from react-native-maps
- [ ] npm publish (v1.0.0)
- [ ] GitHub release with changelog
diff --git a/eslint.config.mjs b/eslint.config.mjs
index ffc2974..22af1e6 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -18,12 +18,17 @@ export default tseslint.config(
'example/metro.config.js',
'example/index.js',
'example/app.config.js',
+ 'performance/results/**',
],
},
eslint.configs.recommended,
...tseslint.configs.recommended,
{
- files: ['**/*.config.js', '**/app.plugin.js'],
+ files: [
+ '**/*.config.js',
+ '**/app.plugin.js',
+ 'performance/scripts/**/*.mjs',
+ ],
languageOptions: {
globals: {
...globals.node,
diff --git a/example/app.json b/example/app.json
index 36d27c1..4e766e3 100644
--- a/example/app.json
+++ b/example/app.json
@@ -7,10 +7,16 @@
"userInterfaceStyle": "light",
"ios": {
"supportsTablet": true,
- "bundleIdentifier": "com.nitromaps.example"
+ "bundleIdentifier": "com.nitromaps.example",
+ "infoPlist": {
+ "CADisableMinimumFrameDurationOnPhone": true,
+ "UIFileSharingEnabled": true,
+ "LSSupportsOpeningDocumentsInPlace": true
+ }
},
"android": {
"package": "com.nitromaps.example"
- }
+ },
+ "scheme": "nitromapsperf"
}
}
diff --git a/example/index.js b/example/index.js
index 1420b2f..b6a844f 100644
--- a/example/index.js
+++ b/example/index.js
@@ -1,7 +1,13 @@
import 'react-native-reanimated';
import { registerRootComponent } from 'expo';
import { SafeAreaProvider } from 'react-native-safe-area-context';
-import App from './App';
+// `EXPO_PUBLIC_*` variables are inlined at bundle time, so the demo bundle
+// never includes the performance lab unless it was built with the flag set.
+// See performance/README.md.
+const App =
+ process.env.EXPO_PUBLIC_PERF_LAB === '1'
+ ? require('../performance/app/PerfLabApp').default
+ : require('./App').default;
registerRootComponent(function Root() {
return (
diff --git a/example/modules/perf-lab/android/build.gradle b/example/modules/perf-lab/android/build.gradle
new file mode 100644
index 0000000..c38c88b
--- /dev/null
+++ b/example/modules/perf-lab/android/build.gradle
@@ -0,0 +1,20 @@
+plugins {
+ id 'com.android.library'
+ id 'expo-module-gradle-plugin'
+}
+
+group = 'expo.modules.perflab'
+version = '0.1.0'
+
+android {
+ namespace "expo.modules.perflab"
+ defaultConfig {
+ versionCode 1
+ versionName "0.1.0"
+ }
+}
+
+dependencies {
+ // ReactContext.runOnJSQueueThread for the JS message-queue probe.
+ implementation 'com.facebook.react:react-android'
+}
diff --git a/example/modules/perf-lab/android/src/main/AndroidManifest.xml b/example/modules/perf-lab/android/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..94cbbcf
--- /dev/null
+++ b/example/modules/perf-lab/android/src/main/AndroidManifest.xml
@@ -0,0 +1 @@
+
diff --git a/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/FrameRecorder.kt b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/FrameRecorder.kt
new file mode 100644
index 0000000..0afe38f
--- /dev/null
+++ b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/FrameRecorder.kt
@@ -0,0 +1,158 @@
+package expo.modules.perflab
+
+import android.app.Activity
+import android.os.Build
+import android.os.Handler
+import android.os.HandlerThread
+import android.view.Choreographer
+import android.view.Display
+import android.view.FrameMetrics
+import android.view.Window
+
+/**
+ * Records main-thread frame intervals with a [Choreographer] callback and,
+ * when an activity window is available, per-frame [FrameMetrics] so UI-thread
+ * CPU phases (animation callbacks, layout, draw) can be separated from
+ * RenderThread and GPU time.
+ *
+ * The Choreographer callback runs once per vsync while the main thread is
+ * free, so the gap between two callbacks is the frame interval the user saw:
+ * a blocked main thread shows up as one long interval.
+ */
+internal class FrameRecorder(
+ private val activity: Activity?,
+ private val displayProvider: () -> Display?,
+) : Choreographer.FrameCallback {
+ private val intervalsMs = ArrayList(8192)
+ private val expectedMs = ArrayList(8192)
+ private var lastFrameNanos = 0L
+ private var startedAtNanos = 0L
+ private var running = false
+
+ private val metricsLock = Any()
+ private val totalMs = ArrayList(8192)
+ private val phaseSumsNs = LongArray(PHASES.size)
+ private var gpuSumNs = 0L
+ private var missedDeadline = 0
+ private var metricsFrames = 0
+ private var metricsThread: HandlerThread? = null
+ private var metricsListener: Window.OnFrameMetricsAvailableListener? = null
+
+ fun start() {
+ running = true
+ startedAtNanos = System.nanoTime()
+ lastFrameNanos = 0L
+ Choreographer.getInstance().postFrameCallback(this)
+ startFrameMetrics()
+ }
+
+ override fun doFrame(frameTimeNanos: Long) {
+ if (!running) {
+ return
+ }
+ if (lastFrameNanos != 0L) {
+ intervalsMs.add((frameTimeNanos - lastFrameNanos) / 1_000_000.0)
+ expectedMs.add(1000.0 / (displayProvider()?.refreshRate ?: 60f))
+ }
+ lastFrameNanos = frameTimeNanos
+ Choreographer.getInstance().postFrameCallback(this)
+ }
+
+ private fun startFrameMetrics() {
+ val window = activity?.window ?: return
+ val thread = HandlerThread("perf-lab-frame-metrics").also { it.start() }
+ val listener = Window.OnFrameMetricsAvailableListener { _, metrics, _ ->
+ if (metrics.getMetric(FrameMetrics.FIRST_DRAW_FRAME) == 1L) {
+ return@OnFrameMetricsAvailableListener
+ }
+ val total = metrics.getMetric(FrameMetrics.TOTAL_DURATION)
+ val phases = LongArray(PHASES.size) { metrics.getMetric(PHASES[it]) }
+ val gpu = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ metrics.getMetric(FrameMetrics.GPU_DURATION)
+ } else {
+ 0L
+ }
+ val missed = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ total > metrics.getMetric(FrameMetrics.DEADLINE) - metrics.getMetric(FrameMetrics.INTENDED_VSYNC_TIMESTAMP)
+ } else {
+ false
+ }
+ synchronized(metricsLock) {
+ totalMs.add(total / 1_000_000.0)
+ for (index in phases.indices) {
+ phaseSumsNs[index] += phases[index]
+ }
+ gpuSumNs += gpu
+ if (missed) {
+ missedDeadline += 1
+ }
+ metricsFrames += 1
+ }
+ }
+ window.addOnFrameMetricsAvailableListener(listener, Handler(thread.looper))
+ metricsThread = thread
+ metricsListener = listener
+ }
+
+ fun stop(): Map {
+ running = false
+ Choreographer.getInstance().removeFrameCallback(this)
+ metricsListener?.let { listener ->
+ activity?.window?.removeOnFrameMetricsAvailableListener(listener)
+ }
+ metricsListener = null
+ metricsThread?.quitSafely()
+ metricsThread = null
+
+ val android: Map = synchronized(metricsLock) {
+ mapOf(
+ "frames" to metricsFrames,
+ "totalMs" to totalMs.toDoubleArray(),
+ "phaseSumsMs" to mapOf(
+ "unknownDelay" to phaseSumsNs[0] / 1_000_000.0,
+ "inputHandling" to phaseSumsNs[1] / 1_000_000.0,
+ "animation" to phaseSumsNs[2] / 1_000_000.0,
+ "layoutMeasure" to phaseSumsNs[3] / 1_000_000.0,
+ "draw" to phaseSumsNs[4] / 1_000_000.0,
+ "sync" to phaseSumsNs[5] / 1_000_000.0,
+ "commandIssue" to phaseSumsNs[6] / 1_000_000.0,
+ "swapBuffers" to phaseSumsNs[7] / 1_000_000.0,
+ "gpu" to gpuSumNs / 1_000_000.0,
+ "total" to phaseSumsNs[8] / 1_000_000.0,
+ ),
+ "missedDeadline" to missedDeadline,
+ )
+ }
+
+ return mapOf(
+ "intervalsMs" to intervalsMs.toDoubleArray(),
+ "expectedMs" to expectedMs.toDoubleArray(),
+ "durationMs" to (System.nanoTime() - startedAtNanos) / 1_000_000.0,
+ "refreshRateHz" to (displayProvider()?.refreshRate ?: 60f).toDouble(),
+ "startNs" to startedAtNanos.toDouble(),
+ "android" to android,
+ )
+ }
+
+ companion object {
+ private val PHASES = intArrayOf(
+ FrameMetrics.UNKNOWN_DELAY_DURATION,
+ FrameMetrics.INPUT_HANDLING_DURATION,
+ FrameMetrics.ANIMATION_DURATION,
+ FrameMetrics.LAYOUT_MEASURE_DURATION,
+ FrameMetrics.DRAW_DURATION,
+ FrameMetrics.SYNC_DURATION,
+ FrameMetrics.COMMAND_ISSUE_DURATION,
+ FrameMetrics.SWAP_BUFFERS_DURATION,
+ FrameMetrics.TOTAL_DURATION,
+ )
+
+ fun emptyRecording(display: Display?): Map = mapOf(
+ "intervalsMs" to DoubleArray(0),
+ "expectedMs" to DoubleArray(0),
+ "durationMs" to 0.0,
+ "refreshRateHz" to (display?.refreshRate ?: 60f).toDouble(),
+ "startNs" to System.nanoTime().toDouble(),
+ )
+ }
+}
diff --git a/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/JsQueueProbe.kt b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/JsQueueProbe.kt
new file mode 100644
index 0000000..4b8efad
--- /dev/null
+++ b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/JsQueueProbe.kt
@@ -0,0 +1,65 @@
+package expo.modules.perflab
+
+import android.os.Handler
+import android.os.HandlerThread
+import com.facebook.react.bridge.ReactContext
+
+/**
+ * Measures JS-thread availability directly: a background thread posts a
+ * runnable to React Native's JS message queue every [intervalMs] and records
+ * how long it waited before running. While the JS thread is idle the delay
+ * is the Looper hand-off (well under a millisecond); a React commit that
+ * serializes a marker array shows as one sample of its own length.
+ *
+ * Unlike `requestAnimationFrame` or `setTimeout` sampling, this does not
+ * depend on the UI thread's Choreographer, which React Native on Android
+ * uses to dispatch JS timers.
+ */
+internal class JsQueueProbe(
+ private val reactContext: ReactContext,
+ private val intervalMs: Long,
+) {
+ private val thread = HandlerThread("perf-lab-js-queue-probe")
+ private lateinit var handler: Handler
+ private val lock = Any()
+ private val latenessMs = ArrayList(8192)
+ private var startedAtNanos = 0L
+
+ @Volatile
+ private var running = false
+
+ fun start() {
+ thread.start()
+ handler = Handler(thread.looper)
+ startedAtNanos = System.nanoTime()
+ running = true
+ handler.post(::tick)
+ }
+
+ private fun tick() {
+ if (!running) {
+ return
+ }
+ val posted = System.nanoTime()
+ reactContext.runOnJSQueueThread {
+ val late = (System.nanoTime() - posted) / 1_000_000.0
+ synchronized(lock) {
+ latenessMs.add(late)
+ }
+ }
+ handler.postDelayed(::tick, intervalMs)
+ }
+
+ fun stop(): Map {
+ running = false
+ thread.quitSafely()
+ return synchronized(lock) {
+ mapOf(
+ "latenessMs" to latenessMs.toDoubleArray(),
+ "samples" to latenessMs.size,
+ "intervalMs" to intervalMs.toDouble(),
+ "durationMs" to (System.nanoTime() - startedAtNanos) / 1_000_000.0,
+ )
+ }
+ }
+}
diff --git a/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/PerfLabModule.kt b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/PerfLabModule.kt
new file mode 100644
index 0000000..1b68663
--- /dev/null
+++ b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/PerfLabModule.kt
@@ -0,0 +1,118 @@
+package expo.modules.perflab
+
+import android.os.Build
+import android.util.Log
+import android.view.Display
+import com.facebook.react.bridge.ReactContext
+import expo.modules.kotlin.functions.Queues
+import expo.modules.kotlin.modules.Module
+import expo.modules.kotlin.modules.ModuleDefinition
+import java.io.File
+
+/**
+ * Native measurement module for the performance lab (performance/README.md).
+ *
+ * Frame recording starts and stops on the main thread because that is the
+ * thread whose frame intervals are measured.
+ */
+class PerfLabModule : Module() {
+ private var recorder: FrameRecorder? = null
+ private var jsQueueProbe: JsQueueProbe? = null
+
+ override fun definition() = ModuleDefinition {
+ Name("PerfLab")
+
+ AsyncFunction("startFrames") {
+ recorder?.stop()
+ recorder = FrameRecorder(appContext.currentActivity, ::currentDisplay).also { it.start() }
+ }.runOnQueue(Queues.MAIN)
+
+ AsyncFunction("stopFrames") {
+ val active = recorder
+ recorder = null
+ active?.stop() ?: FrameRecorder.emptyRecording(currentDisplay())
+ }.runOnQueue(Queues.MAIN)
+
+ AsyncFunction("memorySnapshot") {
+ ProcessStats.memorySnapshot(requireContext())
+ }
+
+ AsyncFunction("processStats") {
+ ProcessStats.processStats(requireContext())
+ }
+
+ AsyncFunction("deviceInfo") {
+ ProcessStats.deviceInfo(requireContext(), appContext.currentActivity, currentDisplay())
+ }.runOnQueue(Queues.MAIN)
+
+ Function("nowNs") {
+ System.nanoTime().toDouble()
+ }
+
+ AsyncFunction("startJsQueueProbe") { intervalMs: Double ->
+ jsQueueProbe?.stop()
+ val context = requireContext() as? ReactContext
+ ?: throw IllegalStateException("JS queue probe needs a ReactContext")
+ jsQueueProbe = JsQueueProbe(context, intervalMs.toLong().coerceAtLeast(1)).also { it.start() }
+ }
+
+ AsyncFunction("stopJsQueueProbe") {
+ val active = jsQueueProbe
+ jsQueueProbe = null
+ active?.stop() ?: mapOf(
+ "latenessMs" to DoubleArray(0),
+ "samples" to 0,
+ "intervalMs" to 0.0,
+ "durationMs" to 0.0,
+ )
+ }
+
+ // `adb shell am start -n /.MainActivity --es perfRun ` is an
+ // alternative to the VIEW intent that the CLI uses.
+ Function("launchRequest") {
+ appContext.currentActivity?.intent?.getStringExtra("perfRun")
+ }
+
+ Function("probesAvailable") {
+ ProbeBridge.isAvailable()
+ }
+
+ AsyncFunction("setProbesEnabled") { enabled: Boolean ->
+ ProbeBridge.setEnabled(enabled)
+ }
+
+ AsyncFunction("drainProbes") {
+ ProbeBridge.drainJson()
+ }
+
+ AsyncFunction("logLine") { line: String ->
+ Log.i(TAG, line)
+ }
+
+ AsyncFunction("writeResultFile") { name: String, content: String ->
+ val context = requireContext()
+ val base = context.getExternalFilesDir(null) ?: context.filesDir
+ val directory = File(base, "perf-lab").also { it.mkdirs() }
+ val file = File(directory, name)
+ file.writeText(content)
+ file.absolutePath
+ }
+ }
+
+ private fun requireContext() =
+ requireNotNull(appContext.reactContext) { "React context is not available" }
+
+ private fun currentDisplay(): Display? {
+ val activity = appContext.currentActivity ?: return null
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ activity.display
+ } else {
+ @Suppress("DEPRECATION")
+ activity.windowManager.defaultDisplay
+ }
+ }
+
+ private companion object {
+ const val TAG = "NitroMapsPerfLab"
+ }
+}
diff --git a/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/ProbeBridge.kt b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/ProbeBridge.kt
new file mode 100644
index 0000000..2f331be
--- /dev/null
+++ b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/ProbeBridge.kt
@@ -0,0 +1,25 @@
+package expo.modules.perflab
+
+/**
+ * Reaches `NitroMapsPerfProbeBridge` inside react-native-better-maps through
+ * reflection so this module does not depend on the library's Gradle module.
+ */
+internal object ProbeBridge {
+ private const val CLASS_NAME = "com.margelo.nitro.nitromaps.NitroMapsPerfProbeBridge"
+
+ private val bridge: Class<*>? = try {
+ Class.forName(CLASS_NAME)
+ } catch (_: ClassNotFoundException) {
+ null
+ }
+
+ fun isAvailable(): Boolean =
+ bridge?.getMethod("isAvailable")?.invoke(null) as? Boolean ?: false
+
+ fun setEnabled(enabled: Boolean) {
+ bridge?.getMethod("setEnabled", Boolean::class.javaPrimitiveType)?.invoke(null, enabled)
+ }
+
+ fun drainJson(): String =
+ bridge?.getMethod("drainJson")?.invoke(null) as? String ?: "{\"spans\":[],\"dropped\":0}"
+}
diff --git a/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/ProcessStats.kt b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/ProcessStats.kt
new file mode 100644
index 0000000..08cb24e
--- /dev/null
+++ b/example/modules/perf-lab/android/src/main/java/expo/modules/perflab/ProcessStats.kt
@@ -0,0 +1,173 @@
+package expo.modules.perflab
+
+import android.app.Activity
+import android.app.ActivityManager
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.content.pm.ApplicationInfo
+import android.os.BatteryManager
+import android.os.Build
+import android.os.Debug
+import android.os.PowerManager
+import android.os.Process
+import android.view.Display
+import java.io.File
+
+internal object ProcessStats {
+ /**
+ * PSS is the closest Android equivalent of iOS `phys_footprint`. ART's
+ * runtime stats give cumulative allocation and GC counters, so deltas
+ * between two snapshots are the allocation churn of what ran in between.
+ */
+ fun memorySnapshot(context: Context): Map {
+ val runtime = Runtime.getRuntime()
+ val memoryInfo = Debug.MemoryInfo()
+ Debug.getMemoryInfo(memoryInfo)
+ val stats = HashMap()
+ for ((key, value) in memoryInfo.memoryStats) {
+ value.toDoubleOrNull()?.let { stats[key] = it }
+ }
+
+ return mapOf(
+ "footprintBytes" to memoryInfo.totalPss * 1024.0,
+ "residentBytes" to residentBytes(),
+ "javaHeapUsedBytes" to (runtime.totalMemory() - runtime.freeMemory()).toDouble(),
+ "nativeHeapAllocatedBytes" to Debug.getNativeHeapAllocatedSize().toDouble(),
+ "nativeHeapSizeBytes" to Debug.getNativeHeapSize().toDouble(),
+ "gcCount" to runtimeStat("art.gc.gc-count"),
+ "gcTimeMs" to runtimeStat("art.gc.gc-time"),
+ "bytesAllocated" to runtimeStat("art.gc.bytes-allocated"),
+ "bytesFreed" to runtimeStat("art.gc.bytes-freed"),
+ "blockingGcCount" to runtimeStat("art.gc.blocking-gc-count"),
+ "blockingGcTimeMs" to runtimeStat("art.gc.blocking-gc-time"),
+ "memoryStats" to stats,
+ "context" to context.packageName,
+ )
+ }
+
+ fun processStats(context: Context): Map {
+ val powerManager = context.getSystemService(Context.POWER_SERVICE) as? PowerManager
+ val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as? BatteryManager
+ val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
+ val status = batteryIntent?.getIntExtra(BatteryManager.EXTRA_STATUS, -1) ?: -1
+
+ return mapOf(
+ "cpuTimeMs" to Process.getElapsedCpuTime().toDouble(),
+ "wallTimeMs" to System.nanoTime() / 1_000_000.0,
+ "threadCount" to threadCount(),
+ "thermalState" to thermalStatusName(powerManager),
+ "batteryLevel" to ((batteryManager?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) ?: -100) / 100.0),
+ "batteryState" to batteryStatusName(status),
+ "lowPowerMode" to (powerManager?.isPowerSaveMode ?: false),
+ )
+ }
+
+ fun deviceInfo(context: Context, activity: Activity?, display: Display?): Map {
+ val metrics = context.resources.displayMetrics
+ val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager
+ val memoryInfo = ActivityManager.MemoryInfo().also { activityManager?.getMemoryInfo(it) }
+ val packageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
+ val isDebuggable = (context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) != 0
+ val supportedRates = display?.supportedModes
+ ?.map { it.refreshRate.toDouble() }
+ ?.distinct()
+ ?.sorted()
+ ?: emptyList()
+
+ return mapOf(
+ "platform" to "android",
+ "model" to Build.MODEL,
+ "manufacturer" to Build.MANUFACTURER,
+ "deviceName" to (Build.DEVICE ?: ""),
+ "osVersion" to Build.VERSION.RELEASE,
+ "apiLevel" to Build.VERSION.SDK_INT,
+ "refreshRateHz" to (display?.refreshRate ?: 60f).toDouble(),
+ "supportedRefreshRatesHz" to supportedRates,
+ "screenScale" to metrics.density.toDouble(),
+ "screenWidthPx" to metrics.widthPixels.toDouble(),
+ "screenHeightPx" to metrics.heightPixels.toDouble(),
+ "isDebugBuild" to isDebuggable,
+ "isSimulator" to isEmulator(),
+ "cpuCores" to Runtime.getRuntime().availableProcessors(),
+ "totalMemoryBytes" to memoryInfo.totalMem.toDouble(),
+ "appVersion" to "${packageInfo.versionName} (${versionCode(packageInfo)})",
+ "activity" to (activity?.javaClass?.simpleName ?: ""),
+ )
+ }
+
+ private fun versionCode(packageInfo: android.content.pm.PackageInfo): Long =
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ packageInfo.longVersionCode
+ } else {
+ @Suppress("DEPRECATION")
+ packageInfo.versionCode.toLong()
+ }
+
+ private fun runtimeStat(name: String): Double =
+ Debug.getRuntimeStat(name)?.toDoubleOrNull() ?: -1.0
+
+ private fun residentBytes(): Double {
+ return try {
+ val fields = File("/proc/self/statm").readText().trim().split(' ')
+ fields.getOrNull(1)?.toDoubleOrNull()?.let { pages -> pages * PAGE_SIZE } ?: -1.0
+ } catch (_: Exception) {
+ -1.0
+ }
+ }
+
+ private fun threadCount(): Int {
+ return try {
+ File("/proc/self/status").readLines()
+ .firstOrNull { it.startsWith("Threads:") }
+ ?.substringAfter(':')
+ ?.trim()
+ ?.toIntOrNull()
+ ?: -1
+ } catch (_: Exception) {
+ -1
+ }
+ }
+
+ private fun thermalStatusName(powerManager: PowerManager?): String {
+ if (powerManager == null || Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
+ return "unknown"
+ }
+ return when (powerManager.currentThermalStatus) {
+ PowerManager.THERMAL_STATUS_NONE -> "none"
+ PowerManager.THERMAL_STATUS_LIGHT -> "light"
+ PowerManager.THERMAL_STATUS_MODERATE -> "moderate"
+ PowerManager.THERMAL_STATUS_SEVERE -> "severe"
+ PowerManager.THERMAL_STATUS_CRITICAL -> "critical"
+ PowerManager.THERMAL_STATUS_EMERGENCY -> "emergency"
+ PowerManager.THERMAL_STATUS_SHUTDOWN -> "shutdown"
+ else -> "unknown"
+ }
+ }
+
+ private fun batteryStatusName(status: Int): String = when (status) {
+ BatteryManager.BATTERY_STATUS_CHARGING -> "charging"
+ BatteryManager.BATTERY_STATUS_DISCHARGING -> "unplugged"
+ BatteryManager.BATTERY_STATUS_FULL -> "full"
+ BatteryManager.BATTERY_STATUS_NOT_CHARGING -> "notCharging"
+ else -> "unknown"
+ }
+
+ private fun isEmulator(): Boolean {
+ val fingerprint = Build.FINGERPRINT.lowercase()
+ val hardware = Build.HARDWARE.lowercase()
+ val product = Build.PRODUCT.lowercase()
+ return fingerprint.contains("generic") ||
+ fingerprint.contains("emulator") ||
+ hardware.contains("goldfish") ||
+ hardware.contains("ranchu") ||
+ product.contains("sdk")
+ }
+
+ private val PAGE_SIZE: Double = try {
+ (Class.forName("android.system.Os").getMethod("sysconf", Int::class.javaPrimitiveType)
+ .invoke(null, 0x28 /* _SC_PAGESIZE */) as Long).toDouble()
+ } catch (_: Exception) {
+ 4096.0
+ }
+}
diff --git a/example/modules/perf-lab/expo-module.config.json b/example/modules/perf-lab/expo-module.config.json
new file mode 100644
index 0000000..5896fce
--- /dev/null
+++ b/example/modules/perf-lab/expo-module.config.json
@@ -0,0 +1,9 @@
+{
+ "platforms": ["apple", "android"],
+ "apple": {
+ "modules": ["PerfLabModule"]
+ },
+ "android": {
+ "modules": ["expo.modules.perflab.PerfLabModule"]
+ }
+}
diff --git a/example/modules/perf-lab/index.ts b/example/modules/perf-lab/index.ts
new file mode 100644
index 0000000..361157b
--- /dev/null
+++ b/example/modules/perf-lab/index.ts
@@ -0,0 +1 @@
+export * from './src/PerfLabNative';
diff --git a/example/modules/perf-lab/ios/FrameRecorder.swift b/example/modules/perf-lab/ios/FrameRecorder.swift
new file mode 100644
index 0000000..7a847f6
--- /dev/null
+++ b/example/modules/perf-lab/ios/FrameRecorder.swift
@@ -0,0 +1,69 @@
+import QuartzCore
+import UIKit
+
+/// Records main-thread frame intervals with a `CADisplayLink`.
+///
+/// The link fires once per display refresh while the main thread is free, so
+/// the gap between two callbacks is the frame interval the user experienced:
+/// a blocked main thread shows up as one long interval. The interval the
+/// display was running at is captured per frame, because ProMotion displays
+/// change refresh rate on their own.
+final class FrameRecorder {
+ private var displayLink: CADisplayLink?
+ private var lastTimestamp: CFTimeInterval = 0
+ private var startedAt: CFTimeInterval = 0
+ private var startNs: UInt64 = 0
+ private var intervalsMs: [Double] = []
+ private var expectedMs: [Double] = []
+
+ func start() {
+ intervalsMs.reserveCapacity(8192)
+ expectedMs.reserveCapacity(8192)
+
+ let link = CADisplayLink(target: self, selector: #selector(step(_:)))
+ let maximum = Float(UIScreen.main.maximumFramesPerSecond)
+ // Ask for the display's full rate so a 120 Hz device is measured at 120 Hz.
+ // On iPhone this also needs `CADisableMinimumFrameDurationOnPhone` in
+ // Info.plist, which the example app sets.
+ link.preferredFrameRateRange = CAFrameRateRange(
+ minimum: 30,
+ maximum: maximum,
+ preferred: maximum
+ )
+ link.add(to: .main, forMode: .common)
+ displayLink = link
+ startedAt = CACurrentMediaTime()
+ startNs = DispatchTime.now().uptimeNanoseconds
+ lastTimestamp = 0
+ }
+
+ @objc private func step(_ link: CADisplayLink) {
+ if lastTimestamp > 0 {
+ intervalsMs.append((link.timestamp - lastTimestamp) * 1000)
+ expectedMs.append((link.targetTimestamp - link.timestamp) * 1000)
+ }
+ lastTimestamp = link.timestamp
+ }
+
+ func stop() -> [String: Any] {
+ displayLink?.invalidate()
+ displayLink = nil
+ return [
+ "intervalsMs": intervalsMs,
+ "expectedMs": expectedMs,
+ "durationMs": (CACurrentMediaTime() - startedAt) * 1000,
+ "refreshRateHz": Double(UIScreen.main.maximumFramesPerSecond),
+ "startNs": Double(startNs),
+ ]
+ }
+
+ static func emptyRecording() -> [String: Any] {
+ [
+ "intervalsMs": [Double](),
+ "expectedMs": [Double](),
+ "durationMs": 0.0,
+ "refreshRateHz": Double(UIScreen.main.maximumFramesPerSecond),
+ "startNs": Double(DispatchTime.now().uptimeNanoseconds),
+ ]
+ }
+}
diff --git a/example/modules/perf-lab/ios/PerfLab.podspec b/example/modules/perf-lab/ios/PerfLab.podspec
new file mode 100644
index 0000000..89d2076
--- /dev/null
+++ b/example/modules/perf-lab/ios/PerfLab.podspec
@@ -0,0 +1,25 @@
+require 'json'
+
+package = JSON.parse(File.read(File.join(__dir__, '..', 'package.json')))
+
+Pod::Spec.new do |s|
+ s.name = 'PerfLab'
+ s.version = package['version']
+ s.summary = package['description']
+ s.description = package['description']
+ s.license = package['license']
+ s.author = package['author']
+ s.homepage = package['homepage']
+ s.platforms = { :ios => '16.0' }
+ s.swift_version = '5.9'
+ s.source = { git: package['homepage'] }
+ s.static_framework = true
+
+ s.dependency 'ExpoModulesCore'
+
+ s.source_files = "**/*.{h,m,swift}"
+ s.pod_target_xcconfig = {
+ 'DEFINES_MODULE' => 'YES',
+ 'SWIFT_COMPILATION_MODE' => 'wholemodule'
+ }
+end
diff --git a/example/modules/perf-lab/ios/PerfLabModule.swift b/example/modules/perf-lab/ios/PerfLabModule.swift
new file mode 100644
index 0000000..1ea9ec8
--- /dev/null
+++ b/example/modules/perf-lab/ios/PerfLabModule.swift
@@ -0,0 +1,82 @@
+import ExpoModulesCore
+import Foundation
+import UIKit
+import os.log
+
+/// Native measurement module for the performance lab (performance/README.md).
+///
+/// Frame recording starts and stops on the main thread because that is the
+/// thread whose frame intervals are measured.
+public final class PerfLabModule: Module {
+ private static let log = OSLog(subsystem: "com.nitromaps.perflab", category: "results")
+ private var recorder: FrameRecorder?
+
+ public func definition() -> ModuleDefinition {
+ Name("PerfLab")
+
+ AsyncFunction("startFrames") { () -> Void in
+ _ = self.recorder?.stop()
+ let recorder = FrameRecorder()
+ recorder.start()
+ self.recorder = recorder
+ }.runOnQueue(.main)
+
+ AsyncFunction("stopFrames") { () -> [String: Any] in
+ guard let recorder = self.recorder else {
+ return FrameRecorder.emptyRecording()
+ }
+ self.recorder = nil
+ return recorder.stop()
+ }.runOnQueue(.main)
+
+ AsyncFunction("memorySnapshot") { () -> [String: Any] in
+ ProcessStats.memorySnapshot()
+ }
+
+ AsyncFunction("processStats") { () -> [String: Any] in
+ ProcessStats.processStats()
+ }.runOnQueue(.main)
+
+ AsyncFunction("deviceInfo") { () -> [String: Any] in
+ DeviceInfo.collect()
+ }.runOnQueue(.main)
+
+ Function("nowNs") { () -> Double in
+ Double(DispatchTime.now().uptimeNanoseconds)
+ }
+
+ // `xcrun simctl launch --perf-run=` passes the run
+ // request without the "Open in …?" prompt that `simctl openurl` shows.
+ Function("launchRequest") { () -> String? in
+ for argument in ProcessInfo.processInfo.arguments where argument.hasPrefix("--perf-run=") {
+ return String(argument.dropFirst("--perf-run=".count))
+ }
+ return ProcessInfo.processInfo.environment["PERF_LAB_RUN"]
+ }
+
+ Function("probesAvailable") { () -> Bool in
+ ProbeBridge.isAvailable
+ }
+
+ AsyncFunction("setProbesEnabled") { (enabled: Bool) -> Void in
+ ProbeBridge.setEnabled(enabled)
+ }
+
+ AsyncFunction("drainProbes") { () -> String in
+ ProbeBridge.drainJSON()
+ }
+
+ AsyncFunction("logLine") { (line: String) -> Void in
+ os_log("%{public}@", log: Self.log, type: .default, line)
+ }
+
+ AsyncFunction("writeResultFile") { (name: String, content: String) -> String in
+ let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
+ let directory = documents.appendingPathComponent("perf-lab", isDirectory: true)
+ try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)
+ let file = directory.appendingPathComponent(name)
+ try content.write(to: file, atomically: true, encoding: .utf8)
+ return file.path
+ }
+ }
+}
diff --git a/example/modules/perf-lab/ios/ProbeBridge.swift b/example/modules/perf-lab/ios/ProbeBridge.swift
new file mode 100644
index 0000000..ec352f8
--- /dev/null
+++ b/example/modules/perf-lab/ios/ProbeBridge.swift
@@ -0,0 +1,44 @@
+import Foundation
+
+/// Talks to `NitroMapsPerfProbeBridge` inside react-native-better-maps by
+/// selector, so this module never imports the library's Swift module (which
+/// is compiled with C++ interop). Every selector is argument-free.
+enum ProbeBridge {
+ private static var bridgeClass: AnyObject? {
+ NSClassFromString("NitroMapsPerfProbeBridge")
+ }
+
+ private static func callObject(_ name: String) -> AnyObject? {
+ guard let bridge = bridgeClass else {
+ return nil
+ }
+ let selector = NSSelectorFromString(name)
+ guard bridge.responds(to: selector) else {
+ return nil
+ }
+ return bridge.perform(selector)?.takeUnretainedValue()
+ }
+
+ private static func callVoid(_ name: String) {
+ guard let bridge = bridgeClass else {
+ return
+ }
+ let selector = NSSelectorFromString(name)
+ guard bridge.responds(to: selector) else {
+ return
+ }
+ _ = bridge.perform(selector)
+ }
+
+ static var isAvailable: Bool {
+ (callObject("probesAvailable") as? NSNumber)?.boolValue ?? false
+ }
+
+ static func setEnabled(_ enabled: Bool) {
+ callVoid(enabled ? "enableProbes" : "disableProbes")
+ }
+
+ static func drainJSON() -> String {
+ (callObject("drainJSON") as? String) ?? "{\"spans\":[],\"dropped\":0}"
+ }
+}
diff --git a/example/modules/perf-lab/ios/ProcessStats.swift b/example/modules/perf-lab/ios/ProcessStats.swift
new file mode 100644
index 0000000..fe1fcc3
--- /dev/null
+++ b/example/modules/perf-lab/ios/ProcessStats.swift
@@ -0,0 +1,129 @@
+import Darwin
+import Foundation
+import UIKit
+
+enum ProcessStats {
+ /// `phys_footprint` is the number Xcode's memory gauge and jetsam use.
+ /// `malloc_zone_statistics(nil, …)` sums every malloc zone, which is where
+ /// Swift class instances, C++ vectors and Nitro structs live.
+ static func memorySnapshot() -> [String: Any] {
+ var info = task_vm_info_data_t()
+ var count = mach_msg_type_number_t(
+ MemoryLayout.size / MemoryLayout.size
+ )
+ let result = withUnsafeMutablePointer(to: &info) { pointer in
+ pointer.withMemoryRebound(to: integer_t.self, capacity: Int(count)) {
+ task_info(mach_task_self_, task_flavor_t(TASK_VM_INFO), $0, &count)
+ }
+ }
+ var mallocStats = malloc_statistics_t()
+ malloc_zone_statistics(nil, &mallocStats)
+
+ return [
+ "footprintBytes": result == KERN_SUCCESS ? Double(info.phys_footprint) : -1,
+ "residentBytes": result == KERN_SUCCESS ? Double(info.resident_size) : -1,
+ "mallocBlocksInUse": Double(mallocStats.blocks_in_use),
+ "mallocBytesInUse": Double(mallocStats.size_in_use),
+ "mallocMaxBytesInUse": Double(mallocStats.max_size_in_use),
+ ]
+ }
+
+ /// Must run on the main thread (UIDevice battery monitoring).
+ static func processStats() -> [String: Any] {
+ var usage = rusage()
+ getrusage(RUSAGE_SELF, &usage)
+ let cpuMs = Double(usage.ru_utime.tv_sec + usage.ru_stime.tv_sec) * 1000
+ + Double(usage.ru_utime.tv_usec + usage.ru_stime.tv_usec) / 1000
+
+ let device = UIDevice.current
+ device.isBatteryMonitoringEnabled = true
+
+ return [
+ "cpuTimeMs": cpuMs,
+ "wallTimeMs": Double(DispatchTime.now().uptimeNanoseconds) / 1_000_000,
+ "threadCount": threadCount(),
+ "thermalState": thermalStateName(ProcessInfo.processInfo.thermalState),
+ "batteryLevel": Double(device.batteryLevel),
+ "batteryState": batteryStateName(device.batteryState),
+ "lowPowerMode": ProcessInfo.processInfo.isLowPowerModeEnabled,
+ ]
+ }
+
+ static func threadCount() -> Int {
+ var threads: thread_act_array_t?
+ var count: mach_msg_type_number_t = 0
+ guard task_threads(mach_task_self_, &threads, &count) == KERN_SUCCESS, let threads else {
+ return -1
+ }
+ let size = vm_size_t(count) * vm_size_t(MemoryLayout.size)
+ vm_deallocate(mach_task_self_, vm_address_t(bitPattern: threads), size)
+ return Int(count)
+ }
+
+ private static func thermalStateName(_ state: ProcessInfo.ThermalState) -> String {
+ switch state {
+ case .nominal: return "nominal"
+ case .fair: return "fair"
+ case .serious: return "serious"
+ case .critical: return "critical"
+ @unknown default: return "unknown"
+ }
+ }
+
+ private static func batteryStateName(_ state: UIDevice.BatteryState) -> String {
+ switch state {
+ case .unknown: return "unknown"
+ case .unplugged: return "unplugged"
+ case .charging: return "charging"
+ case .full: return "full"
+ @unknown default: return "unknown"
+ }
+ }
+}
+
+enum DeviceInfo {
+ /// Must run on the main thread (UIScreen / UIDevice).
+ static func collect() -> [String: Any] {
+ var systemInfo = utsname()
+ uname(&systemInfo)
+ let machine = withUnsafePointer(to: &systemInfo.machine) { pointer in
+ pointer.withMemoryRebound(to: CChar.self, capacity: 1) { String(cString: $0) }
+ }
+
+ #if targetEnvironment(simulator)
+ let isSimulator = true
+ let model = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? machine
+ #else
+ let isSimulator = false
+ let model = machine
+ #endif
+
+ #if DEBUG
+ let isDebugBuild = true
+ #else
+ let isDebugBuild = false
+ #endif
+
+ let screen = UIScreen.main
+ let info = Bundle.main.infoDictionary
+ let version = info?["CFBundleShortVersionString"] as? String ?? "0"
+ let build = info?["CFBundleVersion"] as? String ?? "0"
+
+ return [
+ "platform": "ios",
+ "model": model,
+ "manufacturer": "Apple",
+ "deviceName": UIDevice.current.name,
+ "osVersion": UIDevice.current.systemVersion,
+ "refreshRateHz": Double(screen.maximumFramesPerSecond),
+ "screenScale": Double(screen.scale),
+ "screenWidthPx": Double(screen.nativeBounds.width),
+ "screenHeightPx": Double(screen.nativeBounds.height),
+ "isDebugBuild": isDebugBuild,
+ "isSimulator": isSimulator,
+ "cpuCores": ProcessInfo.processInfo.activeProcessorCount,
+ "totalMemoryBytes": Double(ProcessInfo.processInfo.physicalMemory),
+ "appVersion": "\(version) (\(build))",
+ ]
+ }
+}
diff --git a/example/modules/perf-lab/package.json b/example/modules/perf-lab/package.json
new file mode 100644
index 0000000..2cbd146
--- /dev/null
+++ b/example/modules/perf-lab/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "perf-lab",
+ "version": "0.1.0",
+ "private": true,
+ "description": "Native measurement module for the react-native-better-maps performance lab",
+ "main": "index.ts",
+ "license": "MIT",
+ "author": "gmi.software",
+ "homepage": "https://github.com/gmi-software/react-native-better-maps"
+}
diff --git a/example/modules/perf-lab/src/PerfLabNative.ts b/example/modules/perf-lab/src/PerfLabNative.ts
new file mode 100644
index 0000000..89f2dfd
--- /dev/null
+++ b/example/modules/perf-lab/src/PerfLabNative.ts
@@ -0,0 +1,255 @@
+import { requireNativeModule } from 'expo';
+
+/**
+ * Raw output of one frame recording.
+ *
+ * `intervalsMs[i]` is the time between display refresh callbacks i and i+1 on
+ * the main thread; `expectedMs[i]` is the refresh interval the display was
+ * running at for that frame (ProMotion and adaptive Android displays change
+ * rate on their own, so jank is judged per frame, not against a fixed 16.67 ms).
+ */
+export interface FrameRecording {
+ intervalsMs: number[];
+ expectedMs: number[];
+ durationMs: number;
+ refreshRateHz: number;
+ /** Clock value (see `nowNs`) when recording started. */
+ startNs: number;
+ /** Android only: `FrameMetrics` from the window, per rendered frame. */
+ android?: AndroidFrameMetrics;
+}
+
+export interface AndroidFrameMetrics {
+ frames: number;
+ /** Per-frame `TOTAL_DURATION` in ms (CPU work on the UI + render threads). */
+ totalMs: number[];
+ /** Sum of each phase across all frames, in ms. */
+ phaseSumsMs: {
+ unknownDelay: number;
+ inputHandling: number;
+ animation: number;
+ layoutMeasure: number;
+ draw: number;
+ sync: number;
+ commandIssue: number;
+ swapBuffers: number;
+ gpu: number;
+ total: number;
+ };
+ missedDeadline: number;
+}
+
+export interface MemorySnapshot {
+ /** phys_footprint on iOS, PSS on Android; the number the OS uses for memory pressure. */
+ footprintBytes: number;
+ residentBytes: number;
+ /** iOS: malloc blocks in use (all zones). */
+ mallocBlocksInUse?: number;
+ mallocBytesInUse?: number;
+ /** Android: Java heap in use (Runtime.totalMemory - freeMemory). */
+ javaHeapUsedBytes?: number;
+ /** Android: Debug.getNativeHeapAllocatedSize(). */
+ nativeHeapAllocatedBytes?: number;
+ nativeHeapSizeBytes?: number;
+ /** Android ART runtime GC stats (cumulative since process start). */
+ gcCount?: number;
+ gcTimeMs?: number;
+ bytesAllocated?: number;
+ bytesFreed?: number;
+ blockingGcCount?: number;
+ blockingGcTimeMs?: number;
+ /** Android: Debug.MemoryInfo summary (kB) keyed as reported by the platform. */
+ memoryStats?: Record;
+}
+
+export interface ProcessStats {
+ /** Process CPU time (user + system) in ms since process start. */
+ cpuTimeMs: number;
+ /** Monotonic wall clock in ms (same clock as `nowNs`). */
+ wallTimeMs: number;
+ threadCount: number;
+ thermalState: string;
+ batteryLevel: number;
+ batteryState: string;
+ lowPowerMode: boolean;
+}
+
+export interface DeviceInfo {
+ platform: 'ios' | 'android';
+ model: string;
+ manufacturer: string;
+ deviceName?: string;
+ osVersion: string;
+ apiLevel?: number;
+ refreshRateHz: number;
+ supportedRefreshRatesHz?: number[];
+ screenScale: number;
+ screenWidthPx: number;
+ screenHeightPx: number;
+ isDebugBuild: boolean;
+ isSimulator: boolean;
+ cpuCores: number;
+ totalMemoryBytes: number;
+ appVersion: string;
+}
+
+/** Android only: delay of runnables posted to React Native's JS message queue. */
+export interface JsQueueRecording {
+ latenessMs: number[];
+ samples: number;
+ intervalMs: number;
+ durationMs: number;
+}
+
+export interface ProbeSpan {
+ name: string;
+ startNs: number;
+ durationNs: number;
+ count: number;
+ thread: 'main' | 'background';
+}
+
+export interface ProbeDrain {
+ spans: ProbeSpan[];
+ dropped: number;
+}
+
+interface NativePerfLab {
+ startFrames(): Promise;
+ stopFrames(): Promise;
+ memorySnapshot(): Promise;
+ processStats(): Promise;
+ deviceInfo(): Promise;
+ nowNs(): number;
+ launchRequest?(): string | null;
+ startJsQueueProbe?(intervalMs: number): Promise;
+ stopJsQueueProbe?(): Promise;
+ probesAvailable(): boolean;
+ setProbesEnabled(enabled: boolean): Promise;
+ drainProbes(): Promise;
+ logLine(line: string): Promise;
+ writeResultFile(name: string, content: string): Promise;
+}
+
+const native = requireNativeModule('PerfLab');
+
+/** Starts recording main-thread frame intervals. Stops any recording in progress. */
+export function startFrameRecording(): Promise {
+ return native.startFrames();
+}
+
+/** Stops recording and returns every frame interval seen since `start`. */
+export function stopFrameRecording(): Promise {
+ return native.stopFrames();
+}
+
+export function memorySnapshot(): Promise {
+ return native.memorySnapshot();
+}
+
+export function processStats(): Promise {
+ return native.processStats();
+}
+
+export async function deviceInfo(): Promise {
+ const info = await native.deviceInfo();
+ return {
+ ...info,
+ refreshRateHz: Math.round(info.refreshRateHz * 100) / 100,
+ supportedRefreshRatesHz: info.supportedRefreshRatesHz?.map(
+ (rate) => Math.round(rate * 100) / 100,
+ ),
+ };
+}
+
+/**
+ * Native monotonic clock in nanoseconds, on the clock the library probes and
+ * the frame recorder use. Synchronous, so it can be paired with
+ * `performance.now()` to align JS and native timestamps.
+ */
+export function nowNs(): number {
+ return native.nowNs();
+}
+
+/**
+ * A run request handed over at process launch (iOS: `--perf-run=` launch
+ * argument or `PERF_LAB_RUN` env; Android: `perfRun` intent extra), or null.
+ */
+export function launchRequest(): string | null {
+ return typeof native.launchRequest === 'function'
+ ? (native.launchRequest() ?? null)
+ : null;
+}
+
+/** Whether the native module can ping the JS message queue (Android). */
+export function jsQueueProbeAvailable(): boolean {
+ return (
+ typeof native.startJsQueueProbe === 'function' &&
+ typeof native.stopJsQueueProbe === 'function'
+ );
+}
+
+/**
+ * Starts pinging React Native's JS message queue from a native thread every
+ * `intervalMs`; the delay before each ping runs is JS-thread busy time.
+ */
+export function startJsQueueProbe(intervalMs: number): Promise {
+ if (typeof native.startJsQueueProbe !== 'function') {
+ return Promise.reject(
+ new Error('JS queue probe is not available on this platform'),
+ );
+ }
+ return native.startJsQueueProbe(intervalMs);
+}
+
+export function stopJsQueueProbe(): Promise {
+ if (typeof native.stopJsQueueProbe !== 'function') {
+ return Promise.resolve({
+ latenessMs: [],
+ samples: 0,
+ intervalMs: 0,
+ durationMs: 0,
+ });
+ }
+ return native.stopJsQueueProbe();
+}
+
+/** Whether the library was built with `PerfProbe` recording compiled in. */
+export function probesAvailable(): boolean {
+ return native.probesAvailable();
+}
+
+export function setProbesEnabled(enabled: boolean): Promise {
+ return native.setProbesEnabled(enabled);
+}
+
+/** Drains and parses every native span recorded since the previous drain. */
+export async function drainProbes(): Promise {
+ const json = await native.drainProbes();
+ try {
+ return JSON.parse(json) as ProbeDrain;
+ } catch {
+ return { spans: [], dropped: 0 };
+ }
+}
+
+/**
+ * Writes a line to the system log (`os_log` on iOS, logcat tag
+ * `NitroMapsPerfLab` on Android). Release builds keep these while
+ * `console.log` output is dropped, which is how the CLI harvests progress.
+ */
+export function logLine(line: string): Promise {
+ return native.logLine(line);
+}
+
+/**
+ * Writes a result file the CLI can pull: `Documents/perf-lab/` on iOS,
+ * the app's external files dir (`Android/data//files/perf-lab/`)
+ * on Android. Resolves to the absolute path.
+ */
+export function writeResultFile(
+ name: string,
+ content: string,
+): Promise {
+ return native.writeResultFile(name, content);
+}
diff --git a/example/tsconfig.json b/example/tsconfig.json
index c7b95c2..b2d2e8c 100644
--- a/example/tsconfig.json
+++ b/example/tsconfig.json
@@ -1,7 +1,28 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
- "strict": true
+ "strict": true,
+ "baseUrl": ".",
+ "paths": {
+ "react-native-better-maps": ["../package/src/index.ts"],
+ "react-native": ["./node_modules/react-native"],
+ "react-native/*": ["./node_modules/react-native/*"],
+ "react-native-safe-area-context": [
+ "./node_modules/react-native-safe-area-context"
+ ],
+ "expo": ["./node_modules/expo"]
+ }
},
- "include": ["**/*.ts", "**/*.tsx"]
+ "include": [
+ "**/*.ts",
+ "**/*.tsx",
+ "../performance/**/*.ts",
+ "../performance/**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules",
+ "../performance/results",
+ "../performance/benchmarks",
+ "../performance/**/__tests__/**"
+ ]
}
diff --git a/package.json b/package.json
index 13670b7..b5fe6f7 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,14 @@
"format": "prettier --write .",
"doctor": "npx react-doctor@latest",
"commitlint": "commitlint",
- "prepare": "husky"
+ "prepare": "husky",
+ "perf": "bun performance/scripts/perf.mjs",
+ "perf:baseline": "bun performance/scripts/perf.mjs baseline",
+ "perf:compare": "bun performance/scripts/perf.mjs compare",
+ "perf:check": "bun performance/scripts/perf.mjs check",
+ "perf:bench": "bun performance/scripts/perf.mjs bench",
+ "perf:test": "bun test performance/fixtures performance/app performance/scripts",
+ "typecheck:perf": "tsc -p example/tsconfig.json --noEmit"
},
"overrides": {
"yargs": "17.7.3"
diff --git a/package/android/build.gradle b/package/android/build.gradle
index 646a4b0..475f37f 100644
--- a/package/android/build.gradle
+++ b/package/android/build.gradle
@@ -24,11 +24,29 @@ def getExtOrIntegerDefault(name) {
return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["NitroMaps_" + name]).toInteger()
}
+// Opt-in timing probes for the performance lab (performance/README.md).
+// `-PNitroMaps_perfProbes=true` compiles the recording variant of PerfProbe.kt;
+// the default keeps BuildConfig.PERF_PROBES false so probes fold away.
+def perfProbesEnabled() {
+ def value = project.findProperty("NitroMaps_perfProbes")
+ return value != null && value.toString() == "true"
+}
+
apply plugin: 'com.android.library'
apply plugin: 'org.jetbrains.kotlin.android'
apply from: '../nitrogen/generated/android/NitroMaps+autolinking.gradle'
apply plugin: 'com.facebook.react'
+react {
+ // Nitrogen generates this library's bindings; React Native's codegen has
+ // nothing to generate here. Its default root is the package directory, and
+ // with an isolated installer (bun, pnpm) that directory contains
+ // `node_modules/react-native`, so the plugin generated React Native's own
+ // core specs into this library and release dex merging then failed with
+ // "Type com.facebook.fbreact.specs.* is defined multiple times".
+ jsRootDir = file("$projectDir/../src")
+}
+
android {
namespace 'com.margelo.nitro.nitromaps'
@@ -39,6 +57,8 @@ android {
minSdkVersion getExtOrIntegerDefault("minSdkVersion")
targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
+ buildConfigField "boolean", "PERF_PROBES", perfProbesEnabled() ? "true" : "false"
+
externalNativeBuild {
cmake {
cppFlags "-frtti -fexceptions -Wall -fstack-protector-all"
@@ -56,6 +76,7 @@ android {
buildFeatures {
prefab true
+ buildConfig true
}
compileOptions {
diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/GoogleMapProviderAdapter.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/GoogleMapProviderAdapter.kt
index 15067f2..609aaab 100644
--- a/package/android/src/main/java/com/margelo/nitro/nitromaps/GoogleMapProviderAdapter.kt
+++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/GoogleMapProviderAdapter.kt
@@ -236,12 +236,14 @@ class GoogleMapProviderAdapter(
override var markers: Array?
get() = _markers
set(value) {
- _markers = value
- if (googleMap != null) {
- updateOverlayViewportSize()
- overlayController.setMarkers(value)
- } else {
- pendingMarkers = value
+ PerfProbe.measure("markers.set", value?.size ?: 0) {
+ _markers = value
+ if (googleMap != null) {
+ updateOverlayViewportSize()
+ overlayController.setMarkers(value)
+ } else {
+ pendingMarkers = value
+ }
}
}
@@ -249,11 +251,13 @@ class GoogleMapProviderAdapter(
override var polylines: Array?
get() = _polylines
set(value) {
- _polylines = value
- if (googleMap != null) {
- overlayController.updatePolylines(value)
- } else {
- pendingPolylines = value
+ PerfProbe.measure("polylines.set", PerfProbe.coordinateCount(value)) {
+ _polylines = value
+ if (googleMap != null) {
+ overlayController.updatePolylines(value)
+ } else {
+ pendingPolylines = value
+ }
}
}
@@ -261,11 +265,13 @@ class GoogleMapProviderAdapter(
override var polygons: Array?
get() = _polygons
set(value) {
- _polygons = value
- if (googleMap != null) {
- overlayController.updatePolygons(value)
- } else {
- pendingPolygons = value
+ PerfProbe.measure("polygons.set", PerfProbe.coordinateCount(value)) {
+ _polygons = value
+ if (googleMap != null) {
+ overlayController.updatePolygons(value)
+ } else {
+ pendingPolygons = value
+ }
}
}
@@ -273,11 +279,13 @@ class GoogleMapProviderAdapter(
override var circles: Array?
get() = _circles
set(value) {
- _circles = value
- if (googleMap != null) {
- overlayController.updateCircles(value)
- } else {
- pendingCircles = value
+ PerfProbe.measure("circles.set", value?.size ?: 0) {
+ _circles = value
+ if (googleMap != null) {
+ overlayController.updateCircles(value)
+ } else {
+ pendingCircles = value
+ }
}
}
@@ -573,6 +581,7 @@ class GoogleMapProviderAdapter(
private fun applyRegion(region: Region, animated: Boolean = false) {
val map = googleMap ?: return
+ val probe = PerfProbe.begin("region.apply")
val bounds = region.toLatLngBounds()
val paddingPx = _mapPadding.toPaddingPixels()
@@ -586,6 +595,7 @@ class GoogleMapProviderAdapter(
}
runWhenMapViewLaidOut(runUpdate)
+ PerfProbe.end(probe)
}
private fun updateMapCamera(
@@ -595,20 +605,25 @@ class GoogleMapProviderAdapter(
) {
runOnMain {
val map = googleMap ?: return@runOnMain
- val target = camera.toCameraPosition(map.cameraPosition)
- if (map.cameraPosition.approximatelyEquals(target)) {
- return@runOnMain
- }
+ val probe = PerfProbe.begin("camera.apply")
+ try {
+ val target = camera.toCameraPosition(map.cameraPosition)
+ if (map.cameraPosition.approximatelyEquals(target)) {
+ return@runOnMain
+ }
- val update = CameraUpdateFactory.newCameraPosition(target)
- if (animated) {
- if (durationMs > 0) {
- map.animateCamera(update, durationMs, null)
+ val update = CameraUpdateFactory.newCameraPosition(target)
+ if (animated) {
+ if (durationMs > 0) {
+ map.animateCamera(update, durationMs, null)
+ } else {
+ map.animateCamera(update)
+ }
} else {
- map.animateCamera(update)
+ map.moveCamera(update)
}
- } else {
- map.moveCamera(update)
+ } finally {
+ PerfProbe.end(probe)
}
}
}
diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt
index ed08196..711d1cd 100644
--- a/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt
+++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/MapOverlayController.kt
@@ -112,7 +112,9 @@ class MapOverlayController(
fun setMarkers(descriptors: Array?) {
val next = descriptors ?: emptyArray()
- val fingerprint = next.markersFingerprint()
+ val fingerprint = PerfProbe.measure("markers.fingerprint", next.size) {
+ next.markersFingerprint()
+ }
if (fingerprint == markersFingerprint) {
return
}
@@ -163,15 +165,25 @@ class MapOverlayController(
val generation = refreshGeneration
computeExecutor.execute {
- val candidates = index.candidates(bounds)
+ val viewportProbe = PerfProbe.begin("markers.viewportCompute")
+ val candidates = PerfProbe.measure("markers.candidates", index.count) {
+ index.candidates(bounds)
+ }
val elements: List = if (clustering) {
- MarkerClusterEngine.clusters(candidates, bounds, widthPx, heightPx, density)
+ PerfProbe.measure("markers.cluster", candidates.size) {
+ MarkerClusterEngine.clusters(candidates, bounds, widthPx, heightPx, density)
+ }
} else {
- MarkerViewportFilter.displaySubset(candidates, bounds, latitudeSpan)
- .map { ClusterElement.Single(it) }
+ PerfProbe.measure("markers.viewportFilter", candidates.size) {
+ MarkerViewportFilter.displaySubset(candidates, bounds, latitudeSpan)
+ .map { ClusterElement.Single(it) }
+ }
}
- val diff = computeMarkerRenderDiff(elements, displayedVersions)
+ val diff = PerfProbe.measure("markers.diff", elements.size) {
+ computeMarkerRenderDiff(elements, displayedVersions)
+ }
+ PerfProbe.end(viewportProbe, candidates.size)
mainHandler.post {
if (generation != refreshGeneration) {
@@ -188,7 +200,9 @@ class MapOverlayController(
val generation = refreshGeneration
computeExecutor.execute {
- val index = MarkerSpatialIndex(descriptors)
+ val index = PerfProbe.measure("markers.indexBuild", descriptors.size) {
+ MarkerSpatialIndex(descriptors)
+ }
mainHandler.post {
if (generation != refreshGeneration) {
return@post
@@ -205,6 +219,7 @@ class MapOverlayController(
maxAnimatedMarkers: Int = MAX_ANIMATED_MARKERS_PER_DIFF,
) {
val map = googleMap ?: return
+ val probe = PerfProbe.begin("markers.applyDiff")
for (key in diff.removedKeys) {
cancelEnteringAnimation(key)
@@ -293,6 +308,7 @@ class MapOverlayController(
}
animateEntering(addedMarkers)
+ PerfProbe.end(probe, diff.removedKeys.size + diff.added.size + diff.retained.size)
}
/** Applies entering animations to newly added markers via a single shared animator. */
@@ -378,6 +394,7 @@ class MapOverlayController(
private fun applyMarkersSync(descriptors: Array) {
val map = googleMap ?: return
+ val probe = PerfProbe.begin("markers.applySync")
refreshGeneration += 1
cancelIdleRefresh()
cancelLiveRefresh()
@@ -424,6 +441,7 @@ class MapOverlayController(
marker
},
)
+ PerfProbe.end(probe, descriptors.size)
}
fun onCameraIdle() {
diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/MarkerIconFactory.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/MarkerIconFactory.kt
index 8cd2a94..e49b033 100644
--- a/package/android/src/main/java/com/margelo/nitro/nitromaps/MarkerIconFactory.kt
+++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/MarkerIconFactory.kt
@@ -44,6 +44,7 @@ internal class MarkerIconFactory(
marker: Marker,
key: String,
) {
+ val probe = PerfProbe.begin("marker.visualProps")
applyAnchor(descriptor, marker)
marker.rotation = descriptor.rotation?.toFloat() ?: 0f
marker.isFlat = descriptor.flat == true
@@ -55,6 +56,7 @@ internal class MarkerIconFactory(
isMarkerActive = { isMarkerCurrent(key, marker) },
onIconApplied = { applyAnchor(descriptor, marker) },
)
+ PerfProbe.end(probe)
}
private fun applyAnchor(descriptor: MarkerDescriptor, marker: Marker) {
diff --git a/package/android/src/main/java/com/margelo/nitro/nitromaps/PerfProbe.kt b/package/android/src/main/java/com/margelo/nitro/nitromaps/PerfProbe.kt
new file mode 100644
index 0000000..b964479
--- /dev/null
+++ b/package/android/src/main/java/com/margelo/nitro/nitromaps/PerfProbe.kt
@@ -0,0 +1,141 @@
+package com.margelo.nitro.nitromaps
+
+import android.os.Looper
+import android.os.Trace
+import org.json.JSONArray
+import org.json.JSONObject
+
+/**
+ * Timing probes around the overlay pipeline, used by the performance lab
+ * (see performance/README.md).
+ *
+ * [ENABLED] mirrors `BuildConfig.PERF_PROBES`, a `static final` constant that
+ * the library's `build.gradle` sets from the `NitroMaps_perfProbes` Gradle
+ * property. When it is false every probe reduces to one constant check that
+ * ART folds away; the recording code is never reached and nothing is
+ * allocated. When it is true each span is recorded and also emitted as an
+ * `android.os.Trace` section (prefix `NitroMaps.`) for Perfetto and the
+ * Android Studio profiler.
+ */
+internal object PerfProbe {
+ @JvmField
+ val ENABLED: Boolean = BuildConfig.PERF_PROBES
+
+ class Token(@JvmField val name: String, @JvmField val startNs: Long)
+
+ private class Span(
+ val name: String,
+ val startNs: Long,
+ val durationNs: Long,
+ val count: Int,
+ val thread: String,
+ )
+
+ /** Spans kept per drain; anything beyond this is counted as dropped. */
+ private const val CAPACITY = 50_000
+ private val spans = ArrayList(1024)
+ private var dropped = 0
+
+ @Volatile
+ var isRecording: Boolean = true
+
+ @JvmStatic
+ fun begin(name: String): Token? {
+ if (!ENABLED) {
+ return null
+ }
+ Trace.beginSection("NitroMaps.$name")
+ return Token(name, System.nanoTime())
+ }
+
+ @JvmStatic
+ fun end(token: Token?, count: Int = 0) {
+ if (token == null) {
+ return
+ }
+ val endNs = System.nanoTime()
+ Trace.endSection()
+ if (!isRecording) {
+ return
+ }
+ val thread = if (Looper.myLooper() == Looper.getMainLooper()) "main" else "background"
+ synchronized(this) {
+ if (spans.size >= CAPACITY) {
+ dropped += 1
+ } else {
+ spans.add(Span(token.name, token.startNs, endNs - token.startNs, count, thread))
+ }
+ }
+ }
+
+ inline fun measure(name: String, count: Int = 0, block: () -> T): T {
+ if (!ENABLED) {
+ return block()
+ }
+ val token = begin(name)
+ try {
+ return block()
+ } finally {
+ end(token, count)
+ }
+ }
+
+ @JvmStatic
+ fun coordinateCount(polylines: Array?): Int =
+ polylines?.sumOf { it.coordinates.size } ?: 0
+
+ @JvmStatic
+ fun coordinateCount(polygons: Array?): Int =
+ polygons?.sumOf { it.coordinates.size } ?: 0
+
+ /**
+ * Drains every recorded span as JSON:
+ * `{"spans":[{"name","startNs","durationNs","count","thread"}],"dropped":n}`.
+ */
+ @JvmStatic
+ fun drainJson(): String {
+ val drained: List
+ val droppedCount: Int
+ synchronized(this) {
+ drained = ArrayList(spans)
+ spans.clear()
+ droppedCount = dropped
+ dropped = 0
+ }
+ val array = JSONArray()
+ for (span in drained) {
+ array.put(
+ JSONObject()
+ .put("name", span.name)
+ .put("startNs", span.startNs)
+ .put("durationNs", span.durationNs)
+ .put("count", span.count)
+ .put("thread", span.thread),
+ )
+ }
+ return JSONObject().put("spans", array).put("dropped", droppedCount).toString()
+ }
+}
+
+/**
+ * Public, reflection-friendly entry point for the performance lab's native
+ * module, which looks it up by name so it never depends on this library's
+ * Gradle module directly. Present in every build; only reports data when
+ * the probes were compiled in.
+ */
+object NitroMapsPerfProbeBridge {
+ @JvmStatic
+ fun isAvailable(): Boolean = PerfProbe.ENABLED
+
+ @JvmStatic
+ fun setEnabled(enabled: Boolean) {
+ PerfProbe.isRecording = enabled
+ }
+
+ @JvmStatic
+ fun drainJson(): String = PerfProbe.drainJson()
+
+ /** `System.nanoTime()`, the clock the spans and `Choreographer` use. */
+ @JvmStatic
+ fun nowNanos(): Long = System.nanoTime()
+}
diff --git a/package/android/src/test/java/com/margelo/nitro/nitromaps/PipelineBenchmarkTest.kt b/package/android/src/test/java/com/margelo/nitro/nitromaps/PipelineBenchmarkTest.kt
new file mode 100644
index 0000000..f33d29c
--- /dev/null
+++ b/package/android/src/test/java/com/margelo/nitro/nitromaps/PipelineBenchmarkTest.kt
@@ -0,0 +1,119 @@
+package com.margelo.nitro.nitromaps
+
+import com.google.android.gms.maps.model.LatLng
+import com.google.android.gms.maps.model.LatLngBounds
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Test
+import kotlin.math.cos
+import kotlin.math.ln
+import kotlin.math.sqrt
+
+/**
+ * Times the marker pipeline's pure functions at 1k…100k markers on the JVM.
+ * Skipped unless `NITROMAPS_BENCH=1` is set, so the normal unit test run is
+ * unaffected. Output: one `[bench] {json}` line per measurement
+ * (see performance/benchmarks/native/README.md).
+ */
+class PipelineBenchmarkTest {
+ @Before
+ fun requireOptIn() {
+ assumeTrue("set NITROMAPS_BENCH=1 to run the pipeline benchmark", System.getenv("NITROMAPS_BENCH") == "1")
+ }
+
+ @Test
+ fun pipelineScaling() {
+ for (n in listOf(1_000, 10_000, 50_000, 100_000)) {
+ val markers = dataset(n)
+ val cityBounds = LatLngBounds(LatLng(52.17, 20.92), LatLng(52.29, 21.10))
+ val countryBounds = LatLngBounds(LatLng(49.0, 14.1), LatLng(54.8, 24.1))
+
+ record("fingerprint", n) { markers.markersFingerprint() }
+ val index = record("indexBuild", n) { MarkerSpatialIndex(markers) }
+ val cityCandidates = record("candidates(city)", n) { index.candidates(cityBounds) }
+ val countryCandidates = record("candidates(country)", n) { index.candidates(countryBounds) }
+ record("viewportFilter(city)", n, cityCandidates.size) {
+ MarkerViewportFilter.displaySubset(cityCandidates, cityBounds, 0.12)
+ }
+ val clusters = record("clusters(country)", n, countryCandidates.size) {
+ MarkerClusterEngine.clusters(countryCandidates, countryBounds, 1080, 2200, 2.75f)
+ }
+ record("clusters(city)", n, cityCandidates.size) {
+ MarkerClusterEngine.clusters(cityCandidates, cityBounds, 1080, 2200, 2.75f)
+ }
+ val displayed = HashMap()
+ for (element in clusters) {
+ displayed[element.diffKey] = element.renderVersion
+ }
+ record("diff(unchanged)", n, clusters.size) { computeMarkerRenderDiff(clusters, displayed) }
+ record("diff(empty)", n, clusters.size) { computeMarkerRenderDiff(clusters, emptyMap()) }
+ record("singles(all)", n) { markers.map { ClusterElement.Single(it) } }
+ }
+ }
+
+ private fun record(op: String, n: Int, items: Int = n, block: () -> T): T {
+ val iterations = maxOf(3, minOf(30, 300_000 / n))
+ var result: T = block()
+ val samples = DoubleArray(iterations)
+ for (index in 0 until iterations) {
+ val started = System.nanoTime()
+ result = block()
+ samples[index] = (System.nanoTime() - started) / 1_000_000.0
+ }
+ samples.sort()
+ val median = samples[samples.size / 2]
+ println(
+ "[bench] {\"platform\":\"jvm\",\"op\":\"$op\",\"n\":$n,\"items\":$items," +
+ "\"medianMs\":${"%.3f".format(median)},\"minMs\":${"%.3f".format(samples[0])}," +
+ "\"maxMs\":${"%.3f".format(samples[samples.size - 1])},\"iterations\":$iterations}",
+ )
+ return result
+ }
+
+ /** Seeded Gaussian blobs around Polish cities, roughly like the JS fixtures. */
+ private fun dataset(n: Int): Array {
+ val random = Mulberry32(12345 xor n)
+ val cities = listOf(
+ Triple(52.2297, 21.0122, 1.8), Triple(50.0647, 19.945, 0.78), Triple(51.7592, 19.456, 0.68),
+ Triple(51.1079, 17.0385, 0.64), Triple(52.4064, 16.9252, 0.54), Triple(54.352, 18.6466, 0.47),
+ Triple(53.4285, 14.5528, 0.4), Triple(50.2649, 19.0238, 0.5),
+ )
+ val totalWeight = cities.sumOf { it.third }
+ return Array(n) { index ->
+ var pick = random.next() * totalWeight
+ var city = cities[0]
+ for (candidate in cities) {
+ pick -= candidate.third
+ if (pick <= 0) {
+ city = candidate
+ break
+ }
+ }
+ val spread = 0.1 + city.third * 0.16
+ val lat = (city.first + random.gaussian() * spread).coerceIn(49.0, 54.8)
+ val lon = (city.second + random.gaussian() * spread * 1.4).coerceIn(14.1, 24.1)
+ MarkerDescriptor(
+ "m-$index", Coordinate(lat, lon), null, null, null, true,
+ null, null, null, null, null, null, null,
+ )
+ }
+ }
+
+ private class Mulberry32(seed: Int) {
+ private var state = seed
+
+ fun next(): Double {
+ state += 0x6d2b79f5.toInt()
+ var t = state
+ t = (t xor (t ushr 15)) * (1 or t)
+ t = (t + ((t xor (t ushr 7)) * (61 or t))) xor t
+ return ((t xor (t ushr 14)).toLong() and 0xffffffffL) / 4294967296.0
+ }
+
+ fun gaussian(): Double {
+ val u = maxOf(next(), 1e-12)
+ val v = next()
+ return sqrt(-2 * ln(u)) * cos(2 * Math.PI * v)
+ }
+ }
+}
diff --git a/package/ios/AppleMapProviderAdapter.swift b/package/ios/AppleMapProviderAdapter.swift
index fb73d5b..72ed15f 100644
--- a/package/ios/AppleMapProviderAdapter.swift
+++ b/package/ios/AppleMapProviderAdapter.swift
@@ -166,25 +166,33 @@ final class AppleMapProviderAdapter: MapProviderAdapter {
var markers: [MarkerDescriptor]? {
didSet {
- overlayController.setMarkers(markers)
+ PerfProbe.measure("markers.set", count: markers?.count ?? 0) {
+ overlayController.setMarkers(markers)
+ }
}
}
var polylines: [PolylineDescriptor]? {
didSet {
- overlayController.updatePolylines(polylines)
+ PerfProbe.measure("polylines.set", count: polylines.coordinateCount) {
+ overlayController.updatePolylines(polylines)
+ }
}
}
var polygons: [PolygonDescriptor]? {
didSet {
- overlayController.updatePolygons(polygons)
+ PerfProbe.measure("polygons.set", count: polygons.coordinateCount) {
+ overlayController.updatePolygons(polygons)
+ }
}
}
var circles: [CircleDescriptor]? {
didSet {
- overlayController.updateCircles(circles)
+ PerfProbe.measure("circles.set", count: circles?.count ?? 0) {
+ overlayController.updateCircles(circles)
+ }
}
}
@@ -243,6 +251,8 @@ final class AppleMapProviderAdapter: MapProviderAdapter {
}
func applyRegion(_ region: Region, animated: Bool = false) {
+ let probe = PerfProbe.begin("region.apply")
+ defer { PerfProbe.end(probe) }
let targetRegion = region.toMKCoordinateRegion()
guard !view.region.approximatelyEquals(targetRegion) else {
return
@@ -252,6 +262,8 @@ final class AppleMapProviderAdapter: MapProviderAdapter {
}
func updateMapCamera(_ camera: Camera, animated: Bool, duration: Double = 0) {
+ let probe = PerfProbe.begin("camera.apply")
+ defer { PerfProbe.end(probe) }
let mapCamera = camera.toMKMapCamera()
guard !view.camera.approximatelyEquals(mapCamera) else {
return
diff --git a/package/ios/GoogleMapOverlayController.swift b/package/ios/GoogleMapOverlayController.swift
index d033447..37bc73e 100644
--- a/package/ios/GoogleMapOverlayController.swift
+++ b/package/ios/GoogleMapOverlayController.swift
@@ -208,6 +208,14 @@ final class GoogleMapOverlayController {
return
}
+ let probe = PerfProbe.begin("markers.applyDiff")
+ defer {
+ PerfProbe.end(
+ probe,
+ count: diff.removedKeys.count + diff.added.count + diff.retained.count
+ )
+ }
+
for key in diff.removedKeys {
markers.removeValue(forKey: key)?.map = nil
markerVersions.removeValue(forKey: key)
diff --git a/package/ios/GoogleMapProviderAdapter.swift b/package/ios/GoogleMapProviderAdapter.swift
index 95c5b6a..c92c2db 100644
--- a/package/ios/GoogleMapProviderAdapter.swift
+++ b/package/ios/GoogleMapProviderAdapter.swift
@@ -182,25 +182,33 @@ final class GoogleMapProviderAdapter: NSObject, MapProviderAdapter {
var markers: [MarkerDescriptor]? {
didSet {
- overlayController.setMarkers(markers)
+ PerfProbe.measure("markers.set", count: markers?.count ?? 0) {
+ overlayController.setMarkers(markers)
+ }
}
}
var polylines: [PolylineDescriptor]? {
didSet {
- overlayController.updatePolylines(polylines)
+ PerfProbe.measure("polylines.set", count: polylines.coordinateCount) {
+ overlayController.updatePolylines(polylines)
+ }
}
}
var polygons: [PolygonDescriptor]? {
didSet {
- overlayController.updatePolygons(polygons)
+ PerfProbe.measure("polygons.set", count: polygons.coordinateCount) {
+ overlayController.updatePolygons(polygons)
+ }
}
}
var circles: [CircleDescriptor]? {
didSet {
- overlayController.updateCircles(circles)
+ PerfProbe.measure("circles.set", count: circles?.count ?? 0) {
+ overlayController.updateCircles(circles)
+ }
}
}
@@ -301,6 +309,8 @@ final class GoogleMapProviderAdapter: NSObject, MapProviderAdapter {
}
private func applyRegion(_ region: Region, animated: Bool = false) {
+ let probe = PerfProbe.begin("region.apply")
+ defer { PerfProbe.end(probe) }
applyCameraUpdate(
GMSCameraUpdate.fit(region.toGMSCoordinateBounds(), with: mapPadding?.toUIEdgeInsets() ?? .zero),
animated: animated,
@@ -309,6 +319,8 @@ final class GoogleMapProviderAdapter: NSObject, MapProviderAdapter {
}
private func updateMapCamera(_ camera: Camera, animated: Bool, duration: Double? = nil) {
+ let probe = PerfProbe.begin("camera.apply")
+ defer { PerfProbe.end(probe) }
let target = camera.toGMSCameraPosition(current: view.camera)
guard !view.camera.approximatelyEquals(target) else {
return
diff --git a/package/ios/HybridMapViewDelegate.swift b/package/ios/HybridMapViewDelegate.swift
index 67891a2..6f53b64 100644
--- a/package/ios/HybridMapViewDelegate.swift
+++ b/package/ios/HybridMapViewDelegate.swift
@@ -100,6 +100,8 @@ final class HybridMapViewDelegate: NSObject, MKMapViewDelegate, UIGestureRecogni
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
+ let probe = PerfProbe.begin("annotation.viewFor")
+ defer { PerfProbe.end(probe) }
if let cluster = annotation as? MapClusterAnnotation {
let view = mapView.dequeueReusableAnnotationView(
withIdentifier: NitroClusterAnnotationView.reuseIdentifier
@@ -138,6 +140,8 @@ final class HybridMapViewDelegate: NSObject, MKMapViewDelegate, UIGestureRecogni
}
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
+ let probe = PerfProbe.begin("annotation.didAdd")
+ defer { PerfProbe.end(probe, count: views.count) }
for view in views {
if let marker = view.annotation as? MapMarkerAnnotation,
marker.enteringAnimation.kind != .system {
diff --git a/package/ios/MapOverlayController.swift b/package/ios/MapOverlayController.swift
index 73a6378..12ee178 100644
--- a/package/ios/MapOverlayController.swift
+++ b/package/ios/MapOverlayController.swift
@@ -117,6 +117,14 @@ final class MapOverlayController {
return
}
+ let probe = PerfProbe.begin("markers.applyDiff")
+ defer {
+ PerfProbe.end(
+ probe,
+ count: diff.removedKeys.count + diff.added.count + diff.retained.count
+ )
+ }
+
if !diff.removedKeys.isEmpty {
let removed = diff.removedKeys.compactMap { key in
displayedAnnotationVersions.removeValue(forKey: key)
diff --git a/package/ios/MarkerClusterEngine.swift b/package/ios/MarkerClusterEngine.swift
index d45c6b6..bdfd974 100644
--- a/package/ios/MarkerClusterEngine.swift
+++ b/package/ios/MarkerClusterEngine.swift
@@ -397,7 +397,9 @@ final class MarkerRenderPipeline {
func setMarkers(_ descriptors: [MarkerDescriptor]?) -> Bool {
let next = descriptors ?? []
- let fingerprint = next.markersFingerprint()
+ let fingerprint = PerfProbe.measure("markers.fingerprint", count: next.count) {
+ next.markersFingerprint()
+ }
guard fingerprint != markersFingerprint else {
return false
}
@@ -425,10 +427,13 @@ final class MarkerRenderPipeline {
viewportRefreshWorkItem?.cancel()
viewportRefreshWorkItem = nil
refreshGeneration += 1
- apply(Self.computeDiff(
- target: allMarkerDescriptors.map { .single($0) },
- displayed: displayedVersions
- ))
+ let diff = PerfProbe.measure("markers.diff", count: allMarkerDescriptors.count) {
+ Self.computeDiff(
+ target: allMarkerDescriptors.map { .single($0) },
+ displayed: displayedVersions
+ )
+ }
+ apply(diff)
}
}
@@ -492,22 +497,32 @@ final class MarkerRenderPipeline {
let clusterCellPoints = self.clusterCellPoints
computeQueue.async { [weak self] in
- let candidates = index.candidates(in: region)
+ let viewportProbe = PerfProbe.begin("markers.viewportCompute")
+ let candidates = PerfProbe.measure("markers.candidates", count: index.count) {
+ index.candidates(in: region)
+ }
let elements: [MarkerClusterEngine.Element]
if clustering {
- elements = MarkerClusterEngine.clusters(
- candidates: candidates,
- region: region,
- viewSize: viewSize,
- cellPoints: clusterCellPoints
- )
+ elements = PerfProbe.measure("markers.cluster", count: candidates.count) {
+ MarkerClusterEngine.clusters(
+ candidates: candidates,
+ region: region,
+ viewSize: viewSize,
+ cellPoints: clusterCellPoints
+ )
+ }
} else {
- elements = MarkerViewportFilter
- .displaySubset(candidates: candidates, region: region)
- .map { .single($0) }
+ elements = PerfProbe.measure("markers.viewportFilter", count: candidates.count) {
+ MarkerViewportFilter
+ .displaySubset(candidates: candidates, region: region)
+ .map { .single($0) }
+ }
}
- let diff = Self.computeDiff(target: elements, displayed: displayedVersions)
+ let diff = PerfProbe.measure("markers.diff", count: elements.count) {
+ Self.computeDiff(target: elements, displayed: displayedVersions)
+ }
+ PerfProbe.end(viewportProbe, count: candidates.count)
DispatchQueue.main.async {
guard let self, generation == self.refreshGeneration else {
return
@@ -528,7 +543,9 @@ final class MarkerRenderPipeline {
let generation = refreshGeneration
computeQueue.async { [weak self] in
- let index = MarkerSpatialIndex(markers: descriptors)
+ let index = PerfProbe.measure("markers.indexBuild", count: descriptors.count) {
+ MarkerSpatialIndex(markers: descriptors)
+ }
DispatchQueue.main.async {
guard let self, generation == self.refreshGeneration else {
return
diff --git a/package/ios/PerfProbe.swift b/package/ios/PerfProbe.swift
new file mode 100644
index 0000000..d707513
--- /dev/null
+++ b/package/ios/PerfProbe.swift
@@ -0,0 +1,214 @@
+import Foundation
+import os.signpost
+
+// Timing probes around the overlay pipeline, used by the performance lab
+// (see performance/README.md).
+//
+// The recording variant compiles only when the pod is built with
+// `-DNITROMAPS_PERF_PROBES`, which the podspec adds when
+// `Podfile.properties.json` contains `"betterMaps.perfProbes": "true"`.
+// Without the flag every call site is an inlined no-op, so release builds
+// carry no probe code and no signposts.
+//
+// Each span is also emitted as an `os_signpost` interval (subsystem
+// `com.nitromaps`, category `Pipeline`) so it shows up in Instruments'
+// Points of Interest track.
+
+#if NITROMAPS_PERF_PROBES
+enum PerfProbe {
+ struct Token {
+ let name: StaticString
+ let startNs: UInt64
+ let signpostID: OSSignpostID
+ }
+
+ struct Span {
+ let name: String
+ let startNs: UInt64
+ let durationNs: UInt64
+ let count: Int
+ let thread: String
+ }
+
+ /// Spans kept per drain. Scenarios drain after every phase; anything beyond
+ /// this is counted as dropped rather than growing without bound.
+ private static let capacity = 50_000
+ private static let lock = NSLock()
+ private static var spans: [Span] = []
+ private static var droppedSpans = 0
+ private static var recording = true
+ private static let log = OSLog(subsystem: "com.nitromaps", category: "Pipeline")
+
+ static var isRecording: Bool {
+ get {
+ lock.lock()
+ defer { lock.unlock() }
+ return recording
+ }
+ set {
+ lock.lock()
+ recording = newValue
+ lock.unlock()
+ }
+ }
+
+ /// Same clock as `CADisplayLink.timestamp` and `DispatchTime`, so spans can
+ /// be aligned with frame timestamps and with JS `performance.now()` through
+ /// the lab's clock-offset probe.
+ @inline(__always)
+ static func now() -> UInt64 {
+ DispatchTime.now().uptimeNanoseconds
+ }
+
+ static func begin(_ name: StaticString) -> Token {
+ let signpostID = OSSignpostID(log: log)
+ os_signpost(.begin, log: log, name: name, signpostID: signpostID)
+ return Token(name: name, startNs: now(), signpostID: signpostID)
+ }
+
+ static func end(_ token: Token, count: @autoclosure () -> Int = 0) {
+ let endNs = now()
+ os_signpost(.end, log: log, name: token.name, signpostID: token.signpostID)
+ record(
+ name: token.name,
+ startNs: token.startNs,
+ durationNs: endNs &- token.startNs,
+ count: count()
+ )
+ }
+
+ @inline(__always)
+ static func measure(
+ _ name: StaticString,
+ count: @autoclosure () -> Int = 0,
+ _ body: () throws -> T
+ ) rethrows -> T {
+ let token = begin(name)
+ defer { end(token, count: count()) }
+ return try body()
+ }
+
+ static func drain() -> (spans: [Span], dropped: Int) {
+ lock.lock()
+ defer { lock.unlock() }
+ let drained = spans
+ let dropped = droppedSpans
+ spans = []
+ droppedSpans = 0
+ return (drained, dropped)
+ }
+
+ private static func record(name: StaticString, startNs: UInt64, durationNs: UInt64, count: Int) {
+ let thread = Thread.isMainThread ? "main" : "background"
+ lock.lock()
+ defer { lock.unlock() }
+ guard recording else {
+ return
+ }
+ if spans.count >= capacity {
+ droppedSpans += 1
+ return
+ }
+ spans.append(
+ Span(name: "\(name)", startNs: startNs, durationNs: durationNs, count: count, thread: thread)
+ )
+ }
+}
+#else
+enum PerfProbe {
+ struct Token {}
+
+ @inline(__always)
+ static func begin(_ name: StaticString) -> Token {
+ Token()
+ }
+
+ @inline(__always)
+ static func end(_ token: Token, count: @autoclosure () -> Int = 0) {}
+
+ @inline(__always)
+ static func measure(
+ _ name: StaticString,
+ count: @autoclosure () -> Int = 0,
+ _ body: () throws -> T
+ ) rethrows -> T {
+ try body()
+ }
+}
+#endif
+
+extension Optional where Wrapped == [PolylineDescriptor] {
+ /// Total coordinates across all polylines; only evaluated by probe builds.
+ var coordinateCount: Int {
+ self?.reduce(0) { $0 + $1.coordinates.count } ?? 0
+ }
+}
+
+extension Optional where Wrapped == [PolygonDescriptor] {
+ /// Total coordinates across all polygons; only evaluated by probe builds.
+ var coordinateCount: Int {
+ self?.reduce(0) { $0 + $1.coordinates.count } ?? 0
+ }
+}
+
+/// Objective-C visible entry point for the performance lab's native module.
+///
+/// The lab looks this class up by name (`NSClassFromString`) so it never has
+/// to import the NitroMaps Swift module, which is compiled with C++ interop.
+/// Every method is a plain selector with no arguments so it can be invoked
+/// through `perform(_:)`. Present in every build; only reports data when the
+/// probes were compiled in.
+@objc(NitroMapsPerfProbeBridge)
+public final class NitroMapsPerfProbeBridge: NSObject {
+ @objc public static func probesAvailable() -> NSNumber {
+ #if NITROMAPS_PERF_PROBES
+ return NSNumber(value: true)
+ #else
+ return NSNumber(value: false)
+ #endif
+ }
+
+ @objc public static func enableProbes() {
+ #if NITROMAPS_PERF_PROBES
+ PerfProbe.isRecording = true
+ #endif
+ }
+
+ @objc public static func disableProbes() {
+ #if NITROMAPS_PERF_PROBES
+ PerfProbe.isRecording = false
+ #endif
+ }
+
+ /// `DispatchTime.now().uptimeNanoseconds`, the clock the spans use.
+ @objc public static func nowNanoseconds() -> NSNumber {
+ NSNumber(value: DispatchTime.now().uptimeNanoseconds)
+ }
+
+ /// Drains every recorded span as JSON:
+ /// `{"spans":[{"name","startNs","durationNs","count","thread"}],"dropped":n}`.
+ @objc public static func drainJSON() -> String {
+ #if NITROMAPS_PERF_PROBES
+ let (spans, dropped) = PerfProbe.drain()
+ let payload: [String: Any] = [
+ "spans": spans.map { span -> [String: Any] in
+ [
+ "name": span.name,
+ "startNs": span.startNs,
+ "durationNs": span.durationNs,
+ "count": span.count,
+ "thread": span.thread,
+ ]
+ },
+ "dropped": dropped,
+ ]
+ guard let data = try? JSONSerialization.data(withJSONObject: payload),
+ let json = String(data: data, encoding: .utf8) else {
+ return "{\"spans\":[],\"dropped\":0}"
+ }
+ return json
+ #else
+ return "{\"spans\":[],\"dropped\":0}"
+ #endif
+ }
+}
diff --git a/package/iosTests/GoogleMarkerVisualApplierTests.swift b/package/iosTests/GoogleMarkerVisualApplierTests.swift
index bf55581..4a15868 100644
--- a/package/iosTests/GoogleMarkerVisualApplierTests.swift
+++ b/package/iosTests/GoogleMarkerVisualApplierTests.swift
@@ -1,3 +1,4 @@
+#if canImport(GoogleMaps)
import GoogleMaps
import UIKit
import XCTest
@@ -93,3 +94,4 @@ private func markerDescriptor(image: MarkerImage, anchor: MarkerAnchor) -> Marke
private func makeIcon() -> UIImage {
UIGraphicsImageRenderer(size: CGSize(width: 40, height: 40)).image { _ in }
}
+#endif
diff --git a/package/iosTests/PipelineBenchmarkTests.swift b/package/iosTests/PipelineBenchmarkTests.swift
new file mode 100644
index 0000000..8702164
--- /dev/null
+++ b/package/iosTests/PipelineBenchmarkTests.swift
@@ -0,0 +1,138 @@
+import MapKit
+import XCTest
+
+@testable import NitroMaps
+
+/// Times the marker pipeline's pure functions at 1k…100k markers on the
+/// simulator. Skipped unless `NITROMAPS_BENCH=1` is in the environment.
+/// Output: one `[bench] {json}` line per measurement
+/// (see performance/benchmarks/native/README.md).
+final class PipelineBenchmarkTests: XCTestCase {
+ override func setUpWithError() throws {
+ try XCTSkipUnless(
+ ProcessInfo.processInfo.environment["NITROMAPS_BENCH"] == "1",
+ "set NITROMAPS_BENCH=1 to run the pipeline benchmark"
+ )
+ }
+
+ func testPipelineScaling() {
+ let cityRegion = MKCoordinateRegion(
+ center: CLLocationCoordinate2D(latitude: 52.23, longitude: 21.01),
+ span: MKCoordinateSpan(latitudeDelta: 0.12, longitudeDelta: 0.18)
+ )
+ let countryRegion = MKCoordinateRegion(
+ center: CLLocationCoordinate2D(latitude: 51.9, longitude: 19.1),
+ span: MKCoordinateSpan(latitudeDelta: 5.8, longitudeDelta: 10)
+ )
+ let viewSize = CGSize(width: 393, height: 800)
+
+ for n in [1_000, 10_000, 50_000, 100_000] {
+ let markers = dataset(n)
+ _ = record("fingerprint", n: n) { markers.markersFingerprint() }
+ let index = record("indexBuild", n: n) { MarkerSpatialIndex(markers: markers) }
+ let cityCandidates = record("candidates(city)", n: n) { index.candidates(in: cityRegion) }
+ let countryCandidates = record("candidates(country)", n: n) { index.candidates(in: countryRegion) }
+ _ = record("viewportFilter(city)", n: n, items: cityCandidates.count) {
+ MarkerViewportFilter.displaySubset(candidates: cityCandidates, region: cityRegion)
+ }
+ let clusters = record("clusters(country)", n: n, items: countryCandidates.count) {
+ MarkerClusterEngine.clusters(candidates: countryCandidates, region: countryRegion, viewSize: viewSize)
+ }
+ _ = record("clusters(city)", n: n, items: cityCandidates.count) {
+ MarkerClusterEngine.clusters(candidates: cityCandidates, region: cityRegion, viewSize: viewSize)
+ }
+ _ = record("renderVersion(all singles)", n: n) {
+ markers.map { MarkerClusterEngine.Element.single($0).renderVersion }
+ }
+ _ = record("diffKey(all clusters)", n: n, items: clusters.count) {
+ clusters.map { $0.diffKey }
+ }
+ }
+ }
+
+ private func record(_ op: String, n: Int, items: Int? = nil, _ block: () -> T) -> T {
+ let iterations = max(3, min(30, 300_000 / n))
+ var result = block()
+ var samples: [Double] = []
+ for _ in 0.. [MarkerDescriptor] {
+ var random = Mulberry32(seed: UInt32(truncatingIfNeeded: 12345 ^ n))
+ let cities: [(Double, Double, Double)] = [
+ (52.2297, 21.0122, 1.8), (50.0647, 19.945, 0.78), (51.7592, 19.456, 0.68),
+ (51.1079, 17.0385, 0.64), (52.4064, 16.9252, 0.54), (54.352, 18.6466, 0.47),
+ (53.4285, 14.5528, 0.4), (50.2649, 19.0238, 0.5),
+ ]
+ let totalWeight = cities.reduce(0) { $0 + $1.2 }
+ var markers: [MarkerDescriptor] = []
+ markers.reserveCapacity(n)
+ for index in 0.. Double {
+ state = state &+ 0x6d2b_79f5
+ var t = state
+ t = (t ^ (t >> 15)) &* (1 | t)
+ t = (t &+ ((t ^ (t >> 7)) &* (61 | t))) ^ t
+ return Double(t ^ (t >> 14)) / 4_294_967_296
+ }
+
+ mutating func gaussian() -> Double {
+ let u = max(next(), 1e-12)
+ let v = next()
+ return (-2 * log(u)).squareRoot() * cos(2 * .pi * v)
+ }
+ }
+}
diff --git a/package/react-native-better-maps.podspec b/package/react-native-better-maps.podspec
index ecb5fa8..25342dc 100644
--- a/package/react-native-better-maps.podspec
+++ b/package/react-native-better-maps.podspec
@@ -2,12 +2,16 @@ require 'json'
package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
-def better_maps_podfile_properties
+# Helpers are lambdas in local variables rather than top-level `def`s: CocoaPods
+# evaluates a podspec with `eval`, and a method defined that way is not visible
+# from inside the `Pod::Spec.new` block on every Ruby / CocoaPods combination
+# (Ruby 4.0 + CocoaPods 1.17 raises `undefined method ... for module Pod`).
+better_maps_podfile_properties = lambda do
installation_root = Pod::Config.instance.installation_root
- return {} if installation_root.nil?
+ next {} if installation_root.nil?
podfile_properties_path = File.join(installation_root, 'Podfile.properties.json')
- return {} unless File.exist?(podfile_properties_path)
+ next {} unless File.exist?(podfile_properties_path)
JSON.parse(File.read(podfile_properties_path))
rescue StandardError => e
@@ -15,10 +19,15 @@ rescue StandardError => e
{}
end
-def better_maps_ios_google_provider_enabled?
- # Must match IOS_GOOGLE_PROVIDER_PODFILE_PROPERTY in plugin/src/ios.ts
- better_maps_podfile_properties['betterMaps.iosGoogleProvider'] == 'true'
-end
+# Must match IOS_GOOGLE_PROVIDER_PODFILE_PROPERTY in plugin/src/ios.ts
+better_maps_ios_google_provider_enabled =
+ better_maps_podfile_properties.call['betterMaps.iosGoogleProvider'] == 'true'
+
+# Opt-in timing probes for the performance lab (performance/README.md). Adds
+# `-DNITROMAPS_PERF_PROBES` so PerfProbe.swift compiles its recording variant;
+# without it every probe call site is an inlined no-op.
+better_maps_perf_probes_enabled =
+ better_maps_podfile_properties.call['betterMaps.perfProbes'] == 'true'
Pod::Spec.new do |s|
s.name = 'react-native-better-maps'
@@ -44,7 +53,7 @@ Pod::Spec.new do |s|
s.dependency 'React-jsi'
s.dependency 'React-callinvoker'
- if better_maps_ios_google_provider_enabled?
+ if better_maps_ios_google_provider_enabled
s.dependency 'GoogleMaps'
end
@@ -54,6 +63,14 @@ Pod::Spec.new do |s|
install_modules_dependencies(s)
+ if better_maps_perf_probes_enabled
+ xcconfig = s.attributes_hash['pod_target_xcconfig'] || {}
+ swift_flags = xcconfig['OTHER_SWIFT_FLAGS'] || '$(inherited)'
+ s.pod_target_xcconfig = xcconfig.merge(
+ 'OTHER_SWIFT_FLAGS' => "#{swift_flags} -DNITROMAPS_PERF_PROBES"
+ )
+ end
+
s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'iosTests/**/*.swift'
end
diff --git a/performance/PERFORMANCE.md b/performance/PERFORMANCE.md
new file mode 100644
index 0000000..732c765
--- /dev/null
+++ b/performance/PERFORMANCE.md
@@ -0,0 +1,818 @@
+# Performance scorecard
+
+Baseline measurements of `react-native-better-maps` recorded with the
+performance lab (see [README.md](./README.md)), the bottlenecks they point
+at, and the optimization backlog. Nothing in this document is estimated:
+every number comes from a result file under `results/baseline/`, and cells
+that could not be measured say N/A. **No optimization has been applied**; the
+library under test is `main` plus the two build fixes the lab needed
+(podspec lambdas, Android codegen root) and the compile-time probes.
+
+## Status
+
+| Target | Build | Representative? | Suite | Where |
+| --- | --- | --- | --- | --- |
+| iPhone 17 Pro simulator, iOS 26.5, MapKit, 60 Hz | release + production JS + PerfProbe | **No** (desktop CPU/GPU, simulator tile caches) | `baseline` (42 scenarios), recorded twice | `results/baseline/ios/apple-iphone18-1-release-probes/` |
+| Android emulator `sdk_gphone64_arm64`, API 35, Google Maps, 60 Hz | release + production JS + PerfProbe | **No** (emulator; arm64 image runs near native speed on Apple Silicon but the GPU is virtual) | `baseline` (42 scenarios), recorded three times | `results/baseline/android/google-sdk-gphone64-arm64-release-probes/` |
+| Realme RMX3081 (Android 13, 60 Hz, mid-range) | built and installed (`app-release.apk`, probes on) | would be | **not recorded**: the phone was locked with a secure lock screen and had no network during the session; `bun perf baseline --platform android --device 85249cec` runs it once unlocked | — |
+| 120 Hz iPhone / 120 Hz Android | — | — | not available on this machine | — |
+
+Everything below is therefore **harness-validated scaling evidence, not
+production performance**. The relative shape of the numbers (what scales
+with what, which thread pays, which operation dominates) is what the
+bottleneck analysis rests on; absolute milliseconds will be higher on phones
+(Hermes on a mobile CPU runs the JS-side costs measured here several times
+slower than the simulator's Apple Silicon core).
+
+### How the numbers were produced
+
+- Lab builds: `bun perf build ios` / `bun perf build android` (release,
+ `EXPO_PUBLIC_PERF_LAB=1`, PerfProbe compiled in). Runs: `bun perf baseline`.
+- Each scenario: mount → `onMapReady` → settle → recorders on → scripted
+ workload → recorders off → unmount → memory after cleanup. Fixtures are
+ seeded (`fixtures/`, seed 12345, hashes pinned by `bun perf fixtures`).
+- Repeatability (same build, back-to-back suites). iOS run 1 vs run 2: FPS
+ average within ±2 %, frame p95 identical (16.7 ms) on 40 of 42 scenarios,
+ JS commit averages within ±6 % on the marker scenarios, native main-thread
+ totals within ±10 % on most scenarios; p99 and worst frame moved by
+ 10–90 % between runs (they are a handful of frames each). Android emulator
+ run 1 vs run 2 (both while the iOS suite ran on the same host) and run 2
+ vs run 3 (alone): FPS and p95 stable, JS commit averages within ±12 % at
+ 10k, but 50k native totals and the 50k update commit varied by 30–100 %
+ between runs — the emulator is the noisier target. Regression thresholds should therefore gate on averages and p95
+ first; p99/worst and the 50k scenarios need repeats (`--repeat 3`) before
+ they can gate.
+- The first two suites per platform ran concurrently on the same host; the
+ stored Android baseline (run 3) ran alone. Concurrency adds noise to
+ absolute numbers but not to the within-run comparisons this document
+ makes.
+
+## Architecture under test
+
+```text
+JS: useCollectedOverlays / normalizeMarkerDescriptors (per render)
+ ↓ React commit (JS thread) Fabric deepDiffer on the array prop
+ ↓ Nitro prop parse (JS thread) JSIConverter: 13 property reads per marker → C++ structs
+ ↓ Fabric mount (UI thread) iOS: std::vector → Swift Array copy · Android: one Java object per marker (JNI)
+ ↓ HybridMapView → provider adapter setter applied twice at mount (host + adapter sync)
+ ↓ MapOverlayController fingerprint all markers (main) → spatial index (background)
+ ↓ viewport pipeline (background) LOD filter (≤ 2000 visible) or grid clustering → render diff
+ ↓ apply diff (main) MapKit addAnnotations / GMSMarker / GoogleMap.addMarker (+ icons, animations)
+ ↓ Map SDK rendering SDK-owned threads and GPU
+```
+
+There is no library C++ beyond the generated Nitro bindings, so "C++ time"
+is the JSI parse (inside the JS commit) and the mount-time copy (visible as
+commit → native latency).
+
+## Scorecard
+
+Generated by `bun perf scorecard --write` from `results/baseline/`; do not edit by hand.
+
+
+### iOS · Apple iPhone18,1 (simulator/emulator) · ios 26.5 · 60 Hz · provider apple
+
+- Build: **release**, production JS, Hermes, PerfProbe on (profile build).
+- **Not production-representative**: simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement.
+- Run `20260910-160744-llt0` — baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run, recorded 2026-09-10T14:07:50.382Z → 2026-09-10T14:19:12.571Z; results in `results/baseline/ios/apple-iphone18-1-release-probes/`.
+
+| Scenario | FPS avg | Frame p95 | Frame p99 | Worst frame | Jank ratio | JS lag p95 | JS commit avg | Native main-thread | RAM after | RAM Δ interaction | JS allocated | CPU |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| markers-100 | 59.3 | 16.7 ms | 21.3 ms | 45.4 ms | 0.6 % | 0.48 ms | N/A | 1.82 ms | 260 MB | 75 MB | 109 KB | 31 % |
+| markers-1k | 58.6 | 16.7 ms | 33.3 ms | 50.0 ms | 1.8 % | 0.57 ms | N/A | 3.15 ms | 264 MB | 84 MB | 168 KB | 32 % |
+| markers-10k | 57.9 | 16.7 ms | 36.6 ms | 43.8 ms | 3.0 % | 0.45 ms | N/A | 8.03 ms | 253 MB | 61 MB | 157 KB | 32 % |
+| markers-50k | 56.6 | 16.7 ms | 52.1 ms | 101.4 ms | 2.4 % | 0.47 ms | N/A | 13.8 ms | 355 MB | 95 MB | 167 KB | 29 % |
+| markers-children-1k | 59.0 | 16.7 ms | 33.3 ms | 46.9 ms | 1.2 % | 0.53 ms | N/A | 3.35 ms | 313 MB | 79 MB | 146 KB | 32 % |
+| markers-10k-rich | 58.3 | 16.7 ms | 34.0 ms | 41.7 ms | 2.4 % | 0.53 ms | N/A | 7.10 ms | 298 MB | 80 MB | 148 KB | 33 % |
+| camera-fast-pan-0 | 59.5 | 16.7 ms | 16.7 ms | 48.0 ms | 0.4 % | 0.51 ms | N/A | 2.37 ms | 321 MB | 109 MB | 119 KB | 34 % |
+| camera-fast-pan-1k | 59.5 | 16.7 ms | 16.7 ms | 51.0 ms | 0.4 % | 0.51 ms | N/A | 4.73 ms | 322 MB | 133 MB | 179 KB | 31 % |
+| camera-idle-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.48 ms | N/A | 0.00 ms | 233 MB | 7 MB | 119 KB | 2 % |
+| camera-slow-pan-10k | 59.2 | 16.7 ms | 33.3 ms | 45.8 ms | 1.0 % | 0.47 ms | N/A | 11.6 ms | 308 MB | 86 MB | 293 KB | 28 % |
+| camera-fast-pan-10k | 59.2 | 16.7 ms | 24.6 ms | 42.1 ms | 0.9 % | 0.41 ms | N/A | 10.6 ms | 339 MB | 126 MB | 215 KB | 30 % |
+| camera-continuous-pan-10k | 59.2 | 16.7 ms | 33.3 ms | 41.7 ms | 1.1 % | 0.48 ms | N/A | 24.0 ms | 306 MB | 76 MB | 354 KB | 27 % |
+| camera-zoom-in-10k | 57.4 | 16.7 ms | 41.3 ms | 46.0 ms | 3.8 % | 0.52 ms | N/A | 45.9 ms | 418 MB | 196 MB | 689 KB | 47 % |
+| camera-zoom-out-10k | 57.8 | 16.7 ms | 35.5 ms | 40.9 ms | 3.7 % | 0.46 ms | N/A | 28.1 ms | 412 MB | 186 MB | 465 KB | 47 % |
+| camera-rapid-zoom-10k | 58.4 | 16.7 ms | 33.3 ms | 37.6 ms | 2.8 % | 0.54 ms | N/A | 14.9 ms | 345 MB | 108 MB | 283 KB | 41 % |
+| camera-rotate-10k | 58.2 | 16.7 ms | 47.9 ms | 71.2 ms | 1.6 % | 0.46 ms | N/A | 8.35 ms | 306 MB | 72 MB | 172 KB | 32 % |
+| camera-pitch-10k | 58.0 | 16.7 ms | 34.3 ms | 47.0 ms | 2.8 % | 0.48 ms | N/A | 4.29 ms | 345 MB | 113 MB | 123 KB | 43 % |
+| camera-rapid-10k | 57.3 | 16.7 ms | 33.5 ms | 45.1 ms | 4.3 % | 0.50 ms | N/A | 17.7 ms | 316 MB | 84 MB | 292 KB | 37 % |
+| camera-fast-pan-50k | 58.4 | 16.7 ms | 35.1 ms | 47.5 ms | 2.3 % | 0.52 ms | N/A | 28.9 ms | 402 MB | 134 MB | 295 KB | 37 % |
+| mutations-10k | 59.9 | 16.7 ms | 16.7 ms | 43.5 ms | 0.1 % | 0.53 ms | 13.0 ms | 114.6 ms | 253 MB | 21 MB | 81.7 MB | 7 % |
+| mutations-1k-children | 59.7 | 16.7 ms | 16.7 ms | 84.3 ms | 0.3 % | 0.53 ms | 4.76 ms | 21.9 ms | 223 MB | -9 MB | 47.0 MB | 4 % |
+| mutations-continuous-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.49 ms | 2.59 ms | 35.1 ms | 208 MB | -2 MB | 12.2 MB | 13 % |
+| mutations-continuous-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.58 ms | 15.4 ms | 162.7 ms | 245 MB | 21 MB | 87.7 MB | 22 % |
+| polyline-100 | 59.6 | 16.7 ms | 16.7 ms | 46.9 ms | 0.3 % | 0.50 ms | 0.36 ms | 16.1 ms | 319 MB | 81 MB | 690 KB | 20 % |
+| polyline-1k | 59.2 | 16.7 ms | 33.3 ms | 35.6 ms | 1.3 % | 0.51 ms | 0.60 ms | 21.7 ms | 312 MB | 92 MB | 2.3 MB | 21 % |
+| polyline-10k | 59.4 | 16.7 ms | 16.7 ms | 46.6 ms | 0.7 % | 0.51 ms | 1.25 ms | 17.2 ms | 318 MB | 85 MB | 15.3 MB | 22 % |
+| polyline-100k | 57.5 | 16.7 ms | 50.4 ms | 69.7 ms | 2.2 % | 0.65 ms | 6.77 ms | 27.9 ms | 321 MB | 107 MB | 147.8 MB | 27 % |
+| polygon-100 | 59.3 | 16.7 ms | 17.6 ms | 49.0 ms | 0.8 % | 0.51 ms | 0.43 ms | 15.4 ms | 307 MB | 72 MB | 459 KB | 25 % |
+| polygon-1k | 59.5 | 16.7 ms | 16.7 ms | 35.3 ms | 0.8 % | 0.52 ms | 0.65 ms | 15.7 ms | 304 MB | 91 MB | 1.5 MB | 25 % |
+| polygon-10k | 59.5 | 16.7 ms | 16.7 ms | 45.6 ms | 0.4 % | 0.45 ms | 0.90 ms | 15.0 ms | 314 MB | 91 MB | 9.7 MB | 21 % |
+| polylines-200x50 | 57.7 | 16.7 ms | 37.7 ms | 50.0 ms | 3.0 % | 0.50 ms | 1.16 ms | 90.1 ms | 346 MB | 98 MB | 3.6 MB | 32 % |
+| polygons-200x20 | 57.4 | 16.7 ms | 44.0 ms | 61.5 ms | 2.5 % | 0.54 ms | 0.84 ms | 123.2 ms | 348 MB | 104 MB | 1.8 MB | 26 % |
+| cluster-1k | 59.4 | 16.7 ms | 33.3 ms | 34.7 ms | 1.0 % | 0.51 ms | 5.01 ms | 68.0 ms | 408 MB | 156 MB | 1.1 MB | 30 % |
+| cluster-10k | 58.9 | 16.7 ms | 33.3 ms | 37.1 ms | 1.9 % | 0.52 ms | 11.3 ms | 118.8 ms | 427 MB | 133 MB | 3.0 MB | 34 % |
+| cluster-50k | 58.4 | 16.7 ms | 34.1 ms | 87.8 ms | 1.7 % | 0.53 ms | 49.3 ms | 128.4 ms | 467 MB | 131 MB | 9.8 MB | 65 % |
+| combined-10k-camera | 58.7 | 16.7 ms | 33.4 ms | 48.9 ms | 1.9 % | 0.50 ms | N/A | 16.9 ms | 446 MB | 181 MB | 367 KB | 38 % |
+| combined-10k-cluster-camera | 59.8 | 16.7 ms | 16.7 ms | 33.3 ms | 0.3 % | 0.51 ms | N/A | 76.9 ms | 438 MB | 148 MB | 686 KB | 39 % |
+| combined-10k-updates | 59.5 | 16.7 ms | 16.7 ms | 33.3 ms | 0.8 % | 0.47 ms | 13.1 ms | 84.1 ms | 365 MB | 108 MB | 44.1 MB | 33 % |
+| combined-10k-polyline | 58.9 | 16.7 ms | 33.3 ms | 45.7 ms | 1.5 % | 0.53 ms | 1.55 ms | 15.6 ms | 387 MB | 99 MB | 6.8 MB | 27 % |
+| combined-10k-polygon | 58.0 | 16.7 ms | 42.8 ms | 61.2 ms | 1.6 % | 0.56 ms | 2.94 ms | 137.6 ms | 452 MB | 129 MB | 1.9 MB | 29 % |
+| combined-all | 58.9 | 16.7 ms | 35.1 ms | 39.8 ms | 1.9 % | 0.53 ms | 13.3 ms | 102.8 ms | 497 MB | 159 MB | 35.7 MB | 41 % |
+| stability-5m | 59.5 | 16.7 ms | 16.7 ms | 60.1 ms | 0.8 % | 0.51 ms | 13.2 ms | 1139.9 ms | 390 MB | 112 MB | 112.3 MB | 28 % |
+
+#### mutations-10k — update cost by number of changed markers (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 12.3 ms | 1.13 ms | 1.60 ms | 1.60 ms | 0.66 ms | 1.72 ms | 0.07 ms | 0.00 ms | 1.9 MB |
+| remove-1 | 1 | 12.2 ms | 1.20 ms | 1.64 ms | 1.64 ms | 0.55 ms | 1.46 ms | 0.05 ms | 0.00 ms | 1.8 MB |
+| update-1 | 1 | 12.1 ms | 1.39 ms | 1.71 ms | 1.71 ms | 0.66 ms | 1.78 ms | 0.05 ms | 0.00 ms | 1.8 MB |
+| update-10 | 10 | 13.6 ms | 1.68 ms | 2.12 ms | 2.12 ms | 0.60 ms | 1.45 ms | 0.06 ms | 0.00 ms | 1.8 MB |
+| update-100 | 100 | 12.9 ms | 1.49 ms | 2.35 ms | 2.35 ms | 0.75 ms | 1.75 ms | 0.07 ms | 0.00 ms | 1.8 MB |
+| update-1pct | 100 | 14.1 ms | 1.64 ms | 2.39 ms | 2.39 ms | 0.88 ms | 1.29 ms | 0.06 ms | 0.10 ms | 1.8 MB |
+| update-10pct | 1000 | 10.8 ms | 1.22 ms | 1.83 ms | 1.83 ms | 0.56 ms | 1.05 ms | 0.05 ms | 0.14 ms | 1.9 MB |
+| update-100pct | 10000 | 9.27 ms | 1.11 ms | 1.70 ms | 1.70 ms | 0.61 ms | 1.24 ms | 0.06 ms | 0.49 ms | 3.5 MB |
+
+JS commit vs. changed markers: empirical exponent -0.02 (0 = independent of how many changed, 1 = linear).
+
+#### mutations-1k-children — update cost by number of changed markers (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | polylines.set | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 4.64 ms | 0.41 ms | 0.33 ms | 0.33 ms | 0.12 ms | 0.21 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| remove-1 | 1 | 5.16 ms | 0.29 ms | 0.35 ms | 0.35 ms | 0.12 ms | 0.19 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-1 | 1 | 4.11 ms | 0.33 ms | 0.27 ms | 0.27 ms | 0.08 ms | 0.15 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-10 | 10 | 4.64 ms | 0.32 ms | 0.30 ms | 0.30 ms | 0.07 ms | 0.17 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-100 | 100 | 4.30 ms | 0.37 ms | 0.25 ms | 0.25 ms | 0.07 ms | 0.11 ms | 0.02 ms | 0.09 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-1pct | 10 | 4.68 ms | 0.34 ms | 0.33 ms | 0.33 ms | 0.12 ms | 0.17 ms | 0.03 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-10pct | 100 | 4.19 ms | 0.35 ms | 0.37 ms | 0.37 ms | 0.10 ms | 0.20 ms | 0.03 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-100pct | 1000 | 4.14 ms | 0.40 ms | 0.33 ms | 0.33 ms | 0.11 ms | 0.17 ms | 0.02 ms | 0.20 ms | 0.00 ms | 0.00 ms | 1.3 MB |
+
+JS commit vs. changed markers: empirical exponent -0.02 (0 = independent of how many changed, 1 = linear).
+
+#### mutations-continuous-1k — steps
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 2.59 ms | 0.42 ms | 0.41 ms | 20.4 ms | 6.11 ms | 11.7 ms | 1.47 ms | 8.62 ms | 12.1 MB |
+
+#### mutations-continuous-10k — steps
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 15.4 ms | 1.72 ms | 2.37 ms | 118.3 ms | 43.8 ms | 82.9 ms | 3.29 ms | 0.51 ms | 87.6 MB |
+
+#### stability-5m — timeline
+
+| Window | At | FPS | p95 | p99 | Worst | Jank | RAM | CPU | JS alloc | Native main |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| minute-1 | 63 s | 59.2 | 16.7 ms | 28.9 ms | 52.1 ms | 1.2 % | 420 MB | 28 % | 22.1 MB | 244.7 ms |
+| minute-2 | 125 s | 59.6 | 16.7 ms | 16.7 ms | 39.6 ms | 0.7 % | 441 MB | 28 % | 23.1 MB | 242.8 ms |
+| minute-3 | 188 s | 59.6 | 16.7 ms | 16.7 ms | 38.2 ms | 0.6 % | 460 MB | 28 % | 23.3 MB | 234.8 ms |
+| minute-4 | 250 s | 59.5 | 16.7 ms | 16.7 ms | 60.1 ms | 0.8 % | 481 MB | 28 % | 22.8 MB | 236.0 ms |
+
+Drift first → last window: FPS 0.3, RAM 61 MB; retained after unmount -134.9 MB.
+
+#### Evidence per scenario
+
+| Scenario | Mount commit | Mount → ready | Load: native main | Top native (interaction) | Top background | Retained after cleanup | Events to JS | Bridge latency |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| markers-100 | 0.64 ms | 256.0 ms | annotation.viewFor 36.0 ms/p95 0.02 (100); markers.set 1.3 ms/p95 1.17 (2) | camera.apply 1.6 ms/p95 0.56 (4); annotation.viewFor 0.2 ms/p95 0.20 (1) | | 66 MB | - | N/A |
+| markers-1k | 2.87 ms | 75.0 ms | annotation.viewFor 5.3 ms/p95 5.18 (4); markers.fingerprint 0.2 ms/p95 0.10 (3) | camera.apply 2.2 ms/p95 0.82 (4); markers.applyDiff 0.9 ms/p95 0.23 (28); annotation.viewFor 0.1 ms/p95 0.06 (1) | markers.viewportCompute 0.9 ms/p95 0.06 (28); markers.diff 0.4 ms/p95 0.03 (28) | 2 MB | - | N/A |
+| markers-10k | 12.7 ms | 77.0 ms | annotation.viewFor 5.3 ms/p95 0.01 (61); markers.fingerprint 1.2 ms/p95 0.64 (3) | markers.applyDiff 4.8 ms/p95 0.42 (28); camera.apply 2.8 ms/p95 1.00 (4); annotation.viewFor 0.5 ms/p95 0.06 (18) | markers.viewportCompute 3.0 ms/p95 0.15 (28); markers.candidates 2.1 ms/p95 0.05 (28) | 8 MB | - | N/A |
+| markers-50k | 41.9 ms | 117.0 ms | annotation.viewFor 7.3 ms/p95 0.01 (287); markers.fingerprint 6.3 ms/p95 3.62 (3) | markers.applyDiff 10.6 ms/p95 1.01 (28); camera.apply 2.1 ms/p95 0.55 (4); annotation.viewFor 1.0 ms/p95 0.05 (72) | markers.viewportCompute 5.2 ms/p95 0.70 (28); markers.candidates 3.3 ms/p95 0.63 (28) | 39 MB | - | N/A |
+| markers-children-1k | 4.36 ms | 60.0 ms | annotation.viewFor 4.4 ms/p95 4.35 (4); markers.fingerprint 0.1 ms/p95 0.07 (3) | camera.apply 1.9 ms/p95 0.71 (4); markers.applyDiff 1.1 ms/p95 0.34 (28); markers.fingerprint 0.1 ms/p95 0.11 (1) | markers.viewportCompute 1.0 ms/p95 0.07 (28); markers.diff 0.4 ms/p95 0.02 (28) | 1 MB | - | N/A |
+| markers-10k-rich | 9.07 ms | 95.0 ms | annotation.viewFor 9.0 ms/p95 0.02 (63); markers.fingerprint 2.5 ms/p95 1.31 (3) | markers.applyDiff 4.7 ms/p95 0.52 (28); camera.apply 2.1 ms/p95 0.77 (4); annotation.viewFor 0.3 ms/p95 0.06 (9) | markers.viewportCompute 1.8 ms/p95 0.11 (28); markers.candidates 0.8 ms/p95 0.04 (28) | -22 MB | - | N/A |
+| camera-fast-pan-0 | 1.11 ms | 80.0 ms | region.apply 0.0 ms/p95 0.01 (1) | camera.apply 2.4 ms/p95 0.54 (7) | | -50 MB | - | N/A |
+| camera-fast-pan-1k | 2.97 ms | 94.0 ms | annotation.viewFor 19.2 ms/p95 19.14 (4); markers.fingerprint 0.1 ms/p95 0.07 (3) | camera.apply 3.5 ms/p95 1.20 (7); markers.applyDiff 1.1 ms/p95 0.21 (35); annotation.viewFor 0.1 ms/p95 0.09 (3) | markers.viewportCompute 0.8 ms/p95 0.04 (35); markers.diff 0.3 ms/p95 0.02 (35) | 65 MB | - | N/A |
+| camera-idle-10k | 11.2 ms | 95.0 ms | annotation.viewFor 8.6 ms/p95 0.02 (61); markers.fingerprint 1.3 ms/p95 0.67 (3) | | | -43 MB | - | N/A |
+| camera-slow-pan-10k | 9.43 ms | 97.0 ms | annotation.viewFor 5.7 ms/p95 0.01 (61); markers.fingerprint 1.4 ms/p95 0.84 (3) | markers.applyDiff 8.3 ms/p95 0.38 (65); camera.apply 2.4 ms/p95 0.69 (5); annotation.viewFor 0.9 ms/p95 0.07 (22) | markers.viewportCompute 3.2 ms/p95 0.09 (65); markers.diff 1.1 ms/p95 0.04 (65) | 33 MB | - | N/A |
+| camera-fast-pan-10k | 10.6 ms | 88.0 ms | annotation.viewFor 15.0 ms/p95 0.01 (61); markers.fingerprint 1.4 ms/p95 0.75 (3) | markers.applyDiff 7.0 ms/p95 0.47 (35); camera.apply 2.5 ms/p95 0.64 (7); annotation.viewFor 1.1 ms/p95 0.04 (73) | markers.viewportCompute 1.5 ms/p95 0.13 (35); markers.candidates 0.6 ms/p95 0.08 (35) | 71 MB | - | N/A |
+| camera-continuous-pan-10k | 9.31 ms | 104.0 ms | annotation.viewFor 6.1 ms/p95 0.02 (61); markers.fingerprint 1.3 ms/p95 0.80 (3) | markers.applyDiff 13.6 ms/p95 0.52 (74); camera.apply 8.4 ms/p95 0.85 (15); annotation.viewFor 1.9 ms/p95 0.07 (67) | markers.viewportCompute 4.5 ms/p95 0.10 (74); markers.candidates 2.3 ms/p95 0.04 (74) | -22 MB | - | N/A |
+| camera-zoom-in-10k | 9.65 ms | 162.0 ms | annotation.viewFor 16.2 ms/p95 0.01 (61); markers.fingerprint 1.3 ms/p95 0.75 (3) | markers.applyDiff 32.1 ms/p95 2.69 (45); annotation.viewFor 11.9 ms/p95 0.01 (2032); camera.apply 1.8 ms/p95 0.62 (5) | markers.viewportCompute 8.6 ms/p95 0.62 (45); markers.viewportFilter 3.3 ms/p95 0.32 (45) | 40 MB | - | N/A |
+| camera-zoom-out-10k | 8.20 ms | 87.0 ms | annotation.viewFor 6.2 ms/p95 0.01 (61); markers.fingerprint 1.5 ms/p95 0.95 (3) | markers.applyDiff 16.7 ms/p95 2.37 (45); annotation.viewFor 9.4 ms/p95 0.01 (1230); camera.apply 1.9 ms/p95 0.59 (5) | markers.viewportCompute 7.4 ms/p95 0.65 (45); markers.viewportFilter 2.9 ms/p95 0.36 (45) | 3 MB | - | N/A |
+| camera-rapid-zoom-10k | 8.31 ms | 112.0 ms | annotation.viewFor 7.7 ms/p95 0.02 (61); markers.fingerprint 1.6 ms/p95 1.10 (3) | markers.applyDiff 6.8 ms/p95 0.75 (36); annotation.viewFor 5.0 ms/p95 0.03 (298); camera.apply 3.0 ms/p95 0.67 (10) | markers.viewportCompute 3.2 ms/p95 0.33 (36); markers.candidates 1.6 ms/p95 0.26 (36) | -23 MB | - | N/A |
+| camera-rotate-10k | 12.2 ms | 93.0 ms | annotation.viewFor 5.3 ms/p95 0.01 (61); markers.fingerprint 1.1 ms/p95 0.63 (3) | markers.applyDiff 5.5 ms/p95 0.49 (32); camera.apply 1.8 ms/p95 0.57 (4); annotation.viewFor 1.1 ms/p95 0.06 (49) | markers.viewportCompute 1.6 ms/p95 0.10 (32); markers.candidates 0.6 ms/p95 0.05 (32) | -9 MB | - | N/A |
+| camera-pitch-10k | 12.9 ms | 71.0 ms | annotation.viewFor 5.5 ms/p95 0.01 (61); markers.fingerprint 1.3 ms/p95 0.72 (3) | markers.applyDiff 2.3 ms/p95 0.43 (24); camera.apply 1.9 ms/p95 0.98 (3) | markers.viewportCompute 1.1 ms/p95 0.08 (24); markers.candidates 0.5 ms/p95 0.04 (24) | 5 MB | - | N/A |
+| camera-rapid-10k | 10.3 ms | 69.0 ms | annotation.viewFor 5.5 ms/p95 0.01 (61); markers.fingerprint 1.2 ms/p95 0.61 (3) | camera.apply 9.6 ms/p95 0.84 (21); markers.applyDiff 6.8 ms/p95 0.33 (44); annotation.viewFor 1.2 ms/p95 0.04 (60) | markers.viewportCompute 1.7 ms/p95 0.08 (44); markers.candidates 0.6 ms/p95 0.03 (44) | -3 MB | - | N/A |
+| camera-fast-pan-50k | 43.6 ms | 166.0 ms | annotation.viewFor 7.6 ms/p95 0.01 (287); markers.fingerprint 6.1 ms/p95 3.30 (3) | markers.applyDiff 23.4 ms/p95 1.91 (35); camera.apply 3.1 ms/p95 0.95 (7); annotation.viewFor 2.4 ms/p95 0.02 (303) | markers.viewportCompute 4.0 ms/p95 0.31 (35); markers.candidates 2.0 ms/p95 0.20 (35) | 39 MB | - | N/A |
+| mutations-10k | 9.95 ms | 101.0 ms | annotation.viewFor 5.4 ms/p95 0.02 (61); markers.fingerprint 1.4 ms/p95 0.77 (3) | markers.set 82.0 ms/p95 3.41 (40); markers.fingerprint 27.4 ms/p95 0.98 (40); markers.applyDiff 5.0 ms/p95 0.64 (40) | markers.indexBuild 60.2 ms/p95 2.24 (40); markers.viewportCompute 2.5 ms/p95 0.09 (40) | -70 MB | - | 1.446 ms avg / 3.172 max |
+| mutations-1k-children | 1.86 ms | 103.0 ms | annotation.viewFor 18.4 ms/p95 18.31 (4); markers.fingerprint 0.1 ms/p95 0.06 (3) | markers.set 13.3 ms/p95 0.48 (41); markers.fingerprint 4.2 ms/p95 0.13 (41); markers.applyDiff 4.2 ms/p95 0.21 (40) | markers.indexBuild 7.3 ms/p95 0.26 (40); markers.viewportCompute 1.1 ms/p95 0.07 (40) | -18 MB | - | 0.343 ms avg / 0.529 max |
+| mutations-continuous-1k | 5.97 ms | 89.0 ms | annotation.viewFor 20.7 ms/p95 20.68 (4); markers.fingerprint 0.1 ms/p95 0.07 (3) | markers.set 20.4 ms/p95 0.60 (50); markers.applyDiff 8.6 ms/p95 0.25 (50); markers.fingerprint 6.1 ms/p95 0.15 (50) | markers.indexBuild 11.7 ms/p95 0.43 (50); markers.viewportCompute 1.5 ms/p95 0.04 (50) | 12 MB | - | 0.417 ms avg / 0.679 max |
+| mutations-continuous-10k | 12.0 ms | 98.0 ms | annotation.viewFor 5.3 ms/p95 0.02 (61); markers.fingerprint 1.4 ms/p95 0.71 (3) | markers.set 118.3 ms/p95 4.99 (50); markers.fingerprint 43.8 ms/p95 1.34 (50); markers.applyDiff 0.5 ms/p95 0.00 (50) | markers.indexBuild 82.9 ms/p95 2.40 (50); markers.viewportCompute 3.3 ms/p95 0.09 (50) | 26 MB | - | 1.717 ms avg / 2.972 max |
+| polyline-100 | 1.34 ms | 137.0 ms | polylines.set 1.8 ms/p95 1.82 (2); region.apply 0.0 ms/p95 0.01 (1) | polylines.set 14.3 ms/p95 2.66 (8); camera.apply 1.8 ms/p95 0.60 (4) | | -18 MB | - | 0.117 ms avg / 0.201 max |
+| polyline-1k | 1.08 ms | 87.0 ms | polylines.set 0.2 ms/p95 0.23 (2); region.apply 0.0 ms/p95 0.01 (1) | polylines.set 20.2 ms/p95 3.45 (8); camera.apply 1.5 ms/p95 0.49 (4) | | 0 MB | - | 0.178 ms avg / 0.25 max |
+| polyline-10k | 1.09 ms | 55.0 ms | polylines.set 0.5 ms/p95 0.46 (2); region.apply 0.0 ms/p95 0.01 (1) | polylines.set 15.7 ms/p95 2.73 (8); camera.apply 1.5 ms/p95 0.46 (4) | | 1 MB | - | 0.187 ms avg / 0.263 max |
+| polyline-100k | 6.59 ms | 60.0 ms | polylines.set 2.1 ms/p95 2.09 (2); region.apply 0.0 ms/p95 0.01 (1) | polylines.set 26.2 ms/p95 3.61 (8); camera.apply 1.7 ms/p95 0.66 (4) | | -7 MB | - | 0.493 ms avg / 0.65 max |
+| polygon-100 | 1.06 ms | 88.0 ms | polygons.set 0.6 ms/p95 0.55 (2); region.apply 0.0 ms/p95 0.01 (1) | polygons.set 13.2 ms/p95 3.19 (5); camera.apply 2.1 ms/p95 0.99 (4) | | -0 MB | - | 0.145 ms avg / 0.225 max |
+| polygon-1k | 0.98 ms | 65.0 ms | polygons.set 0.4 ms/p95 0.40 (2); region.apply 0.0 ms/p95 0.01 (1) | polygons.set 13.9 ms/p95 3.07 (5); camera.apply 1.8 ms/p95 0.54 (4) | | 0 MB | - | 0.15 ms avg / 0.17 max |
+| polygon-10k | 1.21 ms | 108.0 ms | polygons.set 1.7 ms/p95 1.71 (2); markers.set 0.0 ms/p95 0.00 (2) | polygons.set 13.6 ms/p95 3.12 (5); camera.apply 1.4 ms/p95 0.50 (4) | | 1 MB | - | 0.155 ms avg / 0.219 max |
+| polylines-200x50 | 1.26 ms | 80.0 ms | polylines.set 13.7 ms/p95 13.66 (2); polygons.set 0.0 ms/p95 0.01 (2) | polylines.set 88.7 ms/p95 30.88 (3); camera.apply 1.4 ms/p95 0.40 (4) | | -1 MB | - | 0.221 ms avg / 0.286 max |
+| polygons-200x20 | 1.80 ms | 95.0 ms | polygons.set 19.3 ms/p95 19.34 (2); circles.set 0.0 ms/p95 0.01 (2) | polygons.set 121.8 ms/p95 46.06 (3); camera.apply 1.4 ms/p95 0.56 (4) | | -0 MB | - | 0.226 ms avg / 0.346 max |
+| cluster-1k | 1.49 ms | 62.0 ms | annotation.viewFor 2.2 ms/p95 0.09 (23); markers.applyDiff 2.0 ms/p95 1.99 (1) | markers.applyDiff 39.8 ms/p95 1.15 (86); annotation.viewFor 22.3 ms/p95 0.05 (928); camera.apply 5.3 ms/p95 0.87 (10) | markers.viewportCompute 42.6 ms/p95 1.02 (86); markers.cluster 27.0 ms/p95 0.76 (86) | 2 MB | - | 0.408 ms avg / 0.408 max |
+| cluster-10k | 11.4 ms | 106.0 ms | annotation.viewFor 1.9 ms/p95 0.27 (26); markers.fingerprint 1.3 ms/p95 0.69 (3) | markers.applyDiff 69.1 ms/p95 1.76 (86); annotation.viewFor 41.3 ms/p95 0.04 (2308); camera.apply 5.0 ms/p95 1.14 (10) | markers.viewportCompute 371.2 ms/p95 14.87 (86); markers.cluster 273.6 ms/p95 7.75 (86) | 12 MB | - | 1.25 ms avg / 1.25 max |
+| cluster-50k | 46.0 ms | 251.0 ms | markers.fingerprint 7.2 ms/p95 3.98 (3); markers.set 4.0 ms/p95 4.04 (2) | markers.applyDiff 64.5 ms/p95 2.87 (58); annotation.viewFor 47.4 ms/p95 0.04 (2387); markers.set 8.2 ms/p95 8.16 (1) | markers.viewportCompute 3947.2 ms/p95 150.38 (86); markers.cluster 3647.7 ms/p95 144.46 (86) | 114 MB | - | 8.509 ms avg / 8.509 max |
+| combined-10k-camera | 9.51 ms | 111.0 ms | annotation.viewFor 5.8 ms/p95 0.02 (61); markers.fingerprint 1.3 ms/p95 0.83 (3) | markers.applyDiff 10.4 ms/p95 0.62 (59); camera.apply 4.1 ms/p95 0.75 (10); annotation.viewFor 2.3 ms/p95 0.03 (182) | markers.viewportCompute 6.0 ms/p95 0.29 (59); markers.candidates 3.8 ms/p95 0.24 (59) | 7 MB | - | N/A |
+| combined-10k-cluster-camera | 15.8 ms | 122.0 ms | annotation.viewFor 2.0 ms/p95 0.17 (26); markers.fingerprint 1.2 ms/p95 0.71 (3) | markers.applyDiff 43.1 ms/p95 1.61 (57); annotation.viewFor 29.3 ms/p95 0.04 (1723); camera.apply 4.3 ms/p95 0.84 (8) | markers.viewportCompute 246.0 ms/p95 14.69 (57); markers.cluster 180.6 ms/p95 12.31 (57) | -25 MB | - | N/A |
+| combined-10k-updates | 8.28 ms | 74.0 ms | annotation.viewFor 5.2 ms/p95 0.01 (61); markers.fingerprint 1.1 ms/p95 0.57 (3) | markers.set 55.0 ms/p95 3.83 (25); markers.fingerprint 17.4 ms/p95 0.89 (25); markers.applyDiff 9.0 ms/p95 0.39 (87) | markers.indexBuild 36.6 ms/p95 1.86 (26); markers.viewportCompute 3.3 ms/p95 0.09 (89) | 1 MB | - | 2.125 ms avg / 5.875 max |
+| combined-10k-polyline | 9.89 ms | 113.0 ms | annotation.viewFor 13.9 ms/p95 0.01 (61); markers.fingerprint 1.3 ms/p95 0.78 (3) | polylines.set 6.4 ms/p95 2.93 (3); markers.applyDiff 6.2 ms/p95 0.59 (30); camera.apply 2.2 ms/p95 0.76 (5) | markers.viewportCompute 1.7 ms/p95 0.18 (30); markers.candidates 0.8 ms/p95 0.12 (30) | 69 MB | - | 0.193 ms avg / 0.3 max |
+| combined-10k-polygon | 13.2 ms | 99.0 ms | polygons.set 17.6 ms/p95 17.63 (2); annotation.viewFor 5.3 ms/p95 0.01 (61) | polygons.set 129.9 ms/p95 55.24 (3); markers.applyDiff 5.0 ms/p95 0.37 (30); camera.apply 2.0 ms/p95 0.81 (5) | markers.viewportCompute 1.4 ms/p95 0.11 (30); markers.candidates 0.5 ms/p95 0.10 (30) | 59 MB | - | 0.687 ms avg / 1.215 max |
+| combined-all | 10.6 ms | 143.0 ms | polygons.set 7.3 ms/p95 7.32 (2); annotation.viewFor 3.5 ms/p95 0.36 (26) | markers.set 42.1 ms/p95 3.08 (20); annotation.viewFor 21.9 ms/p95 0.04 (1106); markers.applyDiff 20.6 ms/p95 1.27 (97) | markers.viewportCompute 91.8 ms/p95 6.57 (97); markers.cluster 73.5 ms/p95 5.30 (97) | -20 MB | - | 2.039 ms avg / 5.841 max |
+| stability-5m | 9.96 ms | 83.0 ms | annotation.viewFor 6.2 ms/p95 0.05 (62); markers.fingerprint 1.6 ms/p95 0.98 (3) | markers.applyDiff 498.3 ms/p95 0.72 (2756); annotation.viewFor 230.0 ms/p95 0.05 (18411); camera.apply 206.7 ms/p95 0.84 (424) | markers.viewportCompute 528.9 ms/p95 0.43 (2756); markers.cluster 377.4 ms/p95 0.31 (2756) | -135 MB | - | 1.588 ms avg / 5.695 max |
+
+#### JS → native transfer
+
+| Scenario | Updates | Markers sent | Coordinates sent | Est. bytes | Largest update |
+| --- | --- | --- | --- | --- | --- |
+| markers-100 | markers:1 region:1 | 100 | 100 | 7 KB | markers 7 KB (100 coords) |
+| markers-1k | markers:1 region:1 | 1000 | 1000 | 70 KB | markers 70 KB (1000 coords) |
+| markers-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| markers-50k | markers:1 region:1 | 50000 | 50000 | 3.4 MB | markers 3.4 MB (50000 coords) |
+| markers-children-1k | markerChildren:1 region:1 | 1000 | 1000 | 70 KB | markerChildren 70 KB (1000 coords) |
+| markers-10k-rich | markers:1 region:1 | 10000 | 10000 | 1.8 MB | markers 1.8 MB (10000 coords) |
+| camera-fast-pan-0 | region:1 | 0 | 0 | 0 B | - |
+| camera-fast-pan-1k | markers:1 region:1 | 1000 | 1000 | 70 KB | markers 70 KB (1000 coords) |
+| camera-idle-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-slow-pan-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-fast-pan-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-continuous-pan-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-zoom-in-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-zoom-out-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-rapid-zoom-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-rotate-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-pitch-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-rapid-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-fast-pan-50k | markers:1 region:1 | 50000 | 50000 | 3.4 MB | markers 3.4 MB (50000 coords) |
+| mutations-10k | markers:41 region:1 | 410025 | 410025 | 28.0 MB | markers 700 KB (10000 coords) |
+| mutations-1k-children | markerChildren:41 region:1 | 41025 | 41025 | 2.8 MB | markerChildren 70 KB (1005 coords) |
+| mutations-continuous-1k | markers:51 region:1 | 51000 | 51000 | 3.5 MB | markers 70 KB (1000 coords) |
+| mutations-continuous-10k | markers:51 region:1 | 510000 | 510000 | 34.8 MB | markers 701 KB (10000 coords) |
+| polyline-100 | polylines:9 region:1 | 0 | 900 | 40 KB | polylines 4 KB (100 coords) |
+| polyline-1k | polylines:9 region:1 | 0 | 9000 | 394 KB | polylines 44 KB (1000 coords) |
+| polyline-10k | polylines:9 region:1 | 0 | 90000 | 3.8 MB | polylines 437 KB (10000 coords) |
+| polyline-100k | polylines:9 region:1 | 0 | 900000 | 38.4 MB | polylines 4.3 MB (100000 coords) |
+| polygon-100 | polygons:6 region:1 | 0 | 600 | 27 KB | polygons 4 KB (100 coords) |
+| polygon-1k | polygons:6 region:1 | 0 | 6000 | 263 KB | polygons 44 KB (1000 coords) |
+| polygon-10k | polygons:6 region:1 | 0 | 60000 | 2.6 MB | polygons 437 KB (10000 coords) |
+| polylines-200x50 | polylines:4 region:1 | 0 | 40000 | 1.8 MB | polylines 452 KB (10000 coords) |
+| polygons-200x20 | polygons:4 region:1 | 0 | 16000 | 770 KB | polygons 192 KB (4000 coords) |
+| cluster-1k | markers:2 region:1 clusteringEnabled:1 | 2000 | 2000 | 177 KB | markers 88 KB (1000 coords) |
+| cluster-10k | markers:2 region:1 clusteringEnabled:1 | 20000 | 20000 | 1.7 MB | markers 885 KB (10000 coords) |
+| cluster-50k | markers:2 region:1 clusteringEnabled:1 | 100000 | 100000 | 8.6 MB | markers 4.3 MB (50000 coords) |
+| combined-10k-camera | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| combined-10k-cluster-camera | markers:1 region:1 clusteringEnabled:1 | 10000 | 10000 | 885 KB | markers 885 KB (10000 coords) |
+| combined-10k-updates | markers:26 region:1 | 260000 | 260000 | 17.8 MB | markers 699 KB (10000 coords) |
+| combined-10k-polyline | markers:1 polylines:4 region:1 | 10000 | 50000 | 2.4 MB | markers 699 KB (10000 coords) |
+| combined-10k-polygon | markers:1 polygons:4 region:1 | 10000 | 26000 | 1.4 MB | markers 699 KB (10000 coords) |
+| combined-all | markers:21 polylines:1 polygons:1 region:1 clusteringEnabled:1 | 210000 | 217000 | 18.5 MB | markers 886 KB (10000 coords) |
+| stability-5m | markers:54 region:1 clusteringEnabled:1 | 540000 | 540000 | 46.6 MB | markers 885 KB (10000 coords) |
+
+### Android · Google sdk_gphone64_arm64 (simulator/emulator) · android 15 · 60 Hz · provider google
+
+- Build: **release**, production JS, Hermes, PerfProbe on (profile build).
+- **Not production-representative**: simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement.
+- Run `20260910-162544-6m8g` — baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo, recorded 2026-09-10T14:25:47.462Z → 2026-09-10T14:37:43.810Z; results in `results/baseline/android/google-sdk-gphone64-arm64-release-probes/`.
+
+| Scenario | FPS avg | Frame p95 | Frame p99 | Worst frame | Jank ratio | JS lag p95 | JS commit avg | Native main-thread | RAM after | RAM Δ interaction | JS allocated | CPU |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| markers-100 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.20 ms | N/A | 1.54 ms | 178 MB | 18 MB | 145 KB | 18 % |
+| markers-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.24 ms | N/A | 3.67 ms | 180 MB | -5 MB | 157 KB | 20 % |
+| markers-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | N/A | 7.62 ms | 200 MB | -2 MB | 174 KB | 22 % |
+| markers-50k | 59.3 | 16.7 ms | 16.7 ms | 50.0 ms | 0.6 % | 0.23 ms | N/A | 28.8 ms | 253 MB | -7 MB | 249 KB | 39 % |
+| markers-children-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.27 ms | N/A | 2.96 ms | 240 MB | -36 MB | 157 KB | 25 % |
+| markers-10k-rich | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.18 ms | N/A | 4.21 ms | 253 MB | 54 MB | 176 KB | 14 % |
+| camera-fast-pan-0 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | N/A | 0.88 ms | 267 MB | 33 MB | 167 KB | 17 % |
+| camera-fast-pan-1k | 59.7 | 16.7 ms | 16.7 ms | 33.3 ms | 0.4 % | 0.23 ms | N/A | 3.36 ms | 291 MB | 36 MB | 206 KB | 19 % |
+| camera-idle-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.55 ms | N/A | 0.00 ms | 270 MB | 4 MB | 209 KB | 5 % |
+| camera-slow-pan-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 6.04 ms | 220 MB | -19 MB | 349 KB | 14 % |
+| camera-fast-pan-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.17 ms | N/A | 9.23 ms | 269 MB | -17 MB | 254 KB | 23 % |
+| camera-continuous-pan-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 12.7 ms | 229 MB | 6 MB | 389 KB | 12 % |
+| camera-zoom-in-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.20 ms | N/A | 51.2 ms | 263 MB | -31 MB | 577 KB | 25 % |
+| camera-zoom-out-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.18 ms | N/A | 42.5 ms | 272 MB | 22 MB | 434 KB | 25 % |
+| camera-rapid-zoom-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 42.9 ms | 335 MB | 86 MB | 427 KB | 34 % |
+| camera-rotate-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.25 ms | N/A | 45.3 ms | 257 MB | -38 MB | 301 KB | 32 % |
+| camera-pitch-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | N/A | 1.52 ms | 287 MB | -29 MB | 137 KB | 50 % |
+| camera-rapid-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.27 ms | N/A | 17.6 ms | 293 MB | -60 MB | 351 KB | 27 % |
+| camera-fast-pan-50k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 36.0 ms | 334 MB | -18 MB | 364 KB | 36 % |
+| mutations-10k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.66 ms | 16.0 ms | 170.6 ms | 314 MB | -54 MB | 43.6 MB | 12 % |
+| mutations-1k-children | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.37 ms | 4.88 ms | 25.9 ms | 334 MB | -40 MB | 28.7 MB | 7 % |
+| mutations-continuous-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.39 ms | 2.58 ms | 31.7 ms | 333 MB | 16 MB | 6.7 MB | 12 % |
+| mutations-continuous-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 8.04 ms | 12.3 ms | 90.0 ms | 328 MB | -69 MB | 44.5 MB | 23 % |
+| polyline-100 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.30 ms | 0.66 ms | 4.72 ms | 340 MB | -46 MB | 553 KB | 12 % |
+| polyline-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.35 ms | 1.02 ms | 6.84 ms | 334 MB | -64 MB | 1.7 MB | 13 % |
+| polyline-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.28 ms | 1.66 ms | 27.0 ms | 371 MB | -25 MB | 9.5 MB | 13 % |
+| polyline-100k | 58.6 | 16.7 ms | 33.3 ms | 33.3 ms | 2.4 % | 41.0 ms | 6.03 ms | 120.5 ms | 422 MB | 69 MB | 90.8 MB | 29 % |
+| polygon-100 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.32 ms | 0.73 ms | 3.90 ms | 415 MB | 49 MB | 386 KB | 11 % |
+| polygon-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.26 ms | 0.82 ms | 6.39 ms | 420 MB | 51 MB | 1.1 MB | 11 % |
+| polygon-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.38 ms | 1.39 ms | 19.4 ms | 442 MB | 67 MB | 6.1 MB | 12 % |
+| polylines-200x50 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | 1.96 ms | 37.4 ms | 428 MB | -2 MB | 2.6 MB | 24 % |
+| polygons-200x20 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.27 ms | 1.18 ms | 17.8 ms | 390 MB | -9 MB | 1.3 MB | 37 % |
+| cluster-1k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.22 ms | 1.58 ms | 74.6 ms | 470 MB | 68 MB | 811 KB | 14 % |
+| cluster-10k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.21 ms | 11.2 ms | 80.6 ms | 391 MB | -94 MB | 1.6 MB | 22 % |
+| cluster-50k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.24 ms | 62.3 ms | 175.2 ms | 447 MB | -5 MB | 5.0 MB | 34 % |
+| combined-10k-camera | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.16 ms | N/A | 26.2 ms | 488 MB | -24 MB | 459 KB | 28 % |
+| combined-10k-cluster-camera | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.25 ms | N/A | 79.2 ms | 475 MB | 8 MB | 344 KB | 30 % |
+| combined-10k-updates | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.97 ms | 10.2 ms | 61.3 ms | 492 MB | -41 MB | 22.5 MB | 24 % |
+| combined-10k-polyline | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.25 ms | 3.81 ms | 15.2 ms | 562 MB | -1 MB | 4.4 MB | 21 % |
+| combined-10k-polygon | 59.8 | 16.7 ms | 16.7 ms | 33.3 ms | 0.4 % | 0.20 ms | 4.23 ms | 45.9 ms | 564 MB | -13 MB | 1.4 MB | 38 % |
+| combined-all | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.47 ms | 12.0 ms | 128.8 ms | 604 MB | 24 MB | 18.3 MB | 44 % |
+| stability-5m | 60.0 | 16.7 ms | 16.7 ms | 33.3 ms | 0.0 % | 0.21 ms | 13.2 ms | 1208.9 ms | 540 MB | -75 MB | 72.1 MB | 23 % |
+
+#### mutations-10k — update cost by number of changed markers (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 16.7 ms | 14.3 ms | 0.98 ms | 0.98 ms | 0.94 ms | 0.30 ms | 0.06 ms | 0.00 ms | 1001 KB |
+| remove-1 | 1 | 16.7 ms | 15.2 ms | 1.43 ms | 1.43 ms | 1.35 ms | 0.51 ms | 0.08 ms | 0.01 ms | 910 KB |
+| update-1 | 1 | 17.2 ms | 16.3 ms | 1.33 ms | 1.33 ms | 1.30 ms | 0.34 ms | 0.06 ms | 0.00 ms | 910 KB |
+| update-10 | 10 | 18.8 ms | 17.0 ms | 1.23 ms | 1.23 ms | 1.20 ms | 0.54 ms | 0.06 ms | 0.00 ms | 911 KB |
+| update-100 | 100 | 16.7 ms | 15.6 ms | 2.12 ms | 2.12 ms | 2.03 ms | 0.92 ms | 0.08 ms | 0.01 ms | 921 KB |
+| update-1pct | 100 | 17.4 ms | 14.4 ms | 1.39 ms | 1.39 ms | 1.34 ms | 0.41 ms | 0.07 ms | 0.09 ms | 923 KB |
+| update-10pct | 1000 | 17.4 ms | 13.1 ms | 2.36 ms | 2.36 ms | 2.31 ms | 0.39 ms | 0.10 ms | 0.17 ms | 1.0 MB |
+| update-100pct | 10000 | 12.1 ms | 14.1 ms | 1.29 ms | 1.29 ms | 1.21 ms | 0.39 ms | 0.06 ms | 0.53 ms | 2.1 MB |
+
+JS commit vs. changed markers: empirical exponent -0.02 (0 = independent of how many changed, 1 = linear).
+
+#### mutations-1k-children — update cost by number of changed markers (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | polylines.set | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 6.82 ms | 5.80 ms | 0.24 ms | 0.26 ms | 0.22 ms | 0.30 ms | 0.05 ms | 0.01 ms | 0.02 ms | 0.00 ms | 702 KB |
+| remove-1 | 1 | 4.00 ms | 10.1 ms | 0.27 ms | 0.27 ms | 0.23 ms | 0.25 ms | 0.04 ms | 0.00 ms | 0.02 ms | 0.00 ms | 696 KB |
+| update-1 | 1 | 4.44 ms | 9.37 ms | 0.34 ms | 0.34 ms | 0.31 ms | 0.27 ms | 0.04 ms | 0.00 ms | 0.01 ms | 0.00 ms | 694 KB |
+| update-10 | 10 | 5.30 ms | 8.34 ms | 0.19 ms | 0.19 ms | 0.17 ms | 0.17 ms | 0.03 ms | 0.00 ms | 0.01 ms | 0.00 ms | 695 KB |
+| update-100 | 100 | 4.50 ms | 9.70 ms | 0.30 ms | 0.30 ms | 0.25 ms | 0.15 ms | 0.02 ms | 0.06 ms | 0.01 ms | 0.00 ms | 707 KB |
+| update-1pct | 10 | 5.03 ms | 10.3 ms | 0.40 ms | 0.40 ms | 0.36 ms | 0.49 ms | 0.03 ms | 0.00 ms | 0.01 ms | 0.00 ms | 696 KB |
+| update-10pct | 100 | 4.98 ms | 9.77 ms | 0.25 ms | 0.25 ms | 0.21 ms | 0.53 ms | 0.04 ms | 0.00 ms | 0.02 ms | 0.00 ms | 706 KB |
+| update-100pct | 1000 | 3.49 ms | 8.83 ms | 0.28 ms | 0.28 ms | 0.26 ms | 0.36 ms | 0.02 ms | 0.20 ms | 0.01 ms | 0.00 ms | 814 KB |
+
+JS commit vs. changed markers: empirical exponent -0.04 (0 = independent of how many changed, 1 = linear).
+
+#### mutations-continuous-1k — steps
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 2.58 ms | 13.7 ms | 0.29 ms | 14.7 ms | 12.6 ms | 15.9 ms | 2.04 ms | 3.59 ms | 6.5 MB |
+
+#### mutations-continuous-10k — steps
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 12.3 ms | 7.07 ms | 0.91 ms | 45.6 ms | 44.1 ms | 16.1 ms | 2.32 ms | 0.19 ms | 44.3 MB |
+
+#### stability-5m — timeline
+
+| Window | At | FPS | p95 | p99 | Worst | Jank | RAM | CPU | JS alloc | Native main |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| minute-1 | 63 s | 60.0 | 16.7 ms | 16.7 ms | 33.3 ms | 0.0 % | 664 MB | 26 % | 11.5 MB | 326.2 ms |
+| minute-2 | 125 s | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 640 MB | 22 % | 13.0 MB | 247.1 ms |
+| minute-3 | 188 s | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 704 MB | 22 % | 13.0 MB | 228.6 ms |
+| minute-4 | 251 s | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 714 MB | 21 % | 12.8 MB | 199.3 ms |
+
+Drift first → last window: FPS 0.0, RAM 50 MB; retained after unmount -63.5 MB.
+
+#### Evidence per scenario
+
+| Scenario | Mount commit | Mount → ready | Load: native main | Top native (interaction) | Top background | Retained after cleanup | Events to JS | Bridge latency |
+| --- | --- | --- | --- | --- | --- | --- | --- | --- |
+| markers-100 | 0.89 ms | 841.0 ms | markers.applySync 10.0 ms/p95 10.02 (1); marker.visualProps 3.2 ms/p95 0.06 (100) | camera.apply 1.5 ms/p95 0.54 (4) | | 27 MB | - | N/A |
+| markers-1k | 2.85 ms | 762.0 ms | markers.applyDiff 0.8 ms/p95 0.76 (2); markers.fingerprint 0.7 ms/p95 0.66 (2) | markers.applyDiff 2.0 ms/p95 0.64 (16); camera.apply 1.0 ms/p95 0.44 (4); marker.visualProps 0.7 ms/p95 0.24 (6) | markers.viewportCompute 2.2 ms/p95 0.56 (16); markers.viewportFilter 0.8 ms/p95 0.43 (16) | 2 MB | - | N/A |
+| markers-10k | 12.0 ms | 763.0 ms | markers.fingerprint 2.6 ms/p95 2.63 (2); markers.applyDiff 1.9 ms/p95 1.93 (2) | markers.applyDiff 5.6 ms/p95 2.20 (16); marker.visualProps 1.3 ms/p95 0.09 (70); camera.apply 0.7 ms/p95 0.25 (4) | markers.viewportCompute 3.3 ms/p95 0.43 (16); markers.viewportFilter 1.8 ms/p95 0.34 (16) | 19 MB | - | N/A |
+| markers-50k | 44.1 ms | 832.0 ms | markers.fingerprint 10.2 ms/p95 10.17 (2); markers.applyDiff 8.1 ms/p95 8.10 (2) | markers.applyDiff 20.6 ms/p95 8.72 (16); camera.apply 5.0 ms/p95 4.56 (4); marker.visualProps 3.2 ms/p95 0.02 (420) | markers.viewportCompute 16.8 ms/p95 5.36 (16); markers.viewportFilter 13.5 ms/p95 4.90 (16) | 53 MB | - | N/A |
+| markers-children-1k | 3.52 ms | 791.0 ms | region.apply 2.0 ms/p95 2.00 (1); markers.applyDiff 1.7 ms/p95 1.70 (2) | markers.applyDiff 1.3 ms/p95 0.53 (17); camera.apply 0.6 ms/p95 0.19 (4); markers.set 0.4 ms/p95 0.36 (1) | markers.viewportCompute 1.9 ms/p95 0.72 (17); markers.diff 0.8 ms/p95 0.67 (17) | -12 MB | - | N/A |
+| markers-10k-rich | 11.4 ms | 773.0 ms | markers.fingerprint 3.3 ms/p95 3.28 (2); markers.applyDiff 1.7 ms/p95 1.69 (2) | markers.applyDiff 2.7 ms/p95 0.57 (16); marker.visualProps 0.8 ms/p95 0.02 (82); camera.apply 0.7 ms/p95 0.21 (4) | markers.viewportCompute 3.0 ms/p95 0.82 (16); markers.viewportFilter 2.1 ms/p95 0.77 (16) | 13 MB | - | N/A |
+| camera-fast-pan-0 | 1.73 ms | 782.0 ms | region.apply 0.1 ms/p95 0.10 (1) | camera.apply 0.9 ms/p95 0.19 (7) | | 19 MB | - | N/A |
+| camera-fast-pan-1k | 2.37 ms | 761.0 ms | markers.applyDiff 0.5 ms/p95 0.46 (2); marker.visualProps 0.1 ms/p95 0.12 (4) | markers.applyDiff 1.9 ms/p95 0.25 (22); camera.apply 1.1 ms/p95 0.26 (7); marker.visualProps 0.4 ms/p95 0.03 (27) | markers.viewportCompute 1.2 ms/p95 0.08 (23); markers.candidates 0.5 ms/p95 0.04 (23) | 19 MB | - | N/A |
+| camera-idle-10k | 11.8 ms | 760.0 ms | markers.applyDiff 1.6 ms/p95 1.56 (2); markers.fingerprint 1.3 ms/p95 1.26 (2) | | | -21 MB | - | N/A |
+| camera-slow-pan-10k | 13.3 ms | 735.0 ms | markers.applyDiff 1.2 ms/p95 1.16 (2); markers.fingerprint 1.0 ms/p95 0.99 (2) | markers.applyDiff 4.4 ms/p95 0.47 (35); camera.apply 0.8 ms/p95 0.31 (5); marker.visualProps 0.8 ms/p95 0.02 (75) | markers.viewportCompute 4.5 ms/p95 0.21 (35); markers.viewportFilter 2.6 ms/p95 0.11 (35) | -50 MB | - | N/A |
+| camera-fast-pan-10k | 13.9 ms | 782.0 ms | markers.applyDiff 2.4 ms/p95 2.36 (2); markers.fingerprint 2.3 ms/p95 2.25 (2) | markers.applyDiff 6.3 ms/p95 0.76 (21); marker.visualProps 2.1 ms/p95 0.02 (237); camera.apply 0.9 ms/p95 0.23 (7) | markers.viewportCompute 2.6 ms/p95 0.22 (21); markers.viewportFilter 1.5 ms/p95 0.13 (21) | 49 MB | - | N/A |
+| camera-continuous-pan-10k | 14.7 ms | 789.0 ms | markers.fingerprint 3.4 ms/p95 3.39 (2); markers.applyDiff 1.4 ms/p95 1.34 (2) | markers.applyDiff 8.5 ms/p95 0.81 (35); marker.visualProps 2.5 ms/p95 0.03 (217); camera.apply 1.7 ms/p95 0.30 (15) | markers.viewportCompute 4.6 ms/p95 0.17 (35); markers.viewportFilter 2.4 ms/p95 0.11 (35) | -26 MB | - | N/A |
+| camera-zoom-in-10k | 10.1 ms | 753.0 ms | markers.applyDiff 1.7 ms/p95 1.73 (2); markers.fingerprint 1.7 ms/p95 1.72 (2) | markers.applyDiff 36.2 ms/p95 4.32 (26); marker.visualProps 14.3 ms/p95 0.01 (2325); camera.apply 0.7 ms/p95 0.28 (5) | markers.viewportCompute 9.2 ms/p95 1.15 (26); markers.viewportFilter 7.1 ms/p95 0.94 (26) | 32 MB | - | N/A |
+| camera-zoom-out-10k | 10.8 ms | 751.0 ms | markers.fingerprint 1.2 ms/p95 1.22 (2); markers.applyDiff 1.1 ms/p95 1.13 (2) | markers.applyDiff 30.4 ms/p95 5.43 (26); marker.visualProps 11.2 ms/p95 0.01 (1445); camera.apply 0.9 ms/p95 0.33 (5) | markers.viewportCompute 6.5 ms/p95 0.90 (26); markers.viewportFilter 4.8 ms/p95 0.72 (26) | 11 MB | - | N/A |
+| camera-rapid-zoom-10k | 10.5 ms | 762.0 ms | markers.fingerprint 1.8 ms/p95 1.83 (2); markers.applyDiff 1.8 ms/p95 1.79 (2) | markers.applyDiff 30.1 ms/p95 4.93 (19); marker.visualProps 11.7 ms/p95 0.01 (1786); camera.apply 1.1 ms/p95 0.18 (10) | markers.viewportCompute 2.7 ms/p95 0.35 (19); markers.viewportFilter 1.4 ms/p95 0.27 (19) | 60 MB | - | N/A |
+| camera-rotate-10k | 9.93 ms | 776.0 ms | markers.applyDiff 1.1 ms/p95 1.13 (2); markers.fingerprint 0.7 ms/p95 0.71 (2) | markers.applyDiff 29.9 ms/p95 15.21 (16); marker.visualProps 14.8 ms/p95 0.03 (529); camera.apply 0.7 ms/p95 0.33 (4) | markers.viewportCompute 2.0 ms/p95 0.28 (16); markers.diff 0.7 ms/p95 0.21 (16) | -77 MB | - | N/A |
+| camera-pitch-10k | 14.0 ms | 748.0 ms | markers.applyDiff 1.0 ms/p95 1.00 (2); markers.fingerprint 1.0 ms/p95 0.99 (2) | camera.apply 1.1 ms/p95 0.82 (3); markers.applyDiff 0.4 ms/p95 0.23 (13) | markers.viewportCompute 2.1 ms/p95 1.03 (13); markers.candidates 1.1 ms/p95 0.84 (13) | 30 MB | - | N/A |
+| camera-rapid-10k | 12.1 ms | 754.0 ms | markers.applyDiff 1.6 ms/p95 1.57 (2); markers.fingerprint 1.0 ms/p95 0.98 (2) | markers.applyDiff 11.2 ms/p95 1.81 (23); marker.visualProps 4.0 ms/p95 0.02 (420); camera.apply 2.5 ms/p95 0.27 (21) | markers.viewportCompute 2.5 ms/p95 0.31 (23); markers.viewportFilter 1.1 ms/p95 0.12 (23) | 6 MB | - | N/A |
+| camera-fast-pan-50k | 42.1 ms | 922.0 ms | markers.applyDiff 13.6 ms/p95 13.61 (2); marker.visualProps 7.4 ms/p95 0.04 (313) | markers.applyDiff 26.1 ms/p95 3.65 (21); marker.visualProps 9.1 ms/p95 0.01 (1220); camera.apply 0.9 ms/p95 0.33 (7) | markers.viewportCompute 9.2 ms/p95 1.34 (21); markers.viewportFilter 4.4 ms/p95 0.54 (21) | 51 MB | - | N/A |
+| mutations-10k | 10.1 ms | 771.0 ms | markers.fingerprint 1.8 ms/p95 1.75 (2); markers.applyDiff 1.0 ms/p95 0.98 (2) | markers.set 82.8 ms/p95 3.99 (40); markers.fingerprint 80.8 ms/p95 3.93 (40); markers.applyDiff 5.5 ms/p95 0.53 (40) | markers.indexBuild 21.6 ms/p95 1.27 (40); markers.viewportCompute 3.3 ms/p95 0.16 (40) | -20 MB | - | 14.061 ms avg / 22.554 max |
+| mutations-1k-children | 5.67 ms | 812.0 ms | region.apply 0.7 ms/p95 0.72 (1); markers.applyDiff 0.6 ms/p95 0.54 (2) | markers.set 12.5 ms/p95 0.69 (41); markers.fingerprint 10.6 ms/p95 0.61 (41); markers.applyDiff 1.6 ms/p95 0.20 (40) | markers.indexBuild 13.8 ms/p95 0.62 (40); markers.viewportCompute 1.4 ms/p95 0.05 (40) | 20 MB | - | 9.236 ms avg / 13.666 max |
+| mutations-continuous-1k | 1.58 ms | 807.0 ms | markers.applyDiff 0.9 ms/p95 0.93 (2); markers.fingerprint 0.6 ms/p95 0.59 (2) | markers.set 14.7 ms/p95 0.57 (50); markers.fingerprint 12.6 ms/p95 0.52 (50); markers.applyDiff 3.6 ms/p95 0.12 (50) | markers.indexBuild 15.9 ms/p95 0.72 (50); markers.viewportCompute 2.0 ms/p95 0.07 (50) | 0 MB | - | 13.749 ms avg / 15.919 max |
+| mutations-continuous-10k | 14.3 ms | 762.0 ms | markers.applyDiff 1.4 ms/p95 1.35 (2); markers.fingerprint 0.9 ms/p95 0.93 (2) | markers.set 45.6 ms/p95 1.19 (50); markers.fingerprint 44.1 ms/p95 1.15 (50); markers.applyDiff 0.2 ms/p95 0.00 (50) | markers.indexBuild 16.1 ms/p95 0.54 (50); markers.viewportCompute 2.3 ms/p95 0.07 (50) | -6 MB | - | 7.069 ms avg / 19.773 max |
+| polyline-100 | 1.05 ms | 743.0 ms | region.apply 0.1 ms/p95 0.07 (1) | polylines.set 3.9 ms/p95 0.77 (8); camera.apply 0.8 ms/p95 0.36 (4) | | 12 MB | - | 12.536 ms avg / 15.516 max |
+| polyline-1k | 1.38 ms | 750.0 ms | region.apply 0.1 ms/p95 0.05 (1) | polylines.set 5.9 ms/p95 1.15 (8); camera.apply 0.9 ms/p95 0.31 (4) | | -6 MB | - | 11.326 ms avg / 13.247 max |
+| polyline-10k | 1.67 ms | 744.0 ms | region.apply 0.1 ms/p95 0.07 (1) | polylines.set 26.4 ms/p95 6.56 (8); camera.apply 0.6 ms/p95 0.21 (4) | | 36 MB | - | 8.607 ms avg / 18.361 max |
+| polyline-100k | 6.17 ms | 763.0 ms | region.apply 0.1 ms/p95 0.10 (1) | polylines.set 120.1 ms/p95 16.34 (8); camera.apply 0.4 ms/p95 0.17 (4) | | 53 MB | - | 13.771 ms avg / 20.331 max |
+| polygon-100 | 0.84 ms | 765.0 ms | region.apply 0.1 ms/p95 0.06 (1) | polygons.set 3.3 ms/p95 1.02 (5); camera.apply 0.6 ms/p95 0.25 (4) | | -7 MB | - | 13.344 ms avg / 14.973 max |
+| polygon-1k | 0.97 ms | 765.0 ms | region.apply 0.1 ms/p95 0.11 (1) | polygons.set 5.8 ms/p95 1.84 (5); camera.apply 0.6 ms/p95 0.30 (4) | | 5 MB | - | 13.209 ms avg / 14.351 max |
+| polygon-10k | 1.83 ms | 764.0 ms | region.apply 0.3 ms/p95 0.34 (1) | polygons.set 18.9 ms/p95 5.00 (5); camera.apply 0.5 ms/p95 0.17 (4) | | 22 MB | - | 7.804 ms avg / 15.783 max |
+| polylines-200x50 | 1.52 ms | 773.0 ms | region.apply 0.1 ms/p95 0.06 (1) | polylines.set 36.9 ms/p95 13.52 (3); camera.apply 0.5 ms/p95 0.15 (4) | | -13 MB | - | 8.359 ms avg / 10.938 max |
+| polygons-200x20 | 1.54 ms | 794.0 ms | region.apply 0.1 ms/p95 0.05 (1) | polygons.set 17.3 ms/p95 6.32 (3); camera.apply 0.5 ms/p95 0.21 (4) | | -40 MB | - | 13.497 ms avg / 14.043 max |
+| cluster-1k | 2.51 ms | 964.0 ms | markers.applyDiff 5.1 ms/p95 5.09 (2); markers.fingerprint 0.1 ms/p95 0.09 (3) | markers.applyDiff 70.1 ms/p95 5.65 (53); marker.visualProps 2.8 ms/p95 0.03 (230); camera.apply 1.2 ms/p95 0.20 (10) | markers.viewportCompute 24.0 ms/p95 1.04 (53); markers.cluster 15.5 ms/p95 0.78 (53) | 80 MB | - | 13.651 ms avg / 13.651 max |
+| cluster-10k | 10.5 ms | 618.0 ms | markers.applyDiff 10.1 ms/p95 10.08 (2); markers.fingerprint 1.1 ms/p95 1.13 (3) | markers.applyDiff 74.5 ms/p95 7.06 (53); marker.visualProps 2.9 ms/p95 0.02 (309); markers.set 1.1 ms/p95 1.08 (1) | markers.viewportCompute 85.0 ms/p95 2.85 (53); markers.cluster 73.6 ms/p95 2.58 (53) | -79 MB | - | 6.102 ms avg / 6.102 max |
+| cluster-50k | 38.9 ms | 656.0 ms | markers.applyDiff 7.6 ms/p95 7.61 (2); markers.fingerprint 2.9 ms/p95 2.93 (3) | markers.applyDiff 166.1 ms/p95 24.44 (53); markers.set 3.0 ms/p95 2.95 (1); markers.fingerprint 2.9 ms/p95 2.93 (1) | markers.viewportCompute 514.5 ms/p95 16.80 (53); markers.cluster 483.7 ms/p95 15.97 (53) | 61 MB | - | 15.389 ms avg / 15.389 max |
+| combined-10k-camera | 11.1 ms | 769.0 ms | markers.fingerprint 1.3 ms/p95 1.32 (2); markers.applyDiff 1.0 ms/p95 1.01 (2) | markers.applyDiff 17.8 ms/p95 2.16 (34); marker.visualProps 6.9 ms/p95 0.01 (984); camera.apply 1.5 ms/p95 0.47 (10) | markers.viewportCompute 5.9 ms/p95 0.41 (34); markers.viewportFilter 3.8 ms/p95 0.29 (34) | 41 MB | - | N/A |
+| combined-10k-cluster-camera | 10.9 ms | 634.0 ms | markers.applyDiff 10.7 ms/p95 10.65 (2); markers.fingerprint 2.4 ms/p95 2.42 (3) | markers.applyDiff 76.3 ms/p95 14.39 (30); marker.visualProps 1.8 ms/p95 0.04 (133); camera.apply 1.2 ms/p95 0.24 (8) | markers.viewportCompute 100.9 ms/p95 12.95 (31); markers.cluster 77.0 ms/p95 7.95 (31) | -13 MB | - | N/A |
+| combined-10k-updates | 17.1 ms | 774.0 ms | markers.fingerprint 1.8 ms/p95 1.78 (2); markers.applyDiff 1.4 ms/p95 1.36 (2) | markers.set 26.8 ms/p95 2.04 (25); markers.fingerprint 26.0 ms/p95 2.01 (25); markers.applyDiff 6.4 ms/p95 0.41 (57) | markers.indexBuild 7.7 ms/p95 0.53 (25); markers.viewportCompute 4.4 ms/p95 0.19 (59) | 18 MB | - | 8.258 ms avg / 10.491 max |
+| combined-10k-polyline | 10.6 ms | 798.0 ms | markers.applyDiff 1.6 ms/p95 1.56 (2); markers.fingerprint 1.3 ms/p95 1.29 (2) | polylines.set 9.4 ms/p95 5.55 (3); markers.applyDiff 3.8 ms/p95 0.59 (16); marker.visualProps 1.2 ms/p95 0.04 (98) | markers.viewportCompute 2.0 ms/p95 0.75 (16); markers.viewportFilter 1.0 ms/p95 0.51 (16) | 69 MB | - | 13.244 ms avg / 17.057 max |
+| combined-10k-polygon | 11.3 ms | 856.0 ms | markers.fingerprint 3.0 ms/p95 3.00 (2); markers.applyDiff 1.6 ms/p95 1.65 (2) | polygons.set 41.1 ms/p95 26.52 (3); markers.applyDiff 3.1 ms/p95 0.49 (16); marker.visualProps 1.1 ms/p95 0.02 (97) | markers.viewportCompute 1.1 ms/p95 0.12 (16); markers.viewportFilter 0.5 ms/p95 0.08 (16) | 2 MB | - | 13.532 ms avg / 17.22 max |
+| combined-all | 10.1 ms | 684.0 ms | markers.applyDiff 6.6 ms/p95 6.62 (2); markers.fingerprint 1.3 ms/p95 1.34 (3) | markers.applyDiff 83.2 ms/p95 5.12 (67); markers.set 20.3 ms/p95 1.63 (20); markers.fingerprint 19.4 ms/p95 1.61 (20) | markers.viewportCompute 39.5 ms/p95 2.67 (68); markers.cluster 31.7 ms/p95 2.23 (68) | 39 MB | - | 9.907 ms avg / 17.886 max |
+| stability-5m | 12.2 ms | 828.0 ms | markers.fingerprint 5.5 ms/p95 5.52 (3); markers.applyDiff 2.6 ms/p95 2.63 (2) | markers.applyDiff 892.7 ms/p95 2.52 (1547); marker.visualProps 164.4 ms/p95 0.02 (19060); camera.apply 63.8 ms/p95 0.31 (424) | markers.viewportCompute 364.3 ms/p95 0.51 (1560); markers.cluster 274.8 ms/p95 0.40 (1560) | -64 MB | - | 10.054 ms avg / 20.313 max |
+
+#### JS → native transfer
+
+| Scenario | Updates | Markers sent | Coordinates sent | Est. bytes | Largest update |
+| --- | --- | --- | --- | --- | --- |
+| markers-100 | markers:1 region:1 | 100 | 100 | 7 KB | markers 7 KB (100 coords) |
+| markers-1k | markers:1 region:1 | 1000 | 1000 | 70 KB | markers 70 KB (1000 coords) |
+| markers-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| markers-50k | markers:1 region:1 | 50000 | 50000 | 3.4 MB | markers 3.4 MB (50000 coords) |
+| markers-children-1k | markerChildren:1 region:1 | 1000 | 1000 | 70 KB | markerChildren 70 KB (1000 coords) |
+| markers-10k-rich | markers:1 region:1 | 10000 | 10000 | 1.8 MB | markers 1.8 MB (10000 coords) |
+| camera-fast-pan-0 | region:1 | 0 | 0 | 0 B | - |
+| camera-fast-pan-1k | markers:1 region:1 | 1000 | 1000 | 70 KB | markers 70 KB (1000 coords) |
+| camera-idle-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-slow-pan-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-fast-pan-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-continuous-pan-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-zoom-in-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-zoom-out-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-rapid-zoom-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-rotate-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-pitch-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-rapid-10k | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| camera-fast-pan-50k | markers:1 region:1 | 50000 | 50000 | 3.4 MB | markers 3.4 MB (50000 coords) |
+| mutations-10k | markers:41 region:1 | 410025 | 410025 | 28.0 MB | markers 700 KB (10000 coords) |
+| mutations-1k-children | markerChildren:41 region:1 | 41025 | 41025 | 2.8 MB | markerChildren 70 KB (1005 coords) |
+| mutations-continuous-1k | markers:51 region:1 | 51000 | 51000 | 3.5 MB | markers 70 KB (1000 coords) |
+| mutations-continuous-10k | markers:51 region:1 | 510000 | 510000 | 34.8 MB | markers 701 KB (10000 coords) |
+| polyline-100 | polylines:9 region:1 | 0 | 900 | 40 KB | polylines 4 KB (100 coords) |
+| polyline-1k | polylines:9 region:1 | 0 | 9000 | 394 KB | polylines 44 KB (1000 coords) |
+| polyline-10k | polylines:9 region:1 | 0 | 90000 | 3.8 MB | polylines 437 KB (10000 coords) |
+| polyline-100k | polylines:9 region:1 | 0 | 900000 | 38.4 MB | polylines 4.3 MB (100000 coords) |
+| polygon-100 | polygons:6 region:1 | 0 | 600 | 27 KB | polygons 4 KB (100 coords) |
+| polygon-1k | polygons:6 region:1 | 0 | 6000 | 263 KB | polygons 44 KB (1000 coords) |
+| polygon-10k | polygons:6 region:1 | 0 | 60000 | 2.6 MB | polygons 437 KB (10000 coords) |
+| polylines-200x50 | polylines:4 region:1 | 0 | 40000 | 1.8 MB | polylines 452 KB (10000 coords) |
+| polygons-200x20 | polygons:4 region:1 | 0 | 16000 | 770 KB | polygons 192 KB (4000 coords) |
+| cluster-1k | markers:2 region:1 clusteringEnabled:1 | 2000 | 2000 | 177 KB | markers 88 KB (1000 coords) |
+| cluster-10k | markers:2 region:1 clusteringEnabled:1 | 20000 | 20000 | 1.7 MB | markers 885 KB (10000 coords) |
+| cluster-50k | markers:2 region:1 clusteringEnabled:1 | 100000 | 100000 | 8.6 MB | markers 4.3 MB (50000 coords) |
+| combined-10k-camera | markers:1 region:1 | 10000 | 10000 | 699 KB | markers 699 KB (10000 coords) |
+| combined-10k-cluster-camera | markers:1 region:1 clusteringEnabled:1 | 10000 | 10000 | 885 KB | markers 885 KB (10000 coords) |
+| combined-10k-updates | markers:26 region:1 | 260000 | 260000 | 17.8 MB | markers 699 KB (10000 coords) |
+| combined-10k-polyline | markers:1 polylines:4 region:1 | 10000 | 50000 | 2.4 MB | markers 699 KB (10000 coords) |
+| combined-10k-polygon | markers:1 polygons:4 region:1 | 10000 | 26000 | 1.4 MB | markers 699 KB (10000 coords) |
+| combined-all | markers:21 polylines:1 polygons:1 region:1 clusteringEnabled:1 | 210000 | 217000 | 18.5 MB | markers 886 KB (10000 coords) |
+| stability-5m | markers:54 region:1 clusteringEnabled:1 | 540000 | 540000 | 46.6 MB | markers 885 KB (10000 coords) |
+
+
+
+## Offline benchmarks
+
+### JS micro-benchmarks (bun 1.3, JavaScriptCore with JIT, Apple Silicon)
+
+Scaling only; Hermes on a phone has no JIT and does not sink temporary
+allocations, so absolute costs on device are higher and allocation counts
+are what the in-app Hermes counters report (1.8 MB per 10k-marker update).
+`results/baseline/js-bench/*.json`.
+
+| Operation | 1k | 10k | 100k | Exponent |
+| --- | ---: | ---: | ---: | ---: |
+| Fabric `deepDiffer`, new array of the same 10k objects (walks all) | 0.004 ms | 0.033 ms | 0.34 ms | 0.80 |
+| Fabric `deepDiffer`, first marker changed (early exit) | 0 | 0 | 0 | — |
+| `normalizeMarkerDescriptors`, one marker changed | 0.002 ms | 0.028 ms | 0.36 ms | 0.72 |
+| `React.createElement` × n `` + children collection (per render) | 0.33 ms | 4.2 ms | 39.7 ms | 1.02 |
+| Immutable 1 % marker mutation (app side) | 0.003 ms | 0.016 ms | 0.40 ms | 0.82 |
+| JSON size of the marker array (wire-equivalent) | 73 KB | 737 KB | 7.5 MB | 0.96 |
+| JSON size of a polyline (per point 45 B) | 45 KB | 448 KB | 4.5 MB | 1.00 |
+
+Takeaways: Fabric's deep diff on 10k markers is cheap and exits early on
+the first change; the JS-side work that scales is the children path
+(4 ms per render at 10k on JSC). The ~12–15 ms JS commit per 10k-marker
+update measured in-app is therefore dominated by Nitro's JSI parse and the
+allocation of a normalized copy, not by React or the diff.
+
+### Android pipeline on the JVM (`PipelineBenchmarkTest`, desktop JIT)
+
+`results/baseline/native/jvm-pipeline.jsonl`; medians, city viewport ≈ 148
+candidates at 10k / 2007 at 100k, country viewport = all markers.
+
+| Operation | 1k | 10k | 50k | 100k |
+| --- | ---: | ---: | ---: | ---: |
+| `markersFingerprint` (all markers, main thread on device) | 0.11 ms | 0.88 ms | 3.8 ms | 8.5 ms |
+| `MarkerSpatialIndex` build | 0.09 ms | 0.17 ms | 0.67 ms | 1.5 ms |
+| `clusters` at country zoom (all candidates) | 0.70 ms | 2.9 ms | 14.5 ms | 40.9 ms |
+| `clusters` at city zoom (visible candidates) | 0.03 ms | 0.16 ms | 0.37 ms | 0.39 ms |
+| `viewportFilter` at city zoom | 0.005 ms | 0.014 ms | 0.10 ms | 0.46 ms |
+| `ClusterElement.Single` for all (render versions) | 0.07 ms | 0.61 ms | 2.8 ms | 3.8 ms |
+
+Fingerprint and country-zoom clustering are linear in the dataset and run
+on every update / every refresh respectively; the viewport-limited paths
+are cheap. The iOS XCTest twin (`PipelineBenchmarkTests.swift`) needs the
+pod test spec in the example Podfile (see `benchmarks/native/README.md`)
+and was not run.
+
+## Top 10 bottlenecks
+
+Ranked by measured impact on the scenarios that hit them. "iOS" numbers are
+from the simulator baseline, "Android" from the emulator baseline; both are
+release builds with probes.
+
+### 1. Every marker update re-parses and re-normalizes the whole array on the JS thread
+
+- **Location:** `package/src/components/MapView.tsx` passes the full
+ `markers` array as one Nitro prop; `normalizeMarkerDescriptors.ts` maps
+ every descriptor to a fresh object on each change; Nitro's generated
+ `JSIConverter::fromJSI` reads 13 properties per marker
+ when the array reference changes (`HybridMapViewComponent.cpp`, JS thread).
+- **Evidence:** `mutations-10k` steps: JS commit 12.1 ms for `update-1`,
+ 12.9 ms for `update-100`, 9.3 ms for `update-100pct` on iOS; 17.2 / 16.7 /
+ 12.1 ms on Android. Empirical exponent vs. changed markers −0.01: the cost
+ does not depend on how many markers changed. Hermes reports ~1.8 MB (iOS)
+ / ~0.9–1.0 MB (Android) allocated per update (the normalized copies)
+ regardless of the change size. `mutations-continuous-10k`: 15.4 ms (iOS) /
+ 12.3 ms (Android) per 10 Hz update, JS-commit busy 12–15 %, 47–92 MB
+ allocated in 5 s; `cluster-50k`: a 1 % update costs a 49 ms (iOS) / 62 ms
+ (Android) commit.
+- **Measured cost:** ~12–15 ms of JS thread and ~1.8 MB of JS allocation per
+ update at 10k, on desktop-class CPUs; linear in total markers.
+- **Affected scenarios:** all `mutations-*`, `combined-10k-updates`,
+ `combined-all`, `stability-5m`, the update step of every `cluster-*`.
+- **Suspected cause:** the descriptor array is the unit of transfer; the
+ library has no way to express "these 100 changed", so React, Fabric, Nitro
+ and the native fingerprint each touch all n.
+- **Confidence:** high (direct measurement, consistent across platforms and
+ runs).
+- **Potential optimization:** an id-keyed delta path for updates (upsert /
+ remove batches, packed or as small arrays) alongside the bulk prop for the
+ initial set; skip `normalizeMarkerDescriptors` allocations when the
+ public and native descriptor shapes already match.
+- **Expected impact:** `update-1` from ~12–15 ms to well under 1 ms of JS
+ time and from 1.8 MB to a few KB allocated; continuous updates stop
+ competing with gestures on the JS thread.
+- **Risk:** medium — a new native entry point and ordering rules between
+ bulk sets and deltas; the mutation benchmark measures exactly this.
+
+### 2. Android: the full marker array is copied into Java objects on the UI thread for every update
+
+- **Location:** generated `JHybridMapViewSpec::setMarkers` →
+ `JMarkerDescriptor::fromCpp` (one `MarkerDescriptor` Java object plus
+ boxed `Double`/`Boolean` and `String` copies per marker), executed inside
+ Fabric's mount on the UI thread.
+- **Evidence:** commit → native setter latency in `mutations-10k` is
+ 13–16 ms per 10k update on Android versus 1.1–1.5 ms on iOS for the same
+ steps; polylines with 100k points 8.6–13.8 ms, 200 polygons 13.5 ms. The
+ Kotlin setter itself (`markers.set`) takes 1–2.4 ms, so the gap is the
+ bridge copy plus queue wait.
+- **Measured cost:** ~10–16 ms of UI-thread time per 10k-marker update
+ (emulator), before any map work starts.
+- **Affected scenarios:** every Android scenario that updates a large
+ overlay array: `mutations-*`, `combined-10k-updates`, `polyline-100k`,
+ `polygons-200x20`, `stability-5m`.
+- **Suspected cause:** JNI object marshalling of struct arrays; Nitro
+ creates the whole Java graph per prop change.
+- **Confidence:** medium-high (latency is measured from the commit end to
+ the setter start and includes the UI-thread queue; the iOS control run
+ shows that queue wait alone is ~1 ms).
+- **Potential optimization:** the delta path from #1 (10k → k objects), or
+ a packed `ArrayBuffer` for coordinates so JNI moves one buffer instead of
+ n objects.
+- **Expected impact:** 10–16 ms → < 1 ms of UI-thread time per update.
+- **Risk:** medium (same API surface as #1).
+
+### 3. Native re-fingerprints and re-indexes all markers on every update
+
+- **Location:** `MapOverlayController.setMarkers` → `markersFingerprint()`
+ (main thread, both platforms; Kotlin `renderSignature(vararg)` boxes ~20
+ values per marker), then `rebuildIndexAndRefresh` rebuilds
+ `MarkerSpatialIndex` from scratch (background).
+- **Evidence:** per 10k update: `markers.fingerprint` 0.66 ms (iOS) / 0.9–2.3
+ ms (Android) on the main thread, `markers.indexBuild` 1.0–1.8 ms (iOS) /
+ 0.3–0.9 ms (Android) in the background; at 50k the fingerprint is 3.8–6.5
+ ms per call. JVM benchmark: 8.5 ms per 100k fingerprint. In
+ `mutations-10k` the fingerprint alone totals ~55–60 ms on Android over 40
+ updates.
+- **Measured cost:** 1–2.4 ms main thread + 0.3–1.8 ms background per 10k
+ update; linear in n.
+- **Affected scenarios:** `mutations-*`, `combined-10k-updates`,
+ `stability-5m`, `cluster-*` update steps, mount of every scenario.
+- **Suspected cause:** change detection by hashing every field of every
+ marker; the index has no incremental update.
+- **Confidence:** high.
+- **Potential optimization:** identity from the delta protocol (#1) or from
+ object identity / a version counter; incremental index insert/remove by
+ id; hash off the main thread.
+- **Expected impact:** removes 1–6 ms of main-thread work per update and
+ the boxed-allocation churn on Android.
+- **Risk:** low.
+
+### 4. The Swift cluster engine is ~7× slower than the Kotlin one and linear in the dataset at country zoom
+
+- **Location:** `package/ios/MarkerClusterEngine.swift` `clusters(...)`:
+ `var bucket = buckets[key] ?? Bucket(); …; bucket.memberIds.append(id);
+ buckets[key] = bucket` copies the bucket (and its `memberIds` array, by
+ copy-on-write) out of and back into the dictionary for every marker, with
+ a `String` cell key per marker; `mergeOverlapping` is O(buckets²).
+- **Evidence:** `cluster-50k`: `markers.cluster` p95 144 ms, max 381 ms,
+ 3.6 s total over 86 refreshes on iOS versus p95 16–20 ms, max 29–51 ms on
+ the Android emulator for the same dataset (three runs); `cluster-10k`:
+ 7.7 ms vs 2.6–3.7 ms p95. CPU 65 % during `cluster-50k` on iOS.
+ Background thread, so frames stay near 60 fps, but cluster results lag
+ the camera and refreshes queue up.
+- **Measured cost:** up to 0.4 s per refresh at 50k on iOS.
+- **Affected scenarios:** `cluster-10k`, `cluster-50k`,
+ `combined-10k-cluster-camera`, `combined-all`, `stability-5m` (all iOS).
+- **Suspected cause:** copy-on-write bucket copies and string keys in the
+ bucketing loop; the quadratic merge is secondary at these bucket counts.
+- **Confidence:** high for the magnitude, medium for the exact split
+ between the two causes.
+- **Potential optimization:** index buckets by integer cell id into arrays
+ and append in place; compute `renderVersion` without sorting member ids
+ per cluster.
+- **Expected impact:** 5–7× faster clustering on iOS (to the Kotlin level).
+- **Risk:** low (pure function with unit tests; the JVM/XCTest benchmarks
+ measure it in isolation).
+
+### 5. Shape overlays are destroyed and re-created on every update, including style-only changes
+
+- **Location:** iOS `MapOverlayController.reconcileShapeOverlays` removes
+ and re-adds every overlay for every descriptor on each update (and calls
+ `makeStyle` twice per descriptor); Android `updatePolylines` /
+ `updatePolygons` `update = remove + addPolyline` with a full
+ `PolylineOptions` rebuild; iOS Google `updatePolyline` rebuilds the
+ `GMSPath` every time.
+- **Evidence:** `polygons-200x20`: `polygons.set` p95 46 ms per style-only
+ update on iOS (jank 2.5 %, p99 44 ms), 6–22 ms on Android across three
+ runs; `polylines-200x50`: p95 31–40 ms (iOS), 14 ms (Android);
+ `polyline-100k`: 16–24 ms per update on Android (100k `LatLng` objects
+ rebuilt), p99 50 ms on iOS with 148 MB JS allocated for 9 updates.
+- **Measured cost:** 14–46 ms of main-thread time per update of 200 shapes.
+- **Affected scenarios:** `polylines-200x50`, `polygons-200x20`,
+ `polyline-100k`, `combined-10k-polygon`, `combined-10k-polyline`.
+- **Suspected cause:** no per-shape change detection; geometry and style
+ are one unit.
+- **Confidence:** high.
+- **Potential optimization:** diff shapes by id with a version hash; apply
+ style changes to the existing renderer/overlay; rebuild geometry only when
+ coordinates changed.
+- **Expected impact:** style updates from tens of ms to ~0; geometry updates
+ bounded by the shapes that changed.
+- **Risk:** low.
+
+### 6. Zoom changes add and remove thousands of native markers on the main thread
+
+- **Location:** `MapOverlayController.applyDiff` (both platforms), MapKit
+ `mapView(_:viewFor:)` / `NitroPinAnnotationView.configure`, Google
+ `GoogleMap.addMarker` + `MarkerIconFactory.applyVisualProps` (which calls
+ `BitmapDescriptorFactory.defaultMarker()` per marker).
+- **Evidence:** `camera-zoom-in-10k`: `markers.applyDiff` 32 ms total /
+ p95 2.7 ms with 2032 `annotation.viewFor` calls on iOS (jank 3.8 %, p99
+ 41 ms); 36–66 ms total / p95 4.3–15.6 ms (three runs) with 2325
+ `marker.visualProps` calls on Android; `camera-rotate-10k` applyDiff p95
+ 15.2 ms and `cluster-50k` applyDiff p95 24 ms per refresh on Android.
+- **Measured cost:** up to 15–24 ms in a single main-thread diff apply
+ (Android emulator) — one to one and a half frames.
+- **Affected scenarios:** `camera-zoom-*`, `camera-rapid-*`, `cluster-*`,
+ `combined-*-cluster-camera`.
+- **Suspected cause:** the LOD cap (2000 markers at street zoom) turns an
+ octave change into up to 2000 adds and removes applied in one go;
+ per-marker icon/anchor work on Google Maps; entering animations.
+- **Confidence:** high.
+- **Potential optimization:** spread applies across frames with a budget;
+ reuse native marker objects; cache the default icon descriptor; LOD
+ hysteresis so small zoom changes do not flip the subset.
+- **Expected impact:** applyDiff p95 from ~11–16 ms to a few ms on Android;
+ fewer jank frames on zoom.
+- **Risk:** medium (visual churn trade-offs).
+
+### 7. The marker array is applied twice and fingerprinted three times at mount
+
+- **Location:** `HybridMapView.swift` sets the prop on the adapter and then
+ `installAdapter` → `syncState` sets it again; `AppleMapProviderAdapter.
+ notifyMapReadyIfNeeded` calls `overlayController.setMarkers` a third time;
+ Android `installAdapter/syncState` plus the prop setter apply it twice.
+- **Evidence:** load-phase probes in every iOS scenario show `markers.set`
+ count 2 and `markers.fingerprint` count 3 (`markers-50k`: 3 × 3.8–6.5 ms
+ on the main thread); Android shows 2 / 2.
+- **Measured cost:** 8–13 ms of extra main-thread hashing at mount for 50k.
+- **Affected scenarios:** every mount; visible in `load.native`.
+- **Confidence:** high.
+- **Potential optimization:** apply once after the adapter is installed;
+ skip the fingerprint when the same array reference is re-applied.
+- **Expected impact:** small per mount, but it also removes redundant
+ background index builds.
+- **Risk:** low.
+
+### 8. Mount cost is linear in marker count on both threads
+
+- **Location:** same path as #1 and #2 for the initial set.
+- **Evidence:** mount commit (JS) 0.6 → 2.9 → 12.7 → 41.9 ms for
+ 100 → 1k → 10k → 50k markers on iOS; 0.9 → 2.9 → 12.0 → 44.1 ms on Android
+ (`load.commitMs`); mount → `onMapReady` 60–250 ms on iOS, ~650–850 ms on
+ Android where Google Maps initialization dominates.
+- **Measured cost:** ~0.8–1.3 ms of JS per 1k markers at mount.
+- **Affected scenarios:** all `markers-*`, `camera-*-50k`, `cluster-50k`.
+- **Suspected cause:** 13 JSI property reads per marker plus the C++ and
+ Swift/JNI copies.
+- **Confidence:** high.
+- **Potential optimization:** a packed representation (typed arrays for
+ coordinates, ids as one string table) for the initial set.
+- **Expected impact:** 3–5× less JS time at mount for large sets.
+- **Risk:** medium (new input format).
+
+### 9. `` children are re-collected on every parent render
+
+- **Location:** `useCollectedOverlays` walks `React.Children` and rebuilds
+ the descriptor arrays whenever `children` changes identity, which is every
+ render of the parent.
+- **Evidence:** bun benchmark: element creation + collection 4.2 ms per
+ render at 10k, 40 ms at 100k (JIT; slower on Hermes); in-app
+ `markers-children-1k` mount commit 4.4 ms vs 2.9 ms for the bulk prop,
+ `mutations-1k-children` commit 4.8 ms per update vs 2.6 ms for the bulk
+ continuous scenario at the same size.
+- **Measured cost:** roughly 2× the bulk path at 1k; linear.
+- **Affected scenarios:** `markers-children-*`, `mutations-1k-children`.
+- **Confidence:** medium (the bulk and children scenarios differ slightly).
+- **Potential optimization:** memoize per-child descriptors by element
+ identity; document the bulk prop as the path for > 500 markers.
+- **Expected impact:** minor for the library; matters for apps that render
+ many `` children.
+- **Risk:** low.
+
+### 10. Memory grows by 60–200 MB during interaction and is mostly released at unmount
+
+- **Location:** not attributable to library code from these runs.
+- **Evidence:** `RAM Δ interaction` +75–200 MB on the iOS simulator for
+ every scenario including `markers-100`; `stability-5m` grows 420 → 481
+ MB over four minutes on iOS and 664 → 714 MB on Android, and retains
+ −135 MB (iOS) / −64 MB (Android) after unmount, i.e. the growth is
+ released; `camera-fast-pan-10k` retains 66 MB, `cluster-50k` 116 MB on
+ iOS, several scenarios retain negative amounts. Android PSS swings
+ −94 … +86 MB with GC timing. No FPS drift over 5 minutes on either
+ platform.
+- **Measured cost:** N/A as a library cost; growth tracks tile loading and
+ zoom levels.
+- **Affected scenarios:** all; most visible on zoom scenarios.
+- **Suspected cause:** map SDK tile and annotation caches sized for a
+ desktop host; the simulator does not reflect device memory pressure.
+- **Confidence:** low (needs a device and Instruments/Studio allocation
+ tracking).
+- **Potential optimization:** none in the library until a device run shows
+ library-owned growth; the `retainedAfterCleanupMB` metric is the trigger.
+- **Risk:** N/A.
+
+## Optimization backlog
+
+Ranked by impact × confidence ÷ complexity.
+
+| Priority | Opportunity | Bottlenecks | Impact | Confidence | Complexity |
+| --- | --- | --- | --- | --- | --- |
+| P0 | Id-keyed delta marker updates (upsert/remove batches) next to the bulk prop; native store keeps the full set | #1, #2, #3 | massive: O(n) → O(k) JS, bridge and native work per update | high | high |
+| P0 | Diff shape overlays by id + version; style changes without geometry rebuild | #5 | high for any app that restyles routes/areas | high | low |
+| P1 | Rewrite the Swift cluster bucketing loop in place (integer cell keys, no COW copies, no per-cluster sort) | #4 | high on iOS clustering (5–7×) | high | low |
+| P1 | Frame-budgeted / pooled marker apply on zoom; cache the default Google icon descriptor; LOD hysteresis | #6 | high on zoom jank | high | medium |
+| P1 | Apply the initial marker set once (drop the host/adapter double apply and the map-ready re-apply) | #7 | medium at mount, low elsewhere | high | low |
+| P2 | Incremental spatial index and cheaper change detection (no vararg boxing on Android) | #3 | medium per update | high | medium |
+| P2 | Packed initial transfer (typed arrays) for large sets | #8 | medium at mount | medium | high |
+| P2 | Skip `normalizeMarkerDescriptors` allocations when input already matches the native shape | #1 | medium (1.8 MB → 0 per update) | high | low |
+| P3 | Memoize children collection; document the bulk prop threshold | #9 | low | medium | low |
+| P3 | Device-side memory investigation with Instruments Allocations / Studio profiler | #10 | unknown | low | low |
+
+## What to optimize first
+
+**The id-keyed delta update path (P0, bottleneck #1 with #2 and #3).**
+
+- It is the largest measured cost in every update scenario on both
+ platforms, and it is the wrong complexity class: a one-marker change costs
+ the same as a full replacement (exponent −0.01 in `mutations-10k`), so
+ every app that moves markers pays 12–17 ms of JS (desktop-class CPU) plus
+ 13–16 ms of Android UI thread plus 1–6 ms of native hashing per update.
+- The other P0/P1 items each fix one scenario family; this one changes the
+ slope of the whole marker path, and #2/#3 largely disappear with it.
+- The lab measures it directly and unambiguously: `mutations-10k` steps
+ (JS commit, commit → native, setter, fingerprint, index build, JS
+ allocation per step and the scaling exponent), `mutations-continuous-10k`
+ (JS-commit busy ratio) and `stability-5m`. Success looks like `update-1`
+ under 1 ms of JS with kilobytes allocated and an exponent near 1 in the
+ number of changed markers.
+
+The two cheap follow-ups to run through the same loop immediately after are
+the shape-overlay diff (#5) and the Swift cluster loop (#4): both are local,
+low-risk, and have dedicated scenarios (`polygons-200x20`,
+`polylines-200x50`, `cluster-50k`).
+
+## Measurement gaps to close
+
+- **Physical devices.** Everything above is simulator/emulator. Run
+ `bun perf baseline --platform android --device ` on the Realme
+ (unlocked, on Wi-Fi) and on a 120 Hz Android and iPhone to get
+ representative numbers and 8.33 ms budgets.
+- **Real gestures.** The scripted camera moves use `animateCamera`; the
+ `camera-gesture-*` scenarios drive real touch input on Android through
+ the CLI and were not part of these baselines.
+- **Map surface frame rate on Android.** Google Maps renders on its own
+ surface; the lab sees the app window's Choreographer only.
+- **iOS allocation churn** needs Instruments; the lab reports retained
+ malloc blocks only.
+- **The iOS pipeline XCTest** needs the pod test spec in the Podfile.
diff --git a/performance/README.md b/performance/README.md
new file mode 100644
index 0000000..b9bb12d
--- /dev/null
+++ b/performance/README.md
@@ -0,0 +1,398 @@
+# Performance Lab
+
+A reproducible environment for measuring `react-native-better-maps`: fixed
+workloads, native frame and memory instrumentation, compile-time timing
+probes inside the library, a CLI that runs scenarios on a device and stores
+structured results, and a comparison/regression step. It measures; it does
+not optimize. Findings live in [PERFORMANCE.md](./PERFORMANCE.md).
+
+## Layout
+
+```text
+performance/
+├── README.md this file
+├── PERFORMANCE.md scorecard, bottlenecks, optimization backlog
+├── perf.config.ts suites, regression thresholds, frame budget rules
+├── fixtures/ deterministic data generators (seeded PRNG, pinned hashes)
+├── scenarios/ workload definitions: markers, camera, mutations, geometry,
+│ clustering, combined, stability
+├── app/ the in-app runner (PerfLabApp, MapHost, metrics, result schema)
+├── benchmarks/ JS micro-benchmarks (bun) and native unit-benchmark notes
+├── scripts/ `bun perf` CLI, build scripts
+└── results/ baseline/ (committed), runs/ and bench/ (local)
+```
+
+Native pieces that belong to the lab but must live elsewhere:
+
+- `example/modules/perf-lab/` — a local Expo module: `CADisplayLink` /
+ `Choreographer` + `FrameMetrics` frame recorder, memory, CPU, thermal and
+ battery readouts, probe drain, result files, system-log lines.
+- `package/ios/PerfProbe.swift`, `package/android/.../PerfProbe.kt` — the
+ library's timing probes. Compiled in only for profile builds (see below).
+
+## Architecture under test
+
+Verified from the code, not assumed:
+
+```text
+JS (React) or children
+ │ MapView.tsx collects children (useCollectedOverlays) or
+ │ normalizes the bulk prop (normalizeMarkerDescriptors)
+ ▼
+React Native Fabric diffProperties → deepDiffer on every object/array prop
+ │ (JS thread, per commit)
+ ▼
+Nitro / JSI HybridMapViewProps parses RawProps: JSIConverter
+ │ reads 13 properties per marker into C++ structs
+ │ (JS thread, inside the React commit; skipped when the
+ │ JS array reference is unchanged — CachedProp)
+ ▼
+Mount (UI thread) Android: C++ → JNI, one Java MarkerDescriptor + boxed
+ │ fields per marker; iOS: std::vector → Swift [MarkerDescriptor]
+ ▼
+Kotlin / Swift HybridMapView → provider adapter → overlay controller:
+ │ fingerprint (hash all markers) → spatial index (background)
+ │ → viewport filter or grid clustering (background)
+ │ → render diff → apply on the main thread
+ ▼
+Map SDK Google Maps (Android, iOS opt-in) / MapKit (iOS):
+ │ addMarker / MKAnnotationView, polylines, polygons
+ ▼
+Rendering / GPU SDK-owned; observed through frame intervals only
+```
+
+There is no library C++ beyond the generated Nitro bindings (`package/cpp` is
+empty), so "C++ time" in this lab means Nitro's JSI conversion (measured
+inside the JS commit) and the mount-time copy (measured as commit → native
+setter latency).
+
+## Build variants
+
+| Variant | Native | JS bundle | Probes | Use for |
+| ------- | --------------------------- | ---------------------------- | -------- | ----------------------------------------- |
+| DEBUG | debuggable, no optimization | Metro dev bundle (`__DEV__`) | optional | checking that the harness works |
+| RELEASE | optimized | production bundle | off | shipping; also the cleanest frame numbers |
+| PROFILE | optimized | production bundle | on | every number in PERFORMANCE.md |
+
+Results record `build.type`, `build.jsDev`, `build.perfProbes`,
+`build.hermes` and `build.representative` (true only for release native +
+production JS on a physical device). Simulator and debug numbers are labelled
+NOT production-representative in every table and must be treated that way.
+
+The lab UI is compiled into the example app only when `EXPO_PUBLIC_PERF_LAB=1`
+is set at bundle time; the demo app is unchanged otherwise. Probes are
+compiled into the library only with `-PNitroMaps_perfProbes=true` (Android)
+or `"betterMaps.perfProbes": "true"` in `example/ios/Podfile.properties.json`
+(iOS, adds `-DNITROMAPS_PERF_PROBES`). Without them every probe call site is
+an inlined no-op / a folded constant check; release builds carry nothing.
+
+## How to run
+
+### 1. Build and install
+
+```bash
+bun install
+bun perf build android --install # release + probes, arm64, installs on the adb device
+bun perf build ios --install # release + probes for the booted simulator
+```
+
+`--debug` builds the debug variant, `--no-probes` a plain release. The
+scripts run `nitrogen`, `expo prebuild` (if needed), Gradle / `pod install`
+
+- `xcodebuild`. On this machine Gradle needs a JDK 17 (`JAVA_HOME`) and
+ CocoaPods a UTF-8 locale; both are exported by the scripts.
+
+For a physical iPhone: open `example/ios/NitroMapsExample.xcworkspace` in
+Xcode launched from a shell with `EXPO_PUBLIC_PERF_LAB=1`, pick the Release
+build configuration and run on the device. Results then come through the
+share sheet or the app's Documents folder (file sharing is enabled).
+
+### 2. Pick and run scenarios
+
+```bash
+bun perf list # every scenario with group, tags, duration
+bun perf devices # adb devices + booted simulators
+bun perf run markers-10k # one scenario
+bun perf run markers camera # whole groups
+bun perf run 'camera-fast-pan-*' # prefix
+bun perf run --suite quick # suites: quick, baseline, full,
+bun perf run mutations-10k --repeat 3 --label "before-fix"
+bun perf run camera-gesture-pan-10k # Android: the CLI drives adb swipes
+bun perf baseline # suite "baseline", stored under results/baseline
+```
+
+The CLI opens `nitromapsperf://run?…` on the device, follows the system log
+(`adb logcat -s NitroMapsPerfLab` / `log stream --predicate 'subsystem ==
+"com.nitromaps.perflab"'`), prints one line per finished scenario, pulls the
+run file and writes `results/runs/--/` with
+`run.json`, one JSON per scenario and `summary.md`.
+
+Runs can also be started from the lab UI (tap scenarios, Run / Quick /
+Baseline) and, for real gestures, with Mount → Record → gesture → Stop.
+Every result line the app prints starts with `[perf-lab]`.
+
+### 3. Compare and check
+
+```bash
+bun perf compare # latest run vs. the matching baseline
+bun perf compare results/baseline/android/ results/runs/ --detail
+bun perf check # thresholds from perf.config.ts, warn only
+bun perf check --fail # exit 1 on a regression (for CI, once stable)
+bun perf report results/runs/ # Markdown scorecard + step/timeline tables
+bun perf report --digest --transfer # + per-scenario evidence and JS → native transfer tables
+bun perf evidence # JSON with the numbers PERFORMANCE.md cites
+bun perf scorecard --write # regenerate the results section of PERFORMANCE.md from results/baseline
+```
+
+### 4. Offline benchmarks
+
+```bash
+bun perf bench # JS micro-benchmarks → results/bench/*.json
+bun perf fixtures # fixture determinism (pinned hashes)
+```
+
+Native pipeline micro-benchmarks (JVM / XCTest) are described in
+[benchmarks/native/README.md](./benchmarks/native/README.md).
+
+## What is measured
+
+| Area | Metric | How | Where |
+| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ | -------------------------- |
+| Frames | intervals between display callbacks; p50/p90/p95/p99/worst; jank (> 1.5× the interval the display ran at); dropped slots; frames > 50 ms; per-second FPS and its p95/p99 ("bad seconds"); histogram | `CADisplayLink` (opted into 120 Hz) / `Choreographer` on the main thread | `example/modules/perf-lab` |
+| Frames (Android) | `FrameMetrics`: UI-thread phases (input, animation, layout, draw), sync, command issue, swap, GPU; missed deadlines | window `OnFrameMetricsAvailableListener` | same |
+| JS thread | JS lag p50/p95/p99/max, busy ratio, long tasks (`PerformanceObserver` `longtask` when the runtime reports it). iOS: gap between `requestAnimationFrame` callbacks minus the frame interval (`lagSource: animation-frame`). Android: delay of a native ping posted to the JS message queue every 8 ms (`lagSource: js-queue-ping`) | `requestAnimationFrame` / `ReactContext.runOnJSQueueThread` | `app/metrics/jsThread.ts`, `example/modules/perf-lab` |
+| JS commits | per `setProps`: setState → layout effect (React render + Fabric shadow commit + Nitro prop parsing) | `MapHost` | `app/MapHost.tsx` |
+| Bridge | commit end → native `*.set` span start (mount scheduling + C++→Swift/JNI copy); setter duration | clock-aligned probe spans | `app/runner.ts` |
+| Native | spans: `markers.set`, `markers.fingerprint`, `markers.indexBuild`, `markers.candidates`, `markers.viewportFilter`, `markers.cluster`, `markers.diff`, `markers.applyDiff` / `applySync`, `marker.visualProps` (Android), `annotation.viewFor` / `didAdd` (MapKit), `polylines.set`, `polygons.set`, `circles.set`, `camera.apply`, `region.apply`; each with thread, count and payload size | `PerfProbe` (also `os_signpost` / `android.os.Trace`) | library, profile builds |
+| Memory | footprint (`phys_footprint` / PSS), resident; Android Java heap, native heap, ART GC count/time/bytes allocated; iOS malloc blocks/bytes in use; at before / after load / after interaction / after cleanup, plus checkpoints | native module | `app/metrics/memory.ts` |
+| Allocations (JS) | Hermes `getInstrumentedStats`: bytes allocated, GC count/time, heap size (when the engine exposes them) | `HermesInternal` | `app/metrics/hermes.ts` |
+| CPU | process CPU time over wall time, thread count, thermal state, battery, low-power mode | `getrusage` / `Process.getElapsedCpuTime` | native module |
+| Transfer | prop updates per key, items / coordinates / estimated bytes per update, events received from native | `TransferTracker` | `app/metrics/transfer.ts` |
+| Load | mount commit time, mount → `onMapReady`, native spans during load | runner | `app/runner.ts` |
+
+Everything that could not be measured is `null` in the JSON and `N/A` in the
+tables. Nothing is estimated.
+
+### Limits (be honest about them)
+
+- **JS commit time includes JSI conversion but cannot split it from React.**
+ The JSI object → C++ struct parse happens inside the React commit on the
+ JS thread. The lab reports the whole commit and, separately, the modeled
+ cost of Fabric's `deepDiffer` and of the library's normalization (offline
+ benchmarks), so the remainder is attributable to React + Nitro parsing.
+- **Bridge copy time is a latency, not a duration.** commit → setter latency
+ contains the UI-thread queue wait; a busy UI thread inflates it.
+- **Android `FrameMetrics` only covers the app window.** Google Maps draws
+ on its own surface, so the window reports a frame only when React Native
+ re-renders; during a pure camera move it sees one frame. The Choreographer
+ intervals remain the main-thread signal (they catch Fabric mounts, marker
+ adds and the JNI copy), but the map's own render rate is not observable
+ from inside the app. `adb shell dumpsys SurfaceFlinger --latency `
+ exposes the map surface's last 128 frame timestamps if that is ever needed.
+- **iOS allocation churn is not counted.** `malloc_zone_statistics` gives
+ blocks in use (retained), not allocation rate; use Instruments
+ (Allocations) for churn — workflow below.
+- **Simulator and emulator memory numbers include map tile caches** that the
+ SDKs size for a desktop-class host; treat `RAM Δ interaction` as a trend
+ across scenarios, not as an absolute cost, until a device baseline exists.
+- **JS micro-benchmarks run on bun (JavaScriptCore with a JIT)**; they show
+ algorithmic scaling and relative cost, not Hermes-on-a-phone cost.
+- **Gestures on iOS need a finger or Maestro.** The CLI drives `adb shell
+input swipe` on Android only, and adb cannot pinch.
+- **Scripted camera moves use `animateCamera`.** On MapKit and Android that
+ exercises the same native path as a gesture; on the iOS Google provider
+ the live marker refresh only runs for real gestures.
+- **Long-task entries** depend on the React Native version exposing them;
+ otherwise long tasks are derived from lag samples > 50 ms and labelled so.
+- **JS lag is measured differently per platform.** On iOS it is the gap
+ between `requestAnimationFrame` callbacks minus the frame interval (zero
+ while idle; JS work shorter than a frame is invisible to it). On Android
+ React Native dispatches timers and animation frames from the UI thread's
+ Choreographer and skips a vsync now and then even when idle (a
+ timer-based sampler reads ~18 ms late at rest), so the lab pings the JS
+ message queue from a native thread every 8 ms instead and reports how
+ long each ping waited. The `camera-idle-*` scenarios show each floor, and
+ `JS commit busy` (commit time over duration) is reported for both.
+- **A locked or sleeping Android device stalls the run.** The activity is
+ paused and React Native pauses JS timers with it. `bun perf run` wakes the
+ screen, keeps it on and refuses to start while a secure lock screen is
+ showing; unlock the phone by hand first. It also warns when the device has
+ no network (map tiles will not load, `onMapReady` can time out).
+
+## Deterministic workloads
+
+Every fixture comes from `fixtures/` with an explicit seed (default
+`12345`) through `mulberry32`; `Math.random` is never used. Markers are
+Gaussian blobs around Polish cities weighted by population plus 12 % rural
+scatter (Warsaw is the densest hotspot), polylines are smooth random walks,
+polygons are star-shaped rings with harmonic radius noise. Coordinates are
+rounded to 6 decimals so JSON output is byte-stable.
+`bun perf fixtures` checks pinned hashes of the generated data; change them
+only together with a fresh baseline and a note in PERFORMANCE.md.
+
+## Scenarios
+
+`bun perf list` is the source of truth. Groups:
+
+- **markers** — 100, 1k, 10k, 50k, 100k (heavy) through the bulk prop;
+ 1k and 10k as `` children; 10k with titles + visual props.
+- **camera** — idle, slow pan, fast pan, continuous pan, zoom in/out,
+ rapid zoom, rotate, pitch, rapid flicks × 0 / 1k / 10k / 50k markers,
+ plus real-gesture pan and zoom windows.
+- **mutations** — the marker update benchmark at 10k (add 1, remove 1,
+ update 1 / 10 / 100 / 1 % / 10 % / 100 %, five repeats each, as steps),
+ the same through children at 1k, continuous 10 Hz updates at 1k and 10k.
+- **geometry** — polyline 100 / 1k / 10k / 100k points, polygon 100 / 1k /
+ 10k vertices (restyle + geometry updates + pan), 200 × 50-point polylines,
+ 200 × 20-vertex polygons.
+- **clustering** — 1k / 10k / 50k / 100k clusterable markers: zoom sweep,
+ wide pan, 1 % update; `markers.cluster` spans separate compute from apply.
+- **combined** — 10k + camera, 10k + clustering + camera, 10k + updates
+ while panning, 10k + 10k-point polyline, 10k + 200 polygons, everything.
+- **stability** — 5 and 15 minutes of pan / zoom / 1 % updates over 10k
+ clustered markers with a checkpoint every minute (FPS, memory, CPU, GC).
+
+## Results format
+
+One `ScenarioResult` per scenario (schema in `app/result.ts`):
+
+```jsonc
+{
+ "scenario": "camera-fast-pan-10k", "platform": "android", "provider": "google",
+ "device": { "model": "RMX3081", "osVersion": "13", "refreshRateHz": 60, "isSimulator": false, … },
+ "build": { "type": "release", "jsDev": false, "hermes": true, "perfProbes": true, "representative": true, "caveats": [] },
+ "refreshRateHz": 60, "frameBudgetMs": 16.67, "durationMs": 5100,
+ "load": { "commitMs": 63.2, "readyMs": 1840, "native": { "byName": { "markers.set": {…} } }, "bridge": {…} },
+ "frames": { "fps": { "average": 58.1, "p95": 41.0, "p99": 33.0 }, "frameTimeMs": { "p50": 16.7, "p95": 33.4, "p99": 66.7, "worst": 133.4, "histogram": {…} }, "jankRatio": 0.04, "longFrames": 3, "android": { "phaseSharePct": {…} } },
+ "js": { "lagSource": "js-queue-ping", "lagMs": { "p95": 2.1 }, "busyRatio": 0.03, "longTasks": {…}, "commits": { "count": 0 } },
+ "bridge": { "commitToNativeMs": null, "setterMs": null },
+ "native": { "available": true, "mainThreadMs": 412.5, "backgroundMs": 96.0, "byName": { "markers.applyDiff": { "count": 9, "totalMs": 380.2, "p95Ms": 61.1, "maxMs": 71.0, "items": 2860 } } },
+ "memory": { "beforeMB": 180, "afterLoadMB": 231, "afterInteractionMB": 238, "afterCleanupMB": 205, "peakMB": 238, "retainedAfterCleanupMB": 25 },
+ "allocations": { "hermes": { "allocatedBytes": 1200000, "gcCount": 2 }, "android": { "javaBytesAllocated": 91000000, "gcCount": 4 } },
+ "cpu": { "processCpuMs": 3900, "wallMs": 5100, "percent": 76, "thermalBefore": "none", "thermalAfter": "none" },
+ "transfer": { "updates": {}, "payload": {}, "eventsToJs": { "onRegionChange": 0 } },
+ "steps": [], "timeline": [], "metrics": {}, "notes": [], "errors": []
+}
+```
+
+Values above are illustrative of the shape only; real numbers are in
+`results/baseline` and PERFORMANCE.md.
+
+## Regression detection
+
+`bun perf check` compares the latest run with the baseline recorded on the
+same platform, device and build variant and applies `REGRESSION_THRESHOLDS`
+from `perf.config.ts`:
+
+| Metric | Threshold |
+| --------------------- | ----------------------------- |
+| FPS average | drop > 5 % |
+| Frame p95 | increase > 5 % |
+| Frame p99 | increase > 10 % |
+| RAM after interaction | increase > 10 % |
+| JS commit average | increase > 10 % |
+| Native setter average | increase > 10 % |
+| Jank ratio | increase > 1 percentage point |
+
+Metrics that are N/A on either side are skipped and listed, never counted.
+`check` warns by default and only fails with `--fail`: device runs on a
+loaded host vary by several percent run to run, and the baseline has not yet
+been shown stable across repeated runs. The recommended path to CI gating:
+
+1. Record the baseline three times on the reference device; keep the median
+ run. Widen a threshold if the spread between the three exceeds it.
+2. Run `bun perf run --suite quick` on each candidate branch, then
+ `bun perf check --fail`.
+3. Only then wire the same two commands into a self-hosted job with the
+ device attached. Do not gate on simulator/emulator numbers.
+
+## Device matrix
+
+Recommended reference devices (record one baseline per row):
+
+| Platform | Class | Requirement | Why |
+| -------- | --------------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| Android | modern flagship | 120 Hz display, Android 13+ | shows whether the 8.33 ms budget is met; adaptive refresh is tracked per frame |
+| Android | mid-range | 60 Hz, 4–6 GB RAM (the Realme RMX3081 in this repo's baseline) | representative of most users; memory pressure shows first here |
+| iOS | modern iPhone | ProMotion (120 Hz), iOS 17+ | MapKit at 120 Hz; needs `CADisableMinimumFrameDurationOnPhone` (set in app.json) |
+| iOS | older iPhone | 60 Hz | MapKit annotation view cost at 60 Hz |
+
+Before a baseline, check and record (the result file does most of this):
+
+- release native build, production JS bundle (`build.type`, `build.jsDev`);
+- Hermes on (`build.hermes`), dev menu and remote debugging off (implied by
+ a release build; never run baselines from Metro);
+- thermal state `nominal`/`none` (`cpu.thermalBefore`), battery > 50 % and
+ charging (`cpu.batteryLevel`, `cpu.batteryState`), low-power mode off;
+- screen refresh rate (`device.refreshRateHz`, `device.supportedRefreshRatesHz`)
+ and whether the OS is throttling it (some Android devices drop to 60 Hz
+ when hot or on battery saver);
+- no other apps running; host load matters for emulators and simulators.
+
+## Profiling workflows
+
+The lab tells you _where_ time goes at the granularity of its probes; the
+platform profilers tell you _why_. All of these attach to the PROFILE build.
+
+### JS
+
+- **Hermes sampling profiler**: dev menu → "Enable Sampling Profiler" in a
+ debug build, or `HermesInternal.enableSamplingProfiler()`; open the trace
+ in `chrome://tracing`. Use a debug build only to find _which_ JS function
+ is hot, then confirm the cost in a release build with the lab's commit
+ timings.
+- **React DevTools profiler** for re-render counts of `MapView` (the
+ children-based scenarios re-collect on every parent render).
+- **Long tasks**: `js.longTasks` in results; the source field says whether
+ the runtime reported them or the lag sampler inferred them.
+
+### Android
+
+- **Perfetto / Android Studio system trace**: the probes emit
+ `android.os.Trace` sections named `NitroMaps.`; record with
+ `python3 record_android_trace -a com.nitromaps.example sched freq gfx view`
+ (Perfetto's helper) or Studio's CPU profiler in "System Trace" mode, then
+ look at the main thread around `NitroMaps.markers.applyDiff` and the
+ `RenderThread` / GPU completion.
+- **Android Studio Profiler → Memory**: record allocations during
+ `mutations-10k`; sort by allocation count; expect
+ `MarkerDescriptor`, boxed `Double`/`Boolean`, `String` (JNI copies) and
+ `Object[]` (vararg `renderSignature`) to dominate. `allocations.android`
+ in the result gives the totals to compare against.
+- **GPU**: `adb shell dumpsys gfxinfo com.nitromaps.example framestats` after
+ a scenario for the SDK's own render-thread numbers; the `frames.android`
+ phase shares in the result come from the same `FrameMetrics` source.
+- **Memory over time**: `adb shell dumpsys meminfo com.nitromaps.example`
+ between scenarios; the lab's PSS snapshots are the same number.
+
+### iOS
+
+- **Instruments → Time Profiler** on the simulator or a device: the probes
+ appear in the **Points of Interest** track (subsystem `com.nitromaps`,
+ category `Pipeline`), so the call tree can be filtered to the interval
+ of one `markers.applyDiff` or `markers.cluster`.
+- **Instruments → Allocations** with "Record reference counts" off and
+ "Allocation type: All heap & anonymous VM": run `mutations-10k`, mark
+ generations between steps; expect `std::string` copies from
+ `MarkerDescriptor` struct copies, `MapMarkerAnnotation`,
+ `MKMarkerAnnotationView` and `Hasher` temporaries.
+- **Instruments → Leaks** after `markers-10k` unmounts; the lab's
+ `memory.retainedAfterCleanupMB` says how much to look for.
+- **Instruments → Energy Log / Thermal State** for the 15-minute stability
+ run on a device; `cpu.thermalBefore/After` in the timeline windows records
+ the OS thermal state the lab saw.
+- **Core Animation FPS** in Instruments cross-checks the display-link
+ intervals; MapKit renders on its own threads, so a 120 Hz display link
+ with 60 Hz map tiles is normal at rest.
+
+## Keeping the harness out of production
+
+- The lab UI ships only with `EXPO_PUBLIC_PERF_LAB=1` (inlined at bundle
+ time; `example/index.js` requires the demo app otherwise).
+- Probes compile only with the Gradle property / Podfile property; the
+ no-op variants are empty inline functions (Swift) or a folded constant
+ check (Kotlin). Release builds without the flag contain no signposts, no
+ trace sections and no recording buffers.
+- The `perf-lab` Expo module lives in the example app and is not part of
+ the published package (`package/package.json` `files` is unchanged).
+- Nothing in `package/src` imports from `performance/`.
diff --git a/performance/app/MapHost.tsx b/performance/app/MapHost.tsx
new file mode 100644
index 0000000..f42a033
--- /dev/null
+++ b/performance/app/MapHost.tsx
@@ -0,0 +1,180 @@
+import {
+ forwardRef,
+ useCallback,
+ useImperativeHandle,
+ useLayoutEffect,
+ useRef,
+ useState,
+} from 'react';
+import { StyleSheet, View } from 'react-native';
+import {
+ MapView,
+ Marker,
+ type MapProvider,
+ type MapViewProps,
+ type MapViewRef,
+} from 'react-native-better-maps';
+import type { CommitSample, PerfMapProps } from '../scenarios/types';
+import type { MapHostApi, MountResult } from './runner';
+
+interface HostState {
+ key: number;
+ props: PerfMapProps | null;
+ provider: MapProvider;
+}
+
+interface PendingCommit {
+ startedAt: number;
+ resolve(sample: CommitSample): void;
+}
+
+const READY_TIMEOUT_MS = 20_000;
+
+/**
+ * Owns the `MapView` the runner drives. Every state update resolves with a
+ * `CommitSample` measured from `setState` to the layout effect after the
+ * commit, which on the JS thread covers React's render, the Fabric shadow
+ * tree commit and Nitro's prop parsing (the JSI object → C++ struct
+ * conversion of every descriptor array that changed).
+ */
+export const MapHost = forwardRef(
+ function MapHost({ initialProvider }, ref) {
+ const [state, setState] = useState({
+ key: 0,
+ props: null,
+ provider: initialProvider,
+ });
+ const stateRef = useRef(state);
+ stateRef.current = state;
+ const mapRef = useRef(null);
+ const pendingCommit = useRef(null);
+ const readyWaiter = useRef<(() => void) | null>(null);
+ const eventCounts = useRef>({});
+
+ useLayoutEffect(() => {
+ const pending = pendingCommit.current;
+ if (pending != null) {
+ pendingCommit.current = null;
+ const now = performance.now();
+ pending.resolve({
+ label: '',
+ commitMs: now - pending.startedAt,
+ committedAt: now,
+ });
+ }
+ }, [state]);
+
+ const commit = useCallback((update: (current: HostState) => HostState) => {
+ return new Promise((resolve) => {
+ pendingCommit.current = { startedAt: performance.now(), resolve };
+ setState(update);
+ });
+ }, []);
+
+ const count = useCallback((name: string) => {
+ eventCounts.current[name] = (eventCounts.current[name] ?? 0) + 1;
+ }, []);
+
+ useImperativeHandle(
+ ref,
+ () => ({
+ async mount(props, provider): Promise {
+ const mountedAt = performance.now();
+ const ready = new Promise((resolve) => {
+ const timeout = setTimeout(() => resolve(true), READY_TIMEOUT_MS);
+ readyWaiter.current = () => {
+ clearTimeout(timeout);
+ resolve(false);
+ };
+ });
+ const sample = await commit((current) => ({
+ key: current.key + 1,
+ props,
+ provider: provider as MapProvider,
+ }));
+ const timedOut = await ready;
+ return {
+ commitMs: sample.commitMs,
+ readyMs: performance.now() - mountedAt,
+ timedOut,
+ };
+ },
+ setProps(patch) {
+ return commit((current) => ({
+ ...current,
+ props:
+ current.props == null
+ ? current.props
+ : { ...current.props, ...patch },
+ }));
+ },
+ async unmount() {
+ readyWaiter.current = null;
+ if (stateRef.current.props == null) {
+ return;
+ }
+ await commit((current) => ({ ...current, props: null }));
+ },
+ map: () => mapRef.current,
+ takeEventCounts() {
+ const counts = eventCounts.current;
+ eventCounts.current = {};
+ return counts;
+ },
+ }),
+ [commit],
+ );
+
+ const onMapReady = useCallback(() => {
+ count('onMapReady');
+ readyWaiter.current?.();
+ readyWaiter.current = null;
+ }, [count]);
+ const onRegionChange = useCallback(() => count('onRegionChange'), [count]);
+ const onRegionChangeComplete = useCallback(
+ () => count('onRegionChangeComplete'),
+ [count],
+ );
+ const onMarkerPress = useCallback(() => count('onMarkerPress'), [count]);
+
+ const { props, provider, key } = state;
+ if (props == null) {
+ return ;
+ }
+
+ const mapProps = {
+ provider,
+ region: props.region,
+ markers: props.markers,
+ polylines: props.polylines,
+ polygons: props.polygons,
+ circles: props.circles,
+ clusteringEnabled: props.clusteringEnabled,
+ markerEnteringAnimation: props.markerEnteringAnimation,
+ onMapReady,
+ onRegionChange,
+ onRegionChangeComplete,
+ onMarkerPress,
+ } as MapViewProps;
+
+ return (
+
+
+ {props.markerChildren?.map((marker) => (
+
+ ))}
+
+
+ );
+ },
+);
+
+const styles = StyleSheet.create({
+ fill: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 },
+});
diff --git a/performance/app/PerfLabApp.tsx b/performance/app/PerfLabApp.tsx
new file mode 100644
index 0000000..f9236c2
--- /dev/null
+++ b/performance/app/PerfLabApp.tsx
@@ -0,0 +1,600 @@
+import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+import {
+ Linking,
+ Platform,
+ Pressable,
+ ScrollView,
+ Share,
+ StyleSheet,
+ Text,
+ View,
+} from 'react-native';
+import { useSafeAreaInsets } from 'react-native-safe-area-context';
+import type { MapProvider } from 'react-native-better-maps';
+import {
+ deviceInfo,
+ launchRequest,
+ memorySnapshot,
+ probesAvailable,
+ startFrameRecording,
+ stopFrameRecording,
+ type DeviceInfo,
+} from '../../example/modules/perf-lab';
+import { SUITES } from '../perf.config';
+import {
+ SCENARIOS,
+ resolveScenarios,
+ type Scenario,
+ type ScenarioGroup,
+} from '../scenarios';
+import { MapHost } from './MapHost';
+import { makeRunId, parseRunUrl, type RunRequest } from './deepLink';
+import { computeFrameSummary } from './metrics/frameStats';
+import { isHermes } from './metrics/hermes';
+import {
+ startJsThreadRecorder,
+ type JsThreadRecorder,
+} from './metrics/jsThread';
+import { toMB } from './metrics/memory';
+import { emit, publishRunFile, publishScenarioResult } from './publish';
+import type { BuildInfo, RunFile, ScenarioResult } from './result';
+import { runScenario, type MapHostApi } from './runner';
+
+const PLATFORM: 'ios' | 'android' = Platform.OS === 'ios' ? 'ios' : 'android';
+const PROVIDERS: MapProvider[] =
+ Platform.OS === 'ios' ? ['apple', 'google'] : ['google'];
+const GROUPS: ScenarioGroup[] = [
+ 'markers',
+ 'camera',
+ 'mutations',
+ 'geometry',
+ 'clustering',
+ 'combined',
+ 'stability',
+];
+
+function makeBuildInfo(device: DeviceInfo): BuildInfo {
+ const caveats: string[] = [];
+ if (device.isDebugBuild) {
+ caveats.push(
+ 'debug native build: no compiler optimizations, debug checks enabled',
+ );
+ }
+ if (__DEV__) {
+ caveats.push(
+ 'development JS bundle: dev-mode React checks and Metro overhead',
+ );
+ }
+ if (device.isSimulator) {
+ caveats.push(
+ 'simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement',
+ );
+ }
+ const perfProbes = probesAvailable();
+ if (!perfProbes) {
+ caveats.push(
+ 'library built without PerfProbe: native and bridge sections are N/A',
+ );
+ }
+ return {
+ type: device.isDebugBuild ? 'debug' : 'release',
+ jsDev: __DEV__,
+ hermes: isHermes(),
+ perfProbes,
+ representative: !device.isDebugBuild && !__DEV__ && !device.isSimulator,
+ caveats,
+ };
+}
+
+interface ManualRecording {
+ js: JsThreadRecorder;
+ beforeBytes: number;
+ startedAt: number;
+}
+
+/**
+ * Performance lab screen. Enabled with `EXPO_PUBLIC_PERF_LAB=1`; the demo app
+ * is untouched otherwise. Runs are started from the buttons or from a deep
+ * link (`nitromapsperf://run?scenarios=…`), which is how `bun perf run`
+ * drives it. Results go to the system log and a result file the CLI pulls.
+ */
+export default function PerfLabApp() {
+ const insets = useSafeAreaInsets();
+ const hostRef = useRef(null);
+ const runningRef = useRef(false);
+ const pendingRequest = useRef(null);
+ const manual = useRef(null);
+ const [device, setDevice] = useState(null);
+ const [build, setBuild] = useState(null);
+ const [provider, setProvider] = useState(PROVIDERS[0]);
+ const [group, setGroup] = useState('markers');
+ const [selected, setSelected] = useState>(
+ new Set(['markers-10k']),
+ );
+ const [running, setRunning] = useState(false);
+ const [recording, setRecording] = useState(false);
+ const [status, setStatus] = useState('Idle');
+ const [lines, setLines] = useState([]);
+ const [lastRun, setLastRun] = useState(null);
+
+ useEffect(() => {
+ deviceInfo()
+ .then((info) => {
+ setDevice(info);
+ setBuild(makeBuildInfo(info));
+ })
+ .catch((error) => setStatus(`deviceInfo failed: ${String(error)}`));
+ }, []);
+
+ const appendLine = useCallback((line: string) => {
+ setLines((current) => [...current.slice(-40), line]);
+ }, []);
+
+ const runRequest = useCallback(
+ async (request: RunRequest) => {
+ const host = hostRef.current;
+ if (host == null || device == null || build == null) {
+ pendingRequest.current = request;
+ return;
+ }
+ if (runningRef.current) {
+ await emit({ event: 'busy', runId: request.runId ?? null });
+ return;
+ }
+ let scenarios: Scenario[];
+ try {
+ const selectors =
+ request.suite != null ? SUITES[request.suite] : request.scenarios;
+ if (selectors == null) {
+ throw new Error(`unknown suite "${request.suite}"`);
+ }
+ scenarios = resolveScenarios(selectors);
+ } catch (error) {
+ setStatus(String(error));
+ await emit({
+ event: 'error',
+ runId: request.runId ?? null,
+ message: String(error),
+ });
+ return;
+ }
+ const list: Scenario[] = [];
+ for (let repeat = 0; repeat < request.repeat; repeat += 1) {
+ list.push(...scenarios);
+ }
+ const runId = request.runId ?? makeRunId();
+ const runProvider =
+ (request.provider as MapProvider | undefined) ?? provider;
+ runningRef.current = true;
+ setRunning(true);
+ setLines([]);
+ const startedAt = new Date().toISOString();
+ const results: ScenarioResult[] = [];
+ const failures: RunFile['failures'] = [];
+ await emit({
+ event: 'run-start',
+ runId,
+ label: request.label ?? null,
+ suite: request.suite ?? null,
+ scenarios: list.map((scenario) => scenario.id),
+ device: `${device.manufacturer} ${device.model}`,
+ build: build.type,
+ jsDev: build.jsDev,
+ probes: build.perfProbes,
+ });
+ for (let index = 0; index < list.length; index += 1) {
+ const scenario = list[index];
+ setStatus(`${index + 1}/${list.length} ${scenario.id}`);
+ await emit({
+ event: 'scenario-start',
+ runId,
+ scenario: scenario.id,
+ index,
+ total: list.length,
+ });
+ try {
+ const result = await runScenario(scenario, host, {
+ runId,
+ label: request.label,
+ platform: PLATFORM,
+ provider: runProvider,
+ device,
+ build,
+ onStatus: setStatus,
+ emit,
+ });
+ results.push(result);
+ await publishScenarioResult(result);
+ appendLine(
+ `${scenario.id}: ${result.frames.fps.average} fps · p95 ${result.frames.frameTimeMs.p95} ms · worst ${result.frames.frameTimeMs.worst} ms · jank ${(result.frames.jankRatio * 100).toFixed(1)} % · js p95 ${result.js.lagMs.p95} ms · mem ${result.memory.afterInteractionMB ?? '?'} MB`,
+ );
+ } catch (error) {
+ failures.push({ scenario: scenario.id, error: String(error) });
+ appendLine(`${scenario.id}: FAILED ${String(error)}`);
+ await emit({
+ event: 'scenario-failed',
+ runId,
+ scenario: scenario.id,
+ error: String(error),
+ });
+ }
+ }
+ const run: RunFile = {
+ schemaVersion: 1,
+ runId,
+ label: request.label,
+ suite: request.suite,
+ startedAt,
+ finishedAt: new Date().toISOString(),
+ platform: PLATFORM,
+ provider: runProvider,
+ device,
+ build,
+ scenarios: list.map((scenario) => scenario.id),
+ results,
+ failures,
+ };
+ setStatus('Publishing');
+ const path = await publishRunFile(run);
+ setLastRun(run);
+ setStatus(
+ `Done: ${results.length} results, ${failures.length} failures → ${path}`,
+ );
+ runningRef.current = false;
+ setRunning(false);
+ },
+ [appendLine, build, device, provider],
+ );
+
+ useEffect(() => {
+ if (device == null || build == null) {
+ return;
+ }
+ const pending = pendingRequest.current;
+ if (pending != null) {
+ pendingRequest.current = null;
+ void runRequest(pending);
+ return;
+ }
+ let cancelled = false;
+ Linking.getInitialURL()
+ .then((url) => {
+ const request = parseRunUrl(url) ?? parseRunUrl(launchRequest());
+ if (request != null && !cancelled) {
+ void runRequest(request);
+ }
+ })
+ .catch(() => undefined);
+ const subscription = Linking.addEventListener('url', ({ url }) => {
+ const request = parseRunUrl(url);
+ if (request != null) {
+ void runRequest(request);
+ }
+ });
+ return () => {
+ cancelled = true;
+ subscription.remove();
+ };
+ }, [build, device, runRequest]);
+
+ const toggleManualRecording = useCallback(async () => {
+ const active = manual.current;
+ if (active == null) {
+ const before = await memorySnapshot();
+ manual.current = {
+ js: startJsThreadRecorder(
+ 1000 / Math.max(30, device?.refreshRateHz ?? 60),
+ ),
+ beforeBytes: before.footprintBytes,
+ startedAt: performance.now(),
+ };
+ await startFrameRecording();
+ setRecording(true);
+ setStatus('Recording: gesture on the map, then tap Stop');
+ return;
+ }
+ manual.current = null;
+ setRecording(false);
+ const frames = computeFrameSummary(await stopFrameRecording());
+ const js = active.js.stop();
+ const after = await memorySnapshot();
+ const summary = {
+ event: 'manual-result',
+ scenario: 'manual',
+ fps: frames.fps.average,
+ fpsP95: frames.fps.p95,
+ p50: frames.frameTimeMs.p50,
+ p95: frames.frameTimeMs.p95,
+ p99: frames.frameTimeMs.p99,
+ worst: frames.frameTimeMs.worst,
+ jank: frames.jankRatio,
+ jsLagP95: js.lagMs.p95,
+ memBeforeMB: toMB(active.beforeBytes),
+ memAfterMB: toMB(after.footprintBytes),
+ durationMs: frames.durationMs,
+ };
+ await emit(summary);
+ appendLine(
+ `manual: ${frames.fps.average} fps · p95 ${frames.frameTimeMs.p95} ms · worst ${frames.frameTimeMs.worst} ms · jank ${(frames.jankRatio * 100).toFixed(1)} %`,
+ );
+ setStatus('Manual recording done');
+ }, [appendLine, device]);
+
+ const mountSelectedForManual = useCallback(async () => {
+ const host = hostRef.current;
+ const id = Array.from(selected)[0];
+ const scenario =
+ id != null ? SCENARIOS.find((entry) => entry.id === id) : undefined;
+ if (host == null || scenario == null) {
+ return;
+ }
+ setStatus(`Mounting ${scenario.id} for manual recording`);
+ await host.mount(scenario.props(), provider);
+ setStatus(`${scenario.id} mounted; tap Record, gesture, then Stop`);
+ }, [provider, selected]);
+
+ const shareLastRun = useCallback(async () => {
+ if (lastRun == null) {
+ return;
+ }
+ await Share.share({ message: JSON.stringify(lastRun) });
+ }, [lastRun]);
+
+ const visibleScenarios = useMemo(
+ () => SCENARIOS.filter((scenario) => scenario.group === group),
+ [group],
+ );
+
+ const toggleSelected = useCallback((id: string) => {
+ setSelected((current) => {
+ const next = new Set(current);
+ if (next.has(id)) {
+ next.delete(id);
+ } else {
+ next.add(id);
+ }
+ return next;
+ });
+ }, []);
+
+ const headline = device
+ ? `${device.manufacturer} ${device.model} · ${PLATFORM} ${device.osVersion} · ${device.refreshRateHz} Hz`
+ : 'Loading device info';
+ const buildLine = build
+ ? `${build.type}${build.jsDev ? ' + dev JS' : ''}${build.hermes ? ' · hermes' : ''}${build.perfProbes ? ' · probes' : ' · no probes'}${build.representative ? ' · REPRESENTATIVE' : ' · NOT REPRESENTATIVE'}`
+ : '';
+
+ return (
+
+
+
+ {headline}
+ {buildLine}
+ {status}
+
+ {running ? (
+
+ {lines.slice(-6).map((line, index) => (
+
+ {line}
+
+ ))}
+
+ ) : (
+
+
+ {PROVIDERS.length > 1 &&
+ PROVIDERS.map((entry) => (
+ setProvider(entry)}
+ />
+ ))}
+ {GROUPS.map((entry) => (
+ setGroup(entry)}
+ />
+ ))}
+
+
+ {visibleScenarios.map((scenario) => (
+ toggleSelected(scenario.id)}
+ style={[
+ styles.row,
+ selected.has(scenario.id) && styles.rowActive,
+ ]}
+ >
+ {scenario.id}
+
+ {scenario.name} · {scenario.tags.join(', ') || 'untagged'}
+
+
+ ))}
+
+
+
+
+ void mountSelectedForManual()}
+ />
+ void toggleManualRecording()}
+ />
+ void shareLastRun()}
+ disabled={lastRun == null}
+ />
+
+ {lines.length > 0 && (
+
+ {lines.map((line, index) => (
+
+ {line}
+
+ ))}
+
+ )}
+
+ )}
+
+ );
+}
+
+function Chip({
+ label,
+ active,
+ onPress,
+}: {
+ label: string;
+ active: boolean;
+ onPress: () => void;
+}) {
+ return (
+
+
+ {label}
+
+
+ );
+}
+
+function Button({
+ label,
+ onPress,
+ disabled,
+}: {
+ label: string;
+ onPress: () => void;
+ disabled?: boolean;
+}) {
+ return (
+
+ {label}
+
+ );
+}
+
+const styles = StyleSheet.create({
+ root: { flex: 1, backgroundColor: '#101012' },
+ header: {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ paddingHorizontal: 12,
+ paddingBottom: 8,
+ backgroundColor: 'rgba(16, 16, 18, 0.82)',
+ },
+ headline: { color: '#FFFFFF', fontSize: 12, fontWeight: '600' },
+ buildLine: { color: 'rgba(255,255,255,0.7)', fontSize: 11, marginTop: 2 },
+ status: {
+ color: '#FBBF24',
+ fontSize: 11,
+ marginTop: 4,
+ fontVariant: ['tabular-nums'],
+ },
+ panel: {
+ position: 'absolute',
+ left: 0,
+ right: 0,
+ bottom: 0,
+ maxHeight: '52%',
+ backgroundColor: 'rgba(16, 16, 18, 0.92)',
+ paddingHorizontal: 10,
+ paddingTop: 8,
+ gap: 8,
+ },
+ runningPanel: {
+ position: 'absolute',
+ left: 0,
+ right: 0,
+ bottom: 0,
+ backgroundColor: 'rgba(16, 16, 18, 0.82)',
+ paddingHorizontal: 12,
+ paddingTop: 8,
+ },
+ chipRow: { gap: 6, paddingVertical: 2 },
+ chip: {
+ paddingHorizontal: 10,
+ paddingVertical: 6,
+ borderRadius: 999,
+ backgroundColor: 'rgba(255,255,255,0.08)',
+ },
+ chipActive: { backgroundColor: 'rgba(59, 130, 246, 0.4)' },
+ chipText: { color: 'rgba(255,255,255,0.75)', fontSize: 12 },
+ chipTextActive: { color: '#FFFFFF', fontWeight: '600' },
+ list: { maxHeight: 200 },
+ listContent: { gap: 4 },
+ row: {
+ paddingHorizontal: 10,
+ paddingVertical: 6,
+ borderRadius: 8,
+ backgroundColor: 'rgba(255,255,255,0.05)',
+ },
+ rowActive: { backgroundColor: 'rgba(59, 130, 246, 0.35)' },
+ rowId: { color: '#FFFFFF', fontSize: 12, fontWeight: '600' },
+ rowName: { color: 'rgba(255,255,255,0.65)', fontSize: 11 },
+ buttonRow: { flexDirection: 'row', gap: 8 },
+ button: {
+ flex: 1,
+ paddingVertical: 10,
+ borderRadius: 10,
+ alignItems: 'center',
+ backgroundColor: 'rgba(59, 130, 246, 0.3)',
+ },
+ buttonDisabled: { opacity: 0.4 },
+ buttonText: { color: '#FFFFFF', fontSize: 12, fontWeight: '600' },
+ results: { maxHeight: 120 },
+ resultLine: {
+ color: 'rgba(255,255,255,0.8)',
+ fontSize: 10,
+ fontVariant: ['tabular-nums'],
+ },
+});
diff --git a/performance/app/__tests__/deepLink.test.ts b/performance/app/__tests__/deepLink.test.ts
new file mode 100644
index 0000000..48bb24f
--- /dev/null
+++ b/performance/app/__tests__/deepLink.test.ts
@@ -0,0 +1,31 @@
+import { describe, expect, test } from 'bun:test';
+import { parseRunUrl } from '../deepLink';
+
+describe('parseRunUrl', () => {
+ test('parses scenarios, run id, label and repeat', () => {
+ expect(
+ parseRunUrl(
+ 'nitromapsperf://run?scenarios=markers-10k,camera-fast-pan-10k&runId=abc&label=pr%2042&repeat=3',
+ ),
+ ).toEqual({
+ scenarios: ['markers-10k', 'camera-fast-pan-10k'],
+ suite: undefined,
+ runId: 'abc',
+ label: 'pr 42',
+ provider: undefined,
+ repeat: 3,
+ });
+ });
+
+ test('parses a suite', () => {
+ expect(parseRunUrl('nitromapsperf://run?suite=baseline')?.suite).toBe(
+ 'baseline',
+ );
+ });
+
+ test('rejects unrelated urls', () => {
+ expect(parseRunUrl('nitromapsperf://other?scenarios=a')).toBeNull();
+ expect(parseRunUrl('nitromapsperf://run')).toBeNull();
+ expect(parseRunUrl(null)).toBeNull();
+ });
+});
diff --git a/performance/app/__tests__/frameStats.test.ts b/performance/app/__tests__/frameStats.test.ts
new file mode 100644
index 0000000..38a5d16
--- /dev/null
+++ b/performance/app/__tests__/frameStats.test.ts
@@ -0,0 +1,55 @@
+import { describe, expect, test } from 'bun:test';
+import { computeFrameSummary } from '../metrics/frameStats';
+
+function recording(intervalsMs: number[], expected = 16.67) {
+ return {
+ intervalsMs,
+ expectedMs: intervalsMs.map(() => expected),
+ durationMs: intervalsMs.reduce((sum, value) => sum + value, 0),
+ refreshRateHz: 60,
+ startNs: 0,
+ };
+}
+
+describe('computeFrameSummary', () => {
+ test('percentiles, jank, dropped and long frames', () => {
+ const intervals = [...Array(10).fill(16.7), 60, ...Array(5).fill(16.7)];
+ const summary = computeFrameSummary(recording(intervals));
+ expect(summary.frames).toBe(16);
+ expect(summary.frameTimeMs.worst).toBe(60);
+ expect(summary.frameTimeMs.p50).toBe(16.7);
+ expect(summary.jankFrames).toBe(1);
+ expect(summary.longFrames).toBe(1);
+ expect(summary.droppedFrames).toBe(3);
+ expect(summary.budgetMs).toBeCloseTo(16.67, 2);
+ const histogramTotal = summary.frameTimeMs.histogram.counts.reduce(
+ (sum, value) => sum + value,
+ 0,
+ );
+ expect(histogramTotal).toBe(16);
+ });
+
+ test('per-second FPS windows expose bad seconds', () => {
+ const good = Array(120).fill(16.67); // ~2 s at 60 fps
+ const bad = [...Array(20).fill(16.67), 500, 200]; // one bad second
+ const summary = computeFrameSummary(recording([...good, ...bad, ...good]));
+ expect(summary.fps.windows).toBeGreaterThanOrEqual(4);
+ expect(summary.fps.average).toBeLessThan(60);
+ expect(summary.fps.worstWindow).toBeLessThan(30);
+ expect(summary.fps.p50).toBeGreaterThan(55);
+ });
+
+ test('120 Hz frames are judged against their own interval', () => {
+ const summary = computeFrameSummary(recording(Array(50).fill(8.33), 8.33));
+ expect(summary.jankFrames).toBe(0);
+ expect(summary.fps.average).toBeCloseTo(120, 0);
+ expect(summary.budgetMs).toBeCloseTo(8.33, 2);
+ });
+
+ test('empty recording is safe', () => {
+ const summary = computeFrameSummary(recording([]));
+ expect(summary.frames).toBe(0);
+ expect(summary.fps.average).toBe(0);
+ expect(summary.frameTimeMs.p95).toBe(0);
+ });
+});
diff --git a/performance/app/__tests__/probes.test.ts b/performance/app/__tests__/probes.test.ts
new file mode 100644
index 0000000..8b955eb
--- /dev/null
+++ b/performance/app/__tests__/probes.test.ts
@@ -0,0 +1,79 @@
+import { describe, expect, test } from 'bun:test';
+import { setterSpans, summarizeProbes } from '../metrics/probes';
+
+const drain = {
+ dropped: 2,
+ spans: [
+ {
+ name: 'markers.set',
+ startNs: 100,
+ durationNs: 2_000_000,
+ count: 10_000,
+ thread: 'main' as const,
+ },
+ {
+ name: 'markers.fingerprint',
+ startNs: 110,
+ durationNs: 1_500_000,
+ count: 10_000,
+ thread: 'main' as const,
+ },
+ {
+ name: 'markers.indexBuild',
+ startNs: 3_000,
+ durationNs: 8_000_000,
+ count: 10_000,
+ thread: 'background' as const,
+ },
+ {
+ name: 'markers.applyDiff',
+ startNs: 20_000,
+ durationNs: 30_000_000,
+ count: 800,
+ thread: 'main' as const,
+ },
+ {
+ name: 'markers.applyDiff',
+ startNs: 60_000,
+ durationNs: 10_000_000,
+ count: 200,
+ thread: 'main' as const,
+ },
+ {
+ name: 'polylines.set',
+ startNs: 90_000,
+ durationNs: 500_000,
+ count: 1000,
+ thread: 'main' as const,
+ },
+ ],
+};
+
+describe('summarizeProbes', () => {
+ test('aggregates by name and thread', () => {
+ const summary = summarizeProbes(drain, true);
+ expect(summary.available).toBe(true);
+ expect(summary.dropped).toBe(2);
+ expect(summary.spans).toBe(6);
+ expect(summary.byName['markers.applyDiff'].count).toBe(2);
+ expect(summary.byName['markers.applyDiff'].totalMs).toBe(40);
+ expect(summary.byName['markers.applyDiff'].maxMs).toBe(30);
+ expect(summary.byName['markers.applyDiff'].items).toBe(1000);
+ expect(summary.byName['markers.indexBuild'].backgroundMs).toBe(8);
+ expect(summary.mainThreadMs).toBeCloseTo(44, 5);
+ expect(summary.backgroundMs).toBe(8);
+ });
+
+ test('setter spans are ordered by start', () => {
+ expect(setterSpans(drain).map((span) => span.name)).toEqual([
+ 'markers.set',
+ 'polylines.set',
+ ]);
+ });
+
+ test('missing drains are reported as unavailable', () => {
+ const summary = summarizeProbes(null, false);
+ expect(summary.available).toBe(false);
+ expect(summary.spans).toBe(0);
+ });
+});
diff --git a/performance/app/__tests__/publish.test.ts b/performance/app/__tests__/publish.test.ts
new file mode 100644
index 0000000..6f3deb9
--- /dev/null
+++ b/performance/app/__tests__/publish.test.ts
@@ -0,0 +1,42 @@
+import { describe, expect, test } from 'bun:test';
+import { assembleChunks } from '../../scripts/lib/logs.mjs';
+import { base64 } from '../base64';
+
+describe('result publishing fallback', () => {
+ test('base64 matches Node for ASCII and UTF-8 text', () => {
+ for (const text of [
+ '',
+ 'a',
+ 'ab',
+ 'abc',
+ '{"fps":58.1}',
+ 'Łazienki Park · 52.2°N',
+ '😀 emoji',
+ ]) {
+ expect(base64(text)).toBe(Buffer.from(text, 'utf8').toString('base64'));
+ }
+ });
+
+ test('chunked log lines reassemble to the original JSON', () => {
+ const payload = {
+ runId: 'r1',
+ results: [
+ { scenario: 'markers-10k', frames: { fps: { average: 58.1 } } },
+ ],
+ };
+ const json = JSON.stringify(payload);
+ const size = 7;
+ const total = Math.ceil(json.length / size);
+ const chunks = new Map();
+ for (let index = 0; index < total; index += 1) {
+ chunks.set(index, {
+ index,
+ total,
+ data: base64(json.slice(index * size, (index + 1) * size)),
+ });
+ }
+ expect(assembleChunks(chunks)).toEqual(payload);
+ chunks.delete(3);
+ expect(assembleChunks(chunks)).toBeNull();
+ });
+});
diff --git a/performance/app/base64.ts b/performance/app/base64.ts
new file mode 100644
index 0000000..b7174fd
--- /dev/null
+++ b/performance/app/base64.ts
@@ -0,0 +1,45 @@
+/** Base64 of a UTF-8 string, without relying on a `btoa` global. */
+export function base64(input: string): string {
+ const bytes: number[] = [];
+ for (let index = 0; index < input.length; index += 1) {
+ let code = input.charCodeAt(index);
+ if (code >= 0xd800 && code <= 0xdbff && index + 1 < input.length) {
+ const low = input.charCodeAt(index + 1);
+ if (low >= 0xdc00 && low <= 0xdfff) {
+ code = 0x10000 + ((code - 0xd800) << 10) + (low - 0xdc00);
+ index += 1;
+ }
+ }
+ if (code < 0x80) {
+ bytes.push(code);
+ } else if (code < 0x800) {
+ bytes.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));
+ } else if (code < 0x10000) {
+ bytes.push(
+ 0xe0 | (code >> 12),
+ 0x80 | ((code >> 6) & 0x3f),
+ 0x80 | (code & 0x3f),
+ );
+ } else {
+ bytes.push(
+ 0xf0 | (code >> 18),
+ 0x80 | ((code >> 12) & 0x3f),
+ 0x80 | ((code >> 6) & 0x3f),
+ 0x80 | (code & 0x3f),
+ );
+ }
+ }
+ const alphabet =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ let output = '';
+ for (let index = 0; index < bytes.length; index += 3) {
+ const a = bytes[index];
+ const b = bytes[index + 1];
+ const c = bytes[index + 2];
+ const triple = (a << 16) | ((b ?? 0) << 8) | (c ?? 0);
+ output += alphabet[(triple >> 18) & 63] + alphabet[(triple >> 12) & 63];
+ output += b === undefined ? '=' : alphabet[(triple >> 6) & 63];
+ output += c === undefined ? '=' : alphabet[triple & 63];
+ }
+ return output;
+}
diff --git a/performance/app/deepDiffer.ts b/performance/app/deepDiffer.ts
new file mode 100644
index 0000000..5c62e3b
--- /dev/null
+++ b/performance/app/deepDiffer.ts
@@ -0,0 +1,65 @@
+/**
+ * A TypeScript port of React Native's `deepDiffer`
+ * (Libraries/Utilities/differ/deepDiffer.js), the comparison Fabric runs on
+ * every object/array prop of a host component whose `validAttributes` entry
+ * is `true` (all Nitro view props). The lab times it on the same prop values
+ * it commits, to attribute that share of the JS commit.
+ */
+export interface DeepDifferOptions {
+ unsafelyIgnoreFunctions?: boolean;
+}
+
+const FABRIC_OPTIONS: DeepDifferOptions = { unsafelyIgnoreFunctions: true };
+
+export function deepDiffer(
+ one: unknown,
+ two: unknown,
+ maxDepth = -1,
+ options: DeepDifferOptions = FABRIC_OPTIONS,
+): boolean {
+ if (maxDepth === 0) {
+ return true;
+ }
+ if (one === two) {
+ return false;
+ }
+ if (typeof one === 'function' && typeof two === 'function') {
+ return options.unsafelyIgnoreFunctions !== true;
+ }
+ if (typeof one !== 'object' || one === null) {
+ return one !== two;
+ }
+ if (typeof two !== 'object' || two === null) {
+ return true;
+ }
+ if (one.constructor !== two.constructor) {
+ return true;
+ }
+ if (Array.isArray(one)) {
+ const length = one.length;
+ if ((two as unknown[]).length !== length) {
+ return true;
+ }
+ for (let index = 0; index < length; index += 1) {
+ if (
+ deepDiffer(one[index], (two as unknown[])[index], maxDepth - 1, options)
+ ) {
+ return true;
+ }
+ }
+ } else {
+ const left = one as Record;
+ const right = two as Record;
+ for (const key in left) {
+ if (deepDiffer(left[key], right[key], maxDepth - 1, options)) {
+ return true;
+ }
+ }
+ for (const key in right) {
+ if (left[key] === undefined && right[key] !== undefined) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
diff --git a/performance/app/deepLink.ts b/performance/app/deepLink.ts
new file mode 100644
index 0000000..f2f0031
--- /dev/null
+++ b/performance/app/deepLink.ts
@@ -0,0 +1,57 @@
+/**
+ * The CLI starts runs with a URL such as
+ * `nitromapsperf://run?scenarios=markers-10k,camera-fast-pan-10k&runId=abc&label=pr-42`
+ * or `nitromapsperf://run?suite=baseline`.
+ */
+export interface RunRequest {
+ scenarios: string[];
+ suite?: string;
+ runId?: string;
+ label?: string;
+ provider?: string;
+ repeat: number;
+}
+
+export function parseRunUrl(url: string | null | undefined): RunRequest | null {
+ if (url == null) {
+ return null;
+ }
+ const match = /^[a-z0-9+.-]+:\/\/run\/?\??(.*)$/i.exec(url.trim());
+ if (match == null) {
+ return null;
+ }
+ const params = new Map();
+ for (const pair of match[1].split('&')) {
+ if (pair.length === 0) {
+ continue;
+ }
+ const [key, value = ''] = pair.split('=');
+ params.set(
+ decodeURIComponent(key),
+ decodeURIComponent(value.replace(/\+/g, ' ')),
+ );
+ }
+ const scenarios = (params.get('scenarios') ?? '')
+ .split(',')
+ .map((entry) => entry.trim())
+ .filter((entry) => entry.length > 0);
+ const suite = params.get('suite') || undefined;
+ if (scenarios.length === 0 && suite == null) {
+ return null;
+ }
+ const repeat = Number.parseInt(params.get('repeat') ?? '1', 10);
+ return {
+ scenarios,
+ suite,
+ runId: params.get('runId') || undefined,
+ label: params.get('label') || undefined,
+ provider: params.get('provider') || undefined,
+ repeat: Number.isFinite(repeat) && repeat > 0 ? repeat : 1,
+ };
+}
+
+export function makeRunId(): string {
+ const now = new Date();
+ const pad = (value: number) => String(value).padStart(2, '0');
+ return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
+}
diff --git a/performance/app/metrics/frameStats.ts b/performance/app/metrics/frameStats.ts
new file mode 100644
index 0000000..6f6a974
--- /dev/null
+++ b/performance/app/metrics/frameStats.ts
@@ -0,0 +1,179 @@
+import type { FrameRecording } from '../../../example/modules/perf-lab';
+import { FPS_WINDOW_MS, FRAME_BUDGET } from '../../perf.config';
+import { distribution, mean, percentile, roundTo } from './stats';
+
+export interface FrameHistogram {
+ /** Upper edge of each bucket in ms; the last bucket is open-ended. */
+ edgesMs: number[];
+ counts: number[];
+}
+
+export interface FrameSummary {
+ frames: number;
+ durationMs: number;
+ refreshRateHz: number;
+ /** Median refresh interval the display actually ran at. */
+ budgetMs: number;
+ fps: {
+ average: number;
+ p50: number;
+ p95: number;
+ p99: number;
+ worstWindow: number;
+ windows: number;
+ };
+ frameTimeMs: {
+ average: number;
+ p50: number;
+ p90: number;
+ p95: number;
+ p99: number;
+ worst: number;
+ histogram: FrameHistogram;
+ };
+ /** Frames longer than 1.5× the interval the display was running at. */
+ jankFrames: number;
+ jankRatio: number;
+ /** Refresh slots that passed without a frame, summed over the recording. */
+ droppedFrames: number;
+ /** Frames over 50 ms: a visible stall. */
+ longFrames: number;
+ overBudgetFrames: number;
+ android?: {
+ frames: number;
+ renderTotalMs: {
+ average: number;
+ p50: number;
+ p95: number;
+ p99: number;
+ worst: number;
+ };
+ phaseSharePct: Record;
+ phaseSumsMs: Record;
+ missedDeadline: number;
+ };
+}
+
+const HISTOGRAM_EDGES_MS = [
+ 4, 8.33, 12, 16.67, 25, 33.33, 50, 100, 250, 500, 1000,
+];
+
+export function computeFrameSummary(recording: FrameRecording): FrameSummary {
+ const { intervalsMs, expectedMs, refreshRateHz } = recording;
+ const frames = intervalsMs.length;
+ const sortedIntervals = [...intervalsMs].sort((a, b) => a - b);
+ const sortedExpected = [...expectedMs].sort((a, b) => a - b);
+ const budgetMs =
+ sortedExpected.length > 0
+ ? percentile(sortedExpected, 50)
+ : 1000 / Math.max(1, refreshRateHz);
+
+ let jankFrames = 0;
+ let droppedFrames = 0;
+ let longFrames = 0;
+ let overBudgetFrames = 0;
+ let totalMs = 0;
+ const counts = new Array(HISTOGRAM_EDGES_MS.length + 1).fill(0);
+ const windowFps: number[] = [];
+ let windowMs = 0;
+ let windowFrames = 0;
+
+ for (let index = 0; index < frames; index += 1) {
+ const interval = intervalsMs[index];
+ const frameExpected = expectedMs[index] ?? budgetMs;
+ totalMs += interval;
+ if (interval > frameExpected * FRAME_BUDGET.jankFactor) {
+ jankFrames += 1;
+ }
+ if (interval > FRAME_BUDGET.longFrameMs) {
+ longFrames += 1;
+ }
+ if (interval > frameExpected * 1.05) {
+ overBudgetFrames += 1;
+ }
+ droppedFrames += Math.max(0, Math.round(interval / frameExpected) - 1);
+
+ let bucket = HISTOGRAM_EDGES_MS.findIndex((edge) => interval <= edge);
+ if (bucket < 0) {
+ bucket = HISTOGRAM_EDGES_MS.length;
+ }
+ counts[bucket] += 1;
+
+ windowMs += interval;
+ windowFrames += 1;
+ if (windowMs >= FPS_WINDOW_MS) {
+ windowFps.push((windowFrames * 1000) / windowMs);
+ windowMs = 0;
+ windowFrames = 0;
+ }
+ }
+ if (windowFrames > 0 && windowMs > FPS_WINDOW_MS / 4) {
+ windowFps.push((windowFrames * 1000) / windowMs);
+ }
+ const fpsSorted = [...windowFps].sort((a, b) => a - b);
+
+ const summary: FrameSummary = {
+ frames,
+ durationMs: roundTo(recording.durationMs, 1),
+ refreshRateHz,
+ budgetMs: roundTo(budgetMs, 3),
+ fps: {
+ average: roundTo(totalMs > 0 ? (frames * 1000) / totalMs : 0, 1),
+ p50: roundTo(percentile(fpsSorted, 50), 1),
+ // Lower percentiles of the per-second FPS series are the bad seconds.
+ p95: roundTo(percentile(fpsSorted, 5), 1),
+ p99: roundTo(percentile(fpsSorted, 1), 1),
+ worstWindow: roundTo(fpsSorted.length > 0 ? fpsSorted[0] : 0, 1),
+ windows: fpsSorted.length,
+ },
+ frameTimeMs: {
+ average: roundTo(mean(sortedIntervals), 2),
+ p50: roundTo(percentile(sortedIntervals, 50), 2),
+ p90: roundTo(percentile(sortedIntervals, 90), 2),
+ p95: roundTo(percentile(sortedIntervals, 95), 2),
+ p99: roundTo(percentile(sortedIntervals, 99), 2),
+ worst: roundTo(
+ sortedIntervals.length > 0
+ ? sortedIntervals[sortedIntervals.length - 1]
+ : 0,
+ 2,
+ ),
+ histogram: { edgesMs: HISTOGRAM_EDGES_MS, counts },
+ },
+ jankFrames,
+ jankRatio: roundTo(frames > 0 ? jankFrames / frames : 0, 4),
+ droppedFrames,
+ longFrames,
+ overBudgetFrames,
+ };
+
+ if (recording.android) {
+ const android = recording.android;
+ const render = distribution(android.totalMs);
+ const sums = android.phaseSumsMs;
+ const total = sums.total > 0 ? sums.total : 1;
+ const share: Record = {};
+ const sumsRounded: Record = {};
+ for (const [phase, value] of Object.entries(sums)) {
+ if (phase !== 'total') {
+ share[phase] = roundTo((value / total) * 100, 1);
+ }
+ sumsRounded[phase] = roundTo(value, 1);
+ }
+ summary.android = {
+ frames: android.frames,
+ renderTotalMs: {
+ average: roundTo(render.average, 2),
+ p50: roundTo(render.p50, 2),
+ p95: roundTo(render.p95, 2),
+ p99: roundTo(render.p99, 2),
+ worst: roundTo(render.max, 2),
+ },
+ phaseSharePct: share,
+ phaseSumsMs: sumsRounded,
+ missedDeadline: android.missedDeadline,
+ };
+ }
+
+ return summary;
+}
diff --git a/performance/app/metrics/hermes.ts b/performance/app/metrics/hermes.ts
new file mode 100644
index 0000000..d449aee
--- /dev/null
+++ b/performance/app/metrics/hermes.ts
@@ -0,0 +1,98 @@
+/**
+ * Hermes exposes cumulative runtime counters through
+ * `HermesInternal.getInstrumentedStats()`. Which keys exist depends on the
+ * engine build, so everything is read defensively; deltas between two reads
+ * give the JS allocation and GC activity of the work in between.
+ */
+export interface HermesStats {
+ available: boolean;
+ numGCs: number | null;
+ gcTimeMs: number | null;
+ totalAllocatedBytes: number | null;
+ allocatedBytes: number | null;
+ heapSizeBytes: number | null;
+ mallocSizeEstimateBytes: number | null;
+ externalBytes: number | null;
+ raw: Record;
+}
+
+interface HermesInternalLike {
+ getInstrumentedStats?: () => Record;
+ getRuntimeProperties?: () => Record;
+}
+
+function hermes(): HermesInternalLike | null {
+ const candidate = (
+ globalThis as { HermesInternal?: HermesInternalLike | null }
+ ).HermesInternal;
+ return candidate ?? null;
+}
+
+export function isHermes(): boolean {
+ return hermes() != null;
+}
+
+function pick(raw: Record, ...keys: string[]): number | null {
+ for (const key of keys) {
+ if (typeof raw[key] === 'number') {
+ return raw[key];
+ }
+ }
+ return null;
+}
+
+export function readHermesStats(): HermesStats {
+ const runtime = hermes();
+ const raw: Record = {};
+ if (runtime?.getInstrumentedStats != null) {
+ try {
+ for (const [key, value] of Object.entries(
+ runtime.getInstrumentedStats(),
+ )) {
+ if (typeof value === 'number') {
+ raw[key] = value;
+ }
+ }
+ } catch {
+ // Older engines throw when the stats API is compiled out.
+ }
+ }
+ const available = Object.keys(raw).length > 0;
+ return {
+ available,
+ numGCs: pick(raw, 'js_numGCs', 'js_gcNum'),
+ gcTimeMs: pick(raw, 'js_gcTime', 'js_gcTimeMs'),
+ totalAllocatedBytes: pick(raw, 'js_totalAllocatedBytes'),
+ allocatedBytes: pick(raw, 'js_allocatedBytes'),
+ heapSizeBytes: pick(raw, 'js_heapSize'),
+ mallocSizeEstimateBytes: pick(raw, 'js_mallocSizeEstimate'),
+ externalBytes: pick(raw, 'js_externalBytes'),
+ raw,
+ };
+}
+
+export interface HermesDelta {
+ available: boolean;
+ gcCount: number | null;
+ gcTimeMs: number | null;
+ allocatedBytes: number | null;
+ heapSizeAfterBytes: number | null;
+}
+
+export function hermesDelta(
+ before: HermesStats,
+ after: HermesStats,
+): HermesDelta {
+ const delta = (a: number | null, b: number | null) =>
+ a == null || b == null ? null : b - a;
+ return {
+ available: before.available && after.available,
+ gcCount: delta(before.numGCs, after.numGCs),
+ gcTimeMs: delta(before.gcTimeMs, after.gcTimeMs),
+ allocatedBytes: delta(
+ before.totalAllocatedBytes,
+ after.totalAllocatedBytes,
+ ),
+ heapSizeAfterBytes: after.heapSizeBytes,
+ };
+}
diff --git a/performance/app/metrics/jsThread.ts b/performance/app/metrics/jsThread.ts
new file mode 100644
index 0000000..7948470
--- /dev/null
+++ b/performance/app/metrics/jsThread.ts
@@ -0,0 +1,222 @@
+import { distribution, roundTo } from './stats';
+
+export interface LongTask {
+ startTime: number;
+ duration: number;
+}
+
+export type LagSource = 'animation-frame' | 'js-queue-ping';
+
+export interface JsThreadSummary {
+ /**
+ * `animation-frame`: how late each JS animation frame arrived (gap between
+ * `requestAnimationFrame` callbacks minus the frame interval). Zero while
+ * the JS thread keeps up; work shorter than a frame is invisible.
+ * `js-queue-ping` (Android): how long a native ping waited in the JS
+ * message queue; sees every JS task longer than the ping interval.
+ */
+ lagSource: LagSource;
+ lagMs: {
+ samples: number;
+ p50: number;
+ p95: number;
+ p99: number;
+ max: number;
+ };
+ /** Raw gap between JS frames; p50 equals the frame interval when JS keeps up. */
+ frameGapMs: { p50: number; p95: number; max: number };
+ /** JS frames that arrived more than half a frame late. */
+ lateFrames: number;
+ /** Sum of lateness: JS-thread time that overran frame boundaries. */
+ busyMs: number;
+ busyRatio: number;
+ /** From `PerformanceObserver` `longtask` entries when the runtime reports them, else from lag samples > 50 ms. */
+ longTasks: {
+ count: number;
+ totalMs: number;
+ maxMs: number;
+ source: 'performance-observer' | 'lag-sampler';
+ };
+ durationMs: number;
+}
+
+export interface JsThreadRecorder {
+ stop(): JsThreadSummary;
+}
+
+interface PerformanceObserverLike {
+ observe(options: { entryTypes: string[] }): void;
+ disconnect(): void;
+}
+
+interface PerformanceObserverConstructorLike {
+ new (
+ callback: (list: { getEntries(): LongTask[] }) => void,
+ ): PerformanceObserverLike;
+ supportedEntryTypes?: readonly string[];
+}
+
+function longTaskObserver(sink: LongTask[]): PerformanceObserverLike | null {
+ const ctor = (
+ globalThis as unknown as {
+ PerformanceObserver?: PerformanceObserverConstructorLike;
+ }
+ ).PerformanceObserver;
+ if (ctor == null || !ctor.supportedEntryTypes?.includes('longtask')) {
+ return null;
+ }
+ try {
+ const observer = new ctor((list) => {
+ for (const entry of list.getEntries()) {
+ sink.push({ startTime: entry.startTime, duration: entry.duration });
+ }
+ });
+ observer.observe({ entryTypes: ['longtask'] });
+ return observer;
+ } catch {
+ return null;
+ }
+}
+
+/**
+ * Samples JS-thread availability with `requestAnimationFrame`: React Native
+ * drives it from the display's vsync on both platforms, so while the JS
+ * thread keeps up the gap between callbacks is one frame interval. A React
+ * commit serializing a marker array, or any other JS work that overruns a
+ * frame, shows as a late callback. (`setTimeout` is not usable for this on
+ * Android, where timers only fire on frame boundaries and read ~18 ms late
+ * even when idle.)
+ */
+export function startJsThreadRecorder(
+ expectedFrameMs: number,
+): JsThreadRecorder {
+ const samples: number[] = [];
+ const gaps: number[] = [];
+ const longTasks: LongTask[] = [];
+ const observer = longTaskObserver(longTasks);
+ const startedAt = performance.now();
+ let last = startedAt;
+ let running = true;
+ let handle = 0;
+
+ const tick = () => {
+ if (!running) {
+ return;
+ }
+ const now = performance.now();
+ const gap = now - last;
+ gaps.push(gap);
+ samples.push(Math.max(0, gap - expectedFrameMs));
+ last = now;
+ handle = requestAnimationFrame(tick);
+ };
+ handle = requestAnimationFrame(tick);
+
+ return {
+ stop() {
+ running = false;
+ cancelAnimationFrame(handle);
+ observer?.disconnect();
+ const durationMs = performance.now() - startedAt;
+ const lag = distribution(samples);
+ const gapStats = distribution(gaps);
+ let busyMs = 0;
+ let lateFrames = 0;
+ for (const sample of samples) {
+ busyMs += sample;
+ if (sample > expectedFrameMs / 2) {
+ lateFrames += 1;
+ }
+ }
+ const fromObserver = observer != null;
+ const tasks = fromObserver
+ ? longTasks
+ : samples
+ .filter((sample) => sample > 50)
+ .map((duration) => ({ startTime: 0, duration }));
+ let totalMs = 0;
+ let maxMs = 0;
+ for (const task of tasks) {
+ totalMs += task.duration;
+ maxMs = Math.max(maxMs, task.duration);
+ }
+ return {
+ lagSource: 'animation-frame',
+ lagMs: {
+ samples: lag.samples,
+ p50: roundTo(lag.p50, 2),
+ p95: roundTo(lag.p95, 2),
+ p99: roundTo(lag.p99, 2),
+ max: roundTo(lag.max, 2),
+ },
+ frameGapMs: {
+ p50: roundTo(gapStats.p50, 2),
+ p95: roundTo(gapStats.p95, 2),
+ max: roundTo(gapStats.max, 2),
+ },
+ lateFrames,
+ busyMs: roundTo(busyMs, 1),
+ busyRatio: roundTo(durationMs > 0 ? busyMs / durationMs : 0, 4),
+ longTasks: {
+ count: tasks.length,
+ totalMs: roundTo(totalMs, 1),
+ maxMs: roundTo(maxMs, 1),
+ source: fromObserver ? 'performance-observer' : 'lag-sampler',
+ },
+ durationMs: roundTo(durationMs, 1),
+ };
+ },
+ };
+}
+
+/**
+ * Replaces the animation-frame lag with a native JS-queue ping recording
+ * (Android): the delay before each ping ran is JS-thread busy time, sampled
+ * without going through the UI thread's Choreographer.
+ */
+export function withJsQueueProbe(
+ summary: JsThreadSummary,
+ recording: { latenessMs: number[]; durationMs: number },
+): JsThreadSummary {
+ if (recording.latenessMs.length === 0) {
+ return summary;
+ }
+ const lag = distribution(recording.latenessMs);
+ let busyMs = 0;
+ let longCount = 0;
+ let longTotal = 0;
+ let longMax = 0;
+ for (const sample of recording.latenessMs) {
+ busyMs += sample;
+ if (sample > 50) {
+ longCount += 1;
+ longTotal += sample;
+ longMax = Math.max(longMax, sample);
+ }
+ }
+ const usePingLongTasks = summary.longTasks.source === 'lag-sampler';
+ return {
+ ...summary,
+ lagSource: 'js-queue-ping',
+ lagMs: {
+ samples: lag.samples,
+ p50: roundTo(lag.p50, 2),
+ p95: roundTo(lag.p95, 2),
+ p99: roundTo(lag.p99, 2),
+ max: roundTo(lag.max, 2),
+ },
+ busyMs: roundTo(busyMs, 1),
+ busyRatio: roundTo(
+ recording.durationMs > 0 ? busyMs / recording.durationMs : 0,
+ 4,
+ ),
+ longTasks: usePingLongTasks
+ ? {
+ count: longCount,
+ totalMs: roundTo(longTotal, 1),
+ maxMs: roundTo(longMax, 1),
+ source: 'lag-sampler',
+ }
+ : summary.longTasks,
+ };
+}
diff --git a/performance/app/metrics/memory.ts b/performance/app/metrics/memory.ts
new file mode 100644
index 0000000..d3e73de
--- /dev/null
+++ b/performance/app/metrics/memory.ts
@@ -0,0 +1,142 @@
+import type { MemorySnapshot } from '../../../example/modules/perf-lab';
+import { roundTo } from './stats';
+
+const MB = 1024 * 1024;
+
+export function toMB(bytes: number | undefined | null): number | null {
+ if (bytes == null || bytes < 0) {
+ return null;
+ }
+ return roundTo(bytes / MB, 1);
+}
+
+export interface MemoryPoint {
+ label: string;
+ footprintMB: number | null;
+ residentMB: number | null;
+ javaHeapMB?: number | null;
+ nativeHeapMB?: number | null;
+ mallocBlocks?: number | null;
+ mallocMB?: number | null;
+}
+
+export function memoryPoint(
+ label: string,
+ snapshot: MemorySnapshot,
+): MemoryPoint {
+ return {
+ label,
+ footprintMB: toMB(snapshot.footprintBytes),
+ residentMB: toMB(snapshot.residentBytes),
+ javaHeapMB: toMB(snapshot.javaHeapUsedBytes),
+ nativeHeapMB: toMB(snapshot.nativeHeapAllocatedBytes),
+ mallocBlocks: snapshot.mallocBlocksInUse ?? null,
+ mallocMB: toMB(snapshot.mallocBytesInUse),
+ };
+}
+
+export interface MemorySummary {
+ beforeMB: number | null;
+ afterLoadMB: number | null;
+ afterInteractionMB: number | null;
+ afterCleanupMB: number | null;
+ peakMB: number | null;
+ loadDeltaMB: number | null;
+ interactionDeltaMB: number | null;
+ /** Footprint after unmount minus footprint before mount: what the scenario left behind. */
+ retainedAfterCleanupMB: number | null;
+ points: MemoryPoint[];
+}
+
+function diff(a: number | null, b: number | null): number | null {
+ return a == null || b == null ? null : roundTo(b - a, 1);
+}
+
+export function summarizeMemory(points: MemoryPoint[]): MemorySummary {
+ const find = (label: string) =>
+ points.find((point) => point.label === label)?.footprintMB ?? null;
+ const before = find('before');
+ const afterLoad = find('afterLoad');
+ const afterInteraction = find('afterInteraction');
+ const afterCleanup = find('afterCleanup');
+ let peak: number | null = null;
+ for (const point of points) {
+ if (
+ point.footprintMB != null &&
+ (peak == null || point.footprintMB > peak)
+ ) {
+ peak = point.footprintMB;
+ }
+ }
+ return {
+ beforeMB: before,
+ afterLoadMB: afterLoad,
+ afterInteractionMB: afterInteraction,
+ afterCleanupMB: afterCleanup,
+ peakMB: peak,
+ loadDeltaMB: diff(before, afterLoad),
+ interactionDeltaMB: diff(afterLoad, afterInteraction),
+ retainedAfterCleanupMB: diff(before, afterCleanup),
+ points,
+ };
+}
+
+export interface AllocationSummary {
+ hermes: {
+ available: boolean;
+ allocatedBytes: number | null;
+ gcCount: number | null;
+ gcTimeMs: number | null;
+ heapSizeAfterMB: number | null;
+ };
+ android: {
+ javaBytesAllocated: number | null;
+ gcCount: number | null;
+ gcTimeMs: number | null;
+ blockingGcCount: number | null;
+ nativeHeapDeltaBytes: number | null;
+ } | null;
+ ios: {
+ mallocBlocksDelta: number | null;
+ mallocBytesDelta: number | null;
+ } | null;
+}
+
+function delta(a: number | undefined, b: number | undefined): number | null {
+ if (a == null || b == null || a < 0 || b < 0) {
+ return null;
+ }
+ return b - a;
+}
+
+export function platformAllocationDelta(
+ platform: 'ios' | 'android',
+ before: MemorySnapshot,
+ after: MemorySnapshot,
+): Pick {
+ if (platform === 'android') {
+ return {
+ android: {
+ javaBytesAllocated: delta(before.bytesAllocated, after.bytesAllocated),
+ gcCount: delta(before.gcCount, after.gcCount),
+ gcTimeMs: delta(before.gcTimeMs, after.gcTimeMs),
+ blockingGcCount: delta(before.blockingGcCount, after.blockingGcCount),
+ nativeHeapDeltaBytes: delta(
+ before.nativeHeapAllocatedBytes,
+ after.nativeHeapAllocatedBytes,
+ ),
+ },
+ ios: null,
+ };
+ }
+ return {
+ android: null,
+ ios: {
+ mallocBlocksDelta: delta(
+ before.mallocBlocksInUse,
+ after.mallocBlocksInUse,
+ ),
+ mallocBytesDelta: delta(before.mallocBytesInUse, after.mallocBytesInUse),
+ },
+ };
+}
diff --git a/performance/app/metrics/probes.ts b/performance/app/metrics/probes.ts
new file mode 100644
index 0000000..3494866
--- /dev/null
+++ b/performance/app/metrics/probes.ts
@@ -0,0 +1,88 @@
+import type { ProbeDrain, ProbeSpan } from '../../../example/modules/perf-lab';
+import { distribution, roundTo } from './stats';
+
+export interface ProbeStat {
+ count: number;
+ totalMs: number;
+ avgMs: number;
+ p50Ms: number;
+ p95Ms: number;
+ maxMs: number;
+ mainThreadMs: number;
+ backgroundMs: number;
+ /** Sum of the `count` payloads (items processed) across spans. */
+ items: number;
+}
+
+export interface ProbeSummary {
+ available: boolean;
+ dropped: number;
+ spans: number;
+ /** Time spent on the main (UI) thread inside instrumented library code. */
+ mainThreadMs: number;
+ backgroundMs: number;
+ byName: Record;
+}
+
+export function summarizeProbes(
+ drain: ProbeDrain | null,
+ available: boolean,
+): ProbeSummary {
+ const byName: Record = {};
+ let mainThreadMs = 0;
+ let backgroundMs = 0;
+ const spans = drain?.spans ?? [];
+ const grouped = new Map();
+ for (const span of spans) {
+ let list = grouped.get(span.name);
+ if (list == null) {
+ list = [];
+ grouped.set(span.name, list);
+ }
+ list.push(span);
+ }
+ for (const [name, list] of grouped) {
+ const durations = list.map((span) => span.durationNs / 1e6);
+ const stats = distribution(durations);
+ let main = 0;
+ let background = 0;
+ let items = 0;
+ for (const span of list) {
+ const ms = span.durationNs / 1e6;
+ if (span.thread === 'main') {
+ main += ms;
+ } else {
+ background += ms;
+ }
+ items += span.count;
+ }
+ mainThreadMs += main;
+ backgroundMs += background;
+ byName[name] = {
+ count: list.length,
+ totalMs: roundTo(main + background, 2),
+ avgMs: roundTo(stats.average, 3),
+ p50Ms: roundTo(stats.p50, 3),
+ p95Ms: roundTo(stats.p95, 3),
+ maxMs: roundTo(stats.max, 3),
+ mainThreadMs: roundTo(main, 2),
+ backgroundMs: roundTo(background, 2),
+ items,
+ };
+ }
+ return {
+ available,
+ dropped: drain?.dropped ?? 0,
+ spans: spans.length,
+ mainThreadMs: roundTo(mainThreadMs, 2),
+ backgroundMs: roundTo(backgroundMs, 2),
+ byName,
+ };
+}
+
+/** Spans whose name is a `*.set` prop setter, in start order. */
+export function setterSpans(drain: ProbeDrain | null): ProbeSpan[] {
+ return (drain?.spans ?? [])
+ .filter((span) => span.name.endsWith('.set'))
+ .sort((a, b) => a.startNs - b.startNs);
+}
diff --git a/performance/app/metrics/stats.ts b/performance/app/metrics/stats.ts
new file mode 100644
index 0000000..2115f7d
--- /dev/null
+++ b/performance/app/metrics/stats.ts
@@ -0,0 +1,57 @@
+/** Nearest-rank percentile over an ascending sample. */
+export function percentile(sortedAscending: number[], p: number): number {
+ if (sortedAscending.length === 0) {
+ return 0;
+ }
+ const rank = Math.ceil((p / 100) * sortedAscending.length);
+ const index = Math.min(sortedAscending.length - 1, Math.max(0, rank - 1));
+ return sortedAscending[index];
+}
+
+export function median(values: number[]): number {
+ return percentile(
+ [...values].sort((a, b) => a - b),
+ 50,
+ );
+}
+
+export function mean(values: number[]): number {
+ if (values.length === 0) {
+ return 0;
+ }
+ let total = 0;
+ for (const value of values) {
+ total += value;
+ }
+ return total / values.length;
+}
+
+export interface Distribution {
+ samples: number;
+ average: number;
+ p50: number;
+ p90: number;
+ p95: number;
+ p99: number;
+ max: number;
+ min: number;
+}
+
+export function distribution(values: number[]): Distribution {
+ const sorted = [...values].sort((a, b) => a - b);
+ return {
+ samples: sorted.length,
+ average: mean(sorted),
+ p50: percentile(sorted, 50),
+ p90: percentile(sorted, 90),
+ p95: percentile(sorted, 95),
+ p99: percentile(sorted, 99),
+ max: sorted.length > 0 ? sorted[sorted.length - 1] : 0,
+ min: sorted.length > 0 ? sorted[0] : 0,
+ };
+}
+
+export function roundTo(value: number, decimals = 2): number {
+ const factor = 10 ** decimals;
+ return Math.round(value * factor) / factor;
+}
diff --git a/performance/app/metrics/transfer.ts b/performance/app/metrics/transfer.ts
new file mode 100644
index 0000000..fb3f039
--- /dev/null
+++ b/performance/app/metrics/transfer.ts
@@ -0,0 +1,125 @@
+import type { PerfMapProps } from '../../scenarios/types';
+
+export interface PayloadEstimate {
+ items: number;
+ coordinates: number;
+ /** Estimated JSON size in bytes, from a sample of up to 64 items. */
+ estimatedBytes: number;
+}
+
+export type OverlayKey =
+ 'markers' | 'markerChildren' | 'polylines' | 'polygons' | 'circles';
+
+const OVERLAY_KEYS: OverlayKey[] = [
+ 'markers',
+ 'markerChildren',
+ 'polylines',
+ 'polygons',
+ 'circles',
+];
+
+function coordinateCount(key: OverlayKey, item: unknown): number {
+ if (key === 'polylines' || key === 'polygons') {
+ return (item as { coordinates: unknown[] }).coordinates.length;
+ }
+ return 1;
+}
+
+/**
+ * Describes what a prop update sends across the bridge: how many objects,
+ * how many coordinates, and roughly how many bytes they would be as JSON.
+ * The byte estimate samples the first items and scales, so it is O(1) in the
+ * array length and does not itself stall the JS thread.
+ */
+export function estimatePayload(
+ key: OverlayKey,
+ value: unknown[],
+): PayloadEstimate {
+ const items = value.length;
+ if (items === 0) {
+ return { items: 0, coordinates: 0, estimatedBytes: 2 };
+ }
+ const sampleSize = Math.min(64, items);
+ let sampleBytes = 0;
+ let sampleCoordinates = 0;
+ for (let index = 0; index < sampleSize; index += 1) {
+ sampleBytes += JSON.stringify(value[index]).length + 1;
+ sampleCoordinates += coordinateCount(key, value[index]);
+ }
+ let coordinates = sampleCoordinates;
+ if (sampleSize < items) {
+ if (key === 'polylines' || key === 'polygons') {
+ for (let index = sampleSize; index < items; index += 1) {
+ coordinates += coordinateCount(key, value[index]);
+ }
+ } else {
+ coordinates = items;
+ }
+ }
+ return {
+ items,
+ coordinates,
+ estimatedBytes: Math.round((sampleBytes / sampleSize) * items) + 2,
+ };
+}
+
+export interface TransferSummary {
+ /** Prop updates issued by the lab per overlay key (each becomes one native setter call). */
+ updates: Record;
+ /** Cumulative payload across updates, per overlay key. */
+ payload: Record;
+ /** Largest single update per key. */
+ largestUpdate: Record;
+ /** Callbacks received from native during the recording. */
+ eventsToJs: Record;
+}
+
+export class TransferTracker {
+ private updates: Record = {};
+ private payload: Record = {};
+ private largest: Record = {};
+ private events: Record = {};
+
+ recordPatch(patch: Partial): void {
+ for (const key of OVERLAY_KEYS) {
+ const value = patch[key];
+ if (!Array.isArray(value)) {
+ continue;
+ }
+ const estimate = estimatePayload(key, value);
+ this.updates[key] = (this.updates[key] ?? 0) + 1;
+ const total = this.payload[key] ?? {
+ items: 0,
+ coordinates: 0,
+ estimatedBytes: 0,
+ };
+ this.payload[key] = {
+ items: total.items + estimate.items,
+ coordinates: total.coordinates + estimate.coordinates,
+ estimatedBytes: total.estimatedBytes + estimate.estimatedBytes,
+ };
+ const largest = this.largest[key];
+ if (largest == null || estimate.estimatedBytes > largest.estimatedBytes) {
+ this.largest[key] = estimate;
+ }
+ }
+ for (const key of ['region', 'clusteringEnabled'] as const) {
+ if (patch[key] !== undefined) {
+ this.updates[key] = (this.updates[key] ?? 0) + 1;
+ }
+ }
+ }
+
+ recordEvent(name: string): void {
+ this.events[name] = (this.events[name] ?? 0) + 1;
+ }
+
+ summary(): TransferSummary {
+ return {
+ updates: { ...this.updates },
+ payload: { ...this.payload },
+ largestUpdate: { ...this.largest },
+ eventsToJs: { ...this.events },
+ };
+ }
+}
diff --git a/performance/app/publish.ts b/performance/app/publish.ts
new file mode 100644
index 0000000..d334417
--- /dev/null
+++ b/performance/app/publish.ts
@@ -0,0 +1,64 @@
+import { logLine, writeResultFile } from '../../example/modules/perf-lab';
+import { base64 } from './base64';
+import type { RunFile, ScenarioResult } from './result';
+import { summaryLine } from './result';
+
+export const LOG_PREFIX = '[perf-lab]';
+
+/** One `[perf-lab] {...}` line in the system log (and Metro in dev). */
+export async function emit(event: Record): Promise {
+ const line = `${LOG_PREFIX} ${JSON.stringify(event)}`;
+ if (__DEV__) {
+ console.log(line);
+ }
+ await logLine(line).catch(() => undefined);
+}
+
+export async function publishScenarioResult(
+ result: ScenarioResult,
+): Promise {
+ await emit({
+ event: 'scenario-result',
+ runId: result.runId,
+ ...summaryLine(result),
+ });
+}
+
+const CHUNK_CHARS = 600;
+
+/**
+ * Writes the run file for the CLI to pull and, as a fallback for devices
+ * whose file system the CLI cannot reach, streams it through the log in
+ * base64 chunks that stay under the platform log line limits.
+ */
+export async function publishRunFile(run: RunFile): Promise {
+ const json = JSON.stringify(run);
+ let path = '';
+ try {
+ path = await writeResultFile(`${run.runId}.json`, json);
+ } catch (error) {
+ await emit({
+ event: 'error',
+ runId: run.runId,
+ message: `writeResultFile failed: ${String(error)}`,
+ });
+ }
+ const total = Math.ceil(json.length / CHUNK_CHARS);
+ for (let index = 0; index < total; index += 1) {
+ await emit({
+ event: 'result-chunk',
+ runId: run.runId,
+ index,
+ total,
+ data: base64(json.slice(index * CHUNK_CHARS, (index + 1) * CHUNK_CHARS)),
+ });
+ }
+ await emit({
+ event: 'run-complete',
+ runId: run.runId,
+ file: path,
+ scenarios: run.results.length,
+ failures: run.failures.length,
+ });
+ return path;
+}
diff --git a/performance/app/result.ts b/performance/app/result.ts
new file mode 100644
index 0000000..b7d1fb6
--- /dev/null
+++ b/performance/app/result.ts
@@ -0,0 +1,169 @@
+import type { DeviceInfo } from '../../example/modules/perf-lab';
+import type { StepMeta } from '../scenarios/types';
+import type { FrameSummary } from './metrics/frameStats';
+import type { HermesDelta } from './metrics/hermes';
+import type { JsThreadSummary } from './metrics/jsThread';
+import type {
+ AllocationSummary,
+ MemoryPoint,
+ MemorySummary,
+} from './metrics/memory';
+import type { ProbeSummary } from './metrics/probes';
+import type { TransferSummary } from './metrics/transfer';
+
+export const RESULT_SCHEMA_VERSION = 1;
+
+export interface BuildInfo {
+ /** `release` when the native binary is not debuggable. */
+ type: 'debug' | 'release';
+ /** `__DEV__`: the JS bundle is a development bundle (Metro, dev checks). */
+ jsDev: boolean;
+ hermes: boolean;
+ /** Library compiled with PerfProbe recording (a "profile" build). */
+ perfProbes: boolean;
+ /**
+ * True only for release native + production JS on a physical device.
+ * Everything else must not be presented as production performance.
+ */
+ representative: boolean;
+ caveats: string[];
+}
+
+export interface CommitSummary {
+ count: number;
+ totalMs: number;
+ avgMs: number;
+ p95Ms: number;
+ maxMs: number;
+}
+
+export interface BridgeSummary {
+ /**
+ * From the end of the React commit (JS thread) to the start of the native
+ * prop setter (UI thread): Fabric mount scheduling plus the C++ → Swift /
+ * JNI copy of the descriptor arrays. Requires native probes.
+ */
+ commitToNativeMs: { samples: number; avgMs: number; maxMs: number } | null;
+ /** Duration of the native `*.set` spans that followed the commits. */
+ setterMs: { samples: number; avgMs: number; maxMs: number } | null;
+}
+
+export interface StepResult {
+ index: number;
+ label: string;
+ meta: StepMeta;
+ wallMs: number;
+ commits: CommitSummary;
+ bridge: BridgeSummary;
+ native: ProbeSummary;
+ hermes: HermesDelta;
+}
+
+export interface TimelineWindow {
+ index: number;
+ label: string;
+ /** Milliseconds since the interaction started. */
+ atMs: number;
+ frames: FrameSummary;
+ memory: MemoryPoint;
+ cpuPercent: number | null;
+ hermes: HermesDelta;
+ native: ProbeSummary;
+}
+
+export interface LoadSummary {
+ /** JS-thread time of the mounting commit (React + shadow tree + Nitro prop parsing). */
+ commitMs: number;
+ /** From the mount call to `onMapReady`. */
+ readyMs: number;
+ timedOut: boolean;
+ native: ProbeSummary;
+ bridge: BridgeSummary;
+ hermes: HermesDelta;
+}
+
+export interface CpuSummary {
+ processCpuMs: number;
+ wallMs: number;
+ /** Process CPU time over wall time; can exceed 100 on multi-core devices. */
+ percent: number;
+ threadsBefore: number;
+ threadsAfter: number;
+ thermalBefore: string;
+ thermalAfter: string;
+ batteryLevel: number;
+ batteryState: string;
+ lowPowerMode: boolean;
+}
+
+export interface ScenarioResult {
+ schemaVersion: typeof RESULT_SCHEMA_VERSION;
+ runId: string;
+ label?: string;
+ scenario: string;
+ name: string;
+ group: string;
+ tags: string[];
+ description: string;
+ recordedAt: string;
+ platform: 'ios' | 'android';
+ provider: string;
+ os: string;
+ device: DeviceInfo;
+ build: BuildInfo;
+ refreshRateHz: number;
+ frameBudgetMs: number;
+ durationMs: number;
+ load: LoadSummary;
+ frames: FrameSummary;
+ js: JsThreadSummary & { commits: CommitSummary };
+ bridge: BridgeSummary;
+ native: ProbeSummary;
+ memory: MemorySummary;
+ allocations: AllocationSummary;
+ cpu: CpuSummary;
+ transfer: TransferSummary;
+ steps: StepResult[];
+ timeline: TimelineWindow[];
+ metrics: Record;
+ notes: string[];
+ errors: string[];
+}
+
+export interface RunFile {
+ schemaVersion: typeof RESULT_SCHEMA_VERSION;
+ runId: string;
+ label?: string;
+ suite?: string;
+ startedAt: string;
+ finishedAt: string;
+ platform: 'ios' | 'android';
+ provider: string;
+ device: DeviceInfo;
+ build: BuildInfo;
+ scenarios: string[];
+ results: ScenarioResult[];
+ failures: { scenario: string; error: string }[];
+}
+
+/** One compact line per scenario for the system log (kept under 1 KB). */
+export function summaryLine(result: ScenarioResult): Record {
+ return {
+ scenario: result.scenario,
+ fps: result.frames.fps.average,
+ fpsP95: result.frames.fps.p95,
+ p50: result.frames.frameTimeMs.p50,
+ p95: result.frames.frameTimeMs.p95,
+ p99: result.frames.frameTimeMs.p99,
+ worst: result.frames.frameTimeMs.worst,
+ jank: result.frames.jankRatio,
+ jsLagP95: result.js.lagMs.p95,
+ jsCommitAvg: result.js.commits.avgMs,
+ nativeMainMs: result.native.mainThreadMs,
+ loadReadyMs: result.load.readyMs,
+ memAfterMB: result.memory.afterInteractionMB,
+ memDeltaMB: result.memory.interactionDeltaMB,
+ cpuPct: result.cpu.percent,
+ errors: result.errors.length,
+ };
+}
diff --git a/performance/app/runner.ts b/performance/app/runner.ts
new file mode 100644
index 0000000..f3e08f9
--- /dev/null
+++ b/performance/app/runner.ts
@@ -0,0 +1,525 @@
+import type { Camera, MapViewRef } from 'react-native-better-maps';
+import {
+ drainProbes,
+ jsQueueProbeAvailable,
+ memorySnapshot,
+ nowNs,
+ processStats,
+ setProbesEnabled,
+ startFrameRecording,
+ startJsQueueProbe,
+ stopFrameRecording,
+ stopJsQueueProbe,
+ type DeviceInfo,
+ type FrameRecording,
+ type MemorySnapshot,
+ type ProbeSpan,
+} from '../../example/modules/perf-lab';
+import { clearFixtureCache } from '../fixtures';
+import type {
+ CommitSample,
+ PerfMapProps,
+ Scenario,
+ ScenarioContext,
+ StepMeta,
+} from '../scenarios/types';
+import { computeFrameSummary } from './metrics/frameStats';
+import {
+ hermesDelta,
+ readHermesStats,
+ type HermesStats,
+} from './metrics/hermes';
+import { startJsThreadRecorder, withJsQueueProbe } from './metrics/jsThread';
+import {
+ memoryPoint,
+ platformAllocationDelta,
+ summarizeMemory,
+ toMB,
+ type MemoryPoint,
+} from './metrics/memory';
+import { setterSpans, summarizeProbes } from './metrics/probes';
+import { roundTo } from './metrics/stats';
+import { TransferTracker } from './metrics/transfer';
+import {
+ RESULT_SCHEMA_VERSION,
+ type BridgeSummary,
+ type BuildInfo,
+ type CommitSummary,
+ type ScenarioResult,
+ type StepResult,
+ type TimelineWindow,
+} from './result';
+
+export interface MountResult {
+ commitMs: number;
+ readyMs: number;
+ timedOut: boolean;
+}
+
+/** The mounted map the runner drives; implemented by `MapHost`. */
+export interface MapHostApi {
+ mount(props: PerfMapProps, provider: string): Promise;
+ setProps(patch: Partial): Promise;
+ unmount(): Promise;
+ map(): MapViewRef | null;
+ takeEventCounts(): Record;
+}
+
+export interface RunnerEnvironment {
+ runId: string;
+ label?: string;
+ platform: 'ios' | 'android';
+ provider: string;
+ device: DeviceInfo;
+ build: BuildInfo;
+ onStatus?(message: string): void;
+ /** Writes one `[perf-lab] {...}` line to the system log. */
+ emit(event: Record): Promise;
+}
+
+function sleep(ms: number): Promise {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+interface ClockOffset {
+ /** Native ns minus JS `performance.now()` in ns. */
+ offsetNs: number;
+ roundTripMs: number;
+}
+
+/** Aligns `performance.now()` with the native monotonic clock the probes use. */
+function alignClock(): ClockOffset {
+ let best: ClockOffset | null = null;
+ for (let attempt = 0; attempt < 9; attempt += 1) {
+ const before = performance.now();
+ const native = nowNs();
+ const after = performance.now();
+ const candidate = {
+ offsetNs: native - ((before + after) / 2) * 1e6,
+ roundTripMs: after - before,
+ };
+ if (best == null || candidate.roundTripMs < best.roundTripMs) {
+ best = candidate;
+ }
+ }
+ return best as ClockOffset;
+}
+
+function summarizeCommits(commits: CommitSample[]): CommitSummary {
+ const values = commits.map((commit) => commit.commitMs).sort((a, b) => a - b);
+ let total = 0;
+ for (const value of values) {
+ total += value;
+ }
+ const rank = Math.min(
+ values.length - 1,
+ Math.max(0, Math.ceil(0.95 * values.length) - 1),
+ );
+ return {
+ count: values.length,
+ totalMs: roundTo(total, 2),
+ avgMs: roundTo(values.length > 0 ? total / values.length : 0, 3),
+ p95Ms: roundTo(values.length > 0 ? values[rank] : 0, 3),
+ maxMs: roundTo(values.length > 0 ? values[values.length - 1] : 0, 3),
+ };
+}
+
+/**
+ * Pairs each JS commit with the first native `*.set` span that started after
+ * it, giving the commit → UI-thread setter latency and the setter duration.
+ */
+function summarizeBridge(
+ commits: CommitSample[],
+ spans: ProbeSpan[],
+ clock: ClockOffset,
+): BridgeSummary {
+ const setters = setterSpans({ spans, dropped: 0 });
+ if (setters.length === 0 || commits.length === 0) {
+ return { commitToNativeMs: null, setterMs: null };
+ }
+ const latencies: number[] = [];
+ const durations: number[] = [];
+ let cursor = 0;
+ for (const commit of commits) {
+ while (cursor < setters.length) {
+ const startMs = (setters[cursor].startNs - clock.offsetNs) / 1e6;
+ if (startMs >= commit.committedAt - 2) {
+ break;
+ }
+ cursor += 1;
+ }
+ const span = setters[cursor];
+ if (span == null) {
+ break;
+ }
+ const startMs = (span.startNs - clock.offsetNs) / 1e6;
+ if (startMs - commit.committedAt > 5000) {
+ continue;
+ }
+ latencies.push(Math.max(0, startMs - commit.committedAt));
+ durations.push(span.durationNs / 1e6);
+ cursor += 1;
+ }
+ const stats = (values: number[]) =>
+ values.length === 0
+ ? null
+ : {
+ samples: values.length,
+ avgMs: roundTo(
+ values.reduce((sum, value) => sum + value, 0) / values.length,
+ 3,
+ ),
+ maxMs: roundTo(Math.max(...values), 3),
+ };
+ return { commitToNativeMs: stats(latencies), setterMs: stats(durations) };
+}
+
+function mergeRecordings(recordings: FrameRecording[]): FrameRecording {
+ const first = recordings[0];
+ return {
+ intervalsMs: recordings.flatMap((recording) => recording.intervalsMs),
+ expectedMs: recordings.flatMap((recording) => recording.expectedMs),
+ durationMs: recordings.reduce(
+ (sum, recording) => sum + recording.durationMs,
+ 0,
+ ),
+ refreshRateHz: first?.refreshRateHz ?? 60,
+ startNs: first?.startNs ?? 0,
+ android: first?.android
+ ? {
+ frames: recordings.reduce(
+ (sum, recording) => sum + (recording.android?.frames ?? 0),
+ 0,
+ ),
+ totalMs: recordings.flatMap(
+ (recording) => recording.android?.totalMs ?? [],
+ ),
+ phaseSumsMs: recordings.reduce(
+ (sums, recording) => {
+ const phases = recording.android?.phaseSumsMs;
+ if (phases) {
+ for (const key of Object.keys(sums) as (keyof typeof sums)[]) {
+ sums[key] += phases[key] ?? 0;
+ }
+ }
+ return sums;
+ },
+ { ...first.android.phaseSumsMs },
+ ),
+ missedDeadline: recordings.reduce(
+ (sum, recording) => sum + (recording.android?.missedDeadline ?? 0),
+ 0,
+ ),
+ }
+ : undefined,
+ };
+}
+
+/**
+ * Mounts, settles, records and drives one scenario, then unmounts and
+ * measures what was left behind.
+ *
+ * Phases: memory `before` → mount + `onMapReady` (load spans) → settle →
+ * memory `afterLoad` → recorders on → `scenario.run` → recorders off →
+ * memory `afterInteraction` → unmount → memory `afterCleanup`.
+ */
+export async function runScenario(
+ scenario: Scenario,
+ host: MapHostApi,
+ env: RunnerEnvironment,
+): Promise {
+ const status = (message: string) =>
+ env.onStatus?.(`${scenario.id}: ${message}`);
+ const errors: string[] = [];
+ const notes: string[] = [];
+ const metrics: Record = {};
+ const steps: StepResult[] = [];
+ const timeline: TimelineWindow[] = [];
+ const memoryPoints: MemoryPoint[] = [];
+ const commits: CommitSample[] = [];
+ const allSpans: ProbeSpan[] = [];
+ let dropped = 0;
+ const tracker = new TransferTracker();
+ const probes = env.build.perfProbes;
+
+ await host.unmount();
+ clearFixtureCache();
+ await sleep(400);
+ status('measuring baseline memory');
+ const clock = alignClock();
+ if (probes) {
+ await setProbesEnabled(true);
+ await drainProbes();
+ }
+ const memoryBefore = await memorySnapshot();
+ memoryPoints.push(memoryPoint('before', memoryBefore));
+ const hermesBeforeLoad = readHermesStats();
+
+ status('mounting');
+ const props = scenario.props();
+ tracker.recordPatch(props);
+ const mountCommit: CommitSample[] = [];
+ const mount = await host.mount(props, env.provider);
+ mountCommit.push({
+ label: 'mount',
+ commitMs: mount.commitMs,
+ committedAt: performance.now(),
+ });
+ if (mount.timedOut) {
+ errors.push('onMapReady did not fire within 20 s');
+ }
+ await sleep(scenario.settleMs ?? 1500);
+ const loadDrain = probes ? await drainProbes() : null;
+ if (loadDrain) {
+ dropped += loadDrain.dropped;
+ }
+ const hermesAfterLoad = readHermesStats();
+ const memoryAfterLoad = await memorySnapshot();
+ memoryPoints.push(memoryPoint('afterLoad', memoryAfterLoad));
+ host.takeEventCounts();
+
+ status('recording');
+ const cpuBefore = await processStats();
+ let hermesWindowStart: HermesStats = readHermesStats();
+ const hermesInteractionStart = hermesWindowStart;
+ let windowSpans: ProbeSpan[] = [];
+ let windowCpu = cpuBefore;
+ const recordings: FrameRecording[] = [];
+ const interactionStarted = performance.now();
+ const jsRecorder = startJsThreadRecorder(
+ 1000 / Math.max(30, env.device.refreshRateHz),
+ );
+ // Android: React Native dispatches JS timers and animation frames from the
+ // UI thread's Choreographer and skips a vsync now and then even when idle,
+ // so a native ping of the JS message queue is the reliable lag signal there.
+ let jsQueueProbe = false;
+ if (env.platform === 'android' && jsQueueProbeAvailable()) {
+ jsQueueProbe = await startJsQueueProbe(8)
+ .then(() => true)
+ .catch(() => false);
+ }
+ await startFrameRecording();
+
+ let currentStep: { label: string; commits: CommitSample[] } | null = null;
+
+ const drainInto = async (): Promise => {
+ if (!probes) {
+ return [];
+ }
+ const drain = await drainProbes();
+ dropped += drain.dropped;
+ allSpans.push(...drain.spans);
+ windowSpans.push(...drain.spans);
+ return drain.spans;
+ };
+
+ const context: ScenarioContext = {
+ platform: env.platform,
+ refreshRateHz: env.device.refreshRateHz,
+ map: () => host.map(),
+ async setProps(patch, label = 'setProps') {
+ tracker.recordPatch(patch);
+ const sample = await host.setProps(patch);
+ const labelled = { ...sample, label };
+ commits.push(labelled);
+ currentStep?.commits.push(labelled);
+ return labelled;
+ },
+ sleep,
+ async animateCamera(camera: Camera, durationMs: number, settleMs = 120) {
+ await host.map()?.animateCamera(camera, durationMs / 1000);
+ await sleep(durationMs + settleMs);
+ },
+ async setCamera(camera: Camera) {
+ await host.map()?.setCamera(camera);
+ await sleep(60);
+ },
+ async step(label: string, run: () => Promise, meta: StepMeta = {}) {
+ await drainInto();
+ const hermesBefore = readHermesStats();
+ const started = performance.now();
+ const step = { label, commits: [] as CommitSample[] };
+ currentStep = step;
+ try {
+ await run();
+ } finally {
+ const wallMs = performance.now() - started;
+ const spans = await drainInto();
+ currentStep = null;
+ steps.push({
+ index: steps.length,
+ label,
+ meta,
+ wallMs: roundTo(wallMs, 2),
+ commits: summarizeCommits(step.commits),
+ bridge: summarizeBridge(step.commits, spans, clock),
+ native: summarizeProbes({ spans, dropped: 0 }, probes),
+ hermes: hermesDelta(hermesBefore, readHermesStats()),
+ });
+ }
+ },
+ async checkpoint(label: string) {
+ const recording = await stopFrameRecording();
+ recordings.push(recording);
+ await drainInto();
+ const snapshot = await memorySnapshot();
+ const cpu = await processStats();
+ const hermesNow = readHermesStats();
+ const wallMs = cpu.wallTimeMs - windowCpu.wallTimeMs;
+ timeline.push({
+ index: timeline.length,
+ label,
+ atMs: roundTo(performance.now() - interactionStarted, 0),
+ frames: computeFrameSummary(recording),
+ memory: memoryPoint(label, snapshot),
+ cpuPercent:
+ wallMs > 0
+ ? roundTo(((cpu.cpuTimeMs - windowCpu.cpuTimeMs) / wallMs) * 100, 1)
+ : null,
+ hermes: hermesDelta(hermesWindowStart, hermesNow),
+ native: summarizeProbes({ spans: windowSpans, dropped: 0 }, probes),
+ });
+ memoryPoints.push(memoryPoint(`checkpoint:${label}`, snapshot));
+ windowSpans = [];
+ windowCpu = cpu;
+ hermesWindowStart = hermesNow;
+ status(`checkpoint ${label}`);
+ await startFrameRecording();
+ },
+ async gestureWindow(name: string, durationMs: number) {
+ await env.emit({
+ event: 'gesture-window',
+ runId: env.runId,
+ scenario: scenario.id,
+ name,
+ durationMs,
+ });
+ await sleep(durationMs);
+ },
+ metric(name: string, value: number) {
+ metrics[name] = value;
+ },
+ note(text: string) {
+ notes.push(text);
+ },
+ };
+
+ try {
+ await scenario.run(context);
+ } catch (error) {
+ errors.push(`run failed: ${String(error)}`);
+ }
+
+ recordings.push(await stopFrameRecording());
+ let js = jsRecorder.stop();
+ if (jsQueueProbe) {
+ js = withJsQueueProbe(js, await stopJsQueueProbe());
+ }
+ await drainInto();
+ const cpuAfter = await processStats();
+ const hermesAfter = readHermesStats();
+ const memoryAfterInteraction = await memorySnapshot();
+ memoryPoints.push(memoryPoint('afterInteraction', memoryAfterInteraction));
+ const events = host.takeEventCounts();
+ for (const [name, count] of Object.entries(events)) {
+ for (let index = 0; index < count; index += 1) {
+ tracker.recordEvent(name);
+ }
+ }
+ if (probes) {
+ await setProbesEnabled(false);
+ }
+
+ status('cleaning up');
+ await host.unmount();
+ clearFixtureCache();
+ await sleep(800);
+ const memoryAfterCleanup = await memorySnapshot();
+ memoryPoints.push(memoryPoint('afterCleanup', memoryAfterCleanup));
+
+ const frames = computeFrameSummary(mergeRecordings(recordings));
+ const wallMs = cpuAfter.wallTimeMs - cpuBefore.wallTimeMs;
+ const hermesInteraction = hermesDelta(hermesInteractionStart, hermesAfter);
+ const allocation = platformAllocationDelta(
+ env.platform,
+ memoryAfterLoad,
+ memoryAfterInteraction,
+ );
+ const loadSpans = loadDrain?.spans ?? [];
+
+ return {
+ schemaVersion: RESULT_SCHEMA_VERSION,
+ runId: env.runId,
+ label: env.label,
+ scenario: scenario.id,
+ name: scenario.name,
+ group: scenario.group,
+ tags: scenario.tags,
+ description: scenario.description,
+ recordedAt: new Date().toISOString(),
+ platform: env.platform,
+ provider: env.provider,
+ os: `${env.platform} ${env.device.osVersion}`,
+ device: env.device,
+ build: env.build,
+ refreshRateHz: frames.refreshRateHz,
+ frameBudgetMs: frames.budgetMs,
+ durationMs: roundTo(performance.now() - interactionStarted, 0),
+ load: {
+ commitMs: roundTo(mount.commitMs, 2),
+ readyMs: roundTo(mount.readyMs, 0),
+ timedOut: mount.timedOut,
+ native: summarizeProbes(loadDrain, probes),
+ bridge: summarizeBridge(mountCommit, loadSpans, clock),
+ hermes: hermesDelta(hermesBeforeLoad, hermesAfterLoad),
+ },
+ frames,
+ js: { ...js, commits: summarizeCommits(commits) },
+ bridge: summarizeBridge(commits, allSpans, clock),
+ native: summarizeProbes({ spans: allSpans, dropped }, probes),
+ memory: summarizeMemory(memoryPoints),
+ allocations: {
+ hermes: {
+ available: hermesInteraction.available,
+ allocatedBytes: hermesInteraction.allocatedBytes,
+ gcCount: hermesInteraction.gcCount,
+ gcTimeMs: hermesInteraction.gcTimeMs,
+ heapSizeAfterMB: toMB(hermesInteraction.heapSizeAfterBytes),
+ },
+ ...allocation,
+ },
+ cpu: {
+ processCpuMs: roundTo(cpuAfter.cpuTimeMs - cpuBefore.cpuTimeMs, 0),
+ wallMs: roundTo(wallMs, 0),
+ percent: roundTo(
+ wallMs > 0
+ ? ((cpuAfter.cpuTimeMs - cpuBefore.cpuTimeMs) / wallMs) * 100
+ : 0,
+ 1,
+ ),
+ threadsBefore: cpuBefore.threadCount,
+ threadsAfter: cpuAfter.threadCount,
+ thermalBefore: cpuBefore.thermalState,
+ thermalAfter: cpuAfter.thermalState,
+ batteryLevel: cpuAfter.batteryLevel,
+ batteryState: cpuAfter.batteryState,
+ lowPowerMode: cpuAfter.lowPowerMode,
+ },
+ transfer: tracker.summary(),
+ steps,
+ timeline,
+ metrics,
+ notes: [
+ ...notes,
+ `clock alignment round trip ${clock.roundTripMs.toFixed(3)} ms`,
+ ...(probes
+ ? []
+ : ['native probes not compiled in: native/bridge sections are N/A']),
+ ],
+ errors,
+ };
+}
+
+export function describeMemory(snapshot: MemorySnapshot): string {
+ return `${toMB(snapshot.footprintBytes) ?? '?'} MB`;
+}
diff --git a/performance/benchmarks/collection.bench.test.ts b/performance/benchmarks/collection.bench.test.ts
new file mode 100644
index 0000000..cc5b367
--- /dev/null
+++ b/performance/benchmarks/collection.bench.test.ts
@@ -0,0 +1,92 @@
+import { describe, expect, test } from 'bun:test';
+import { createRequire } from 'node:module';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+import { Marker } from '../../package/src/components/Marker';
+import type { OverlayComponentType } from '../../package/src/overlays/overlayType';
+import { generateMarkers } from '../fixtures';
+import { SIZES, measure, report, type Measurement } from './lib/bench';
+
+// React lives in the library package's node_modules (bun isolated installs).
+const requireFromPackage = createRequire(
+ path.resolve(
+ path.dirname(fileURLToPath(import.meta.url)),
+ '..',
+ '..',
+ 'package',
+ 'package.json',
+ ),
+);
+const React = requireFromPackage('react') as typeof import('react');
+
+interface CollectedMarker {
+ id: string;
+ coordinate: { latitude: number; longitude: number };
+ title?: string;
+ subtitle?: string;
+}
+
+/**
+ * Mirrors what `useCollectedOverlays` does on every `MapView` render when
+ * markers are `` children: walk `React.Children`, identify each
+ * overlay component, and build a fresh descriptor array. It cannot call the
+ * hook outside React, so the collector loop is replicated here; the in-app
+ * `markers-children-*` scenarios measure the real thing end to end.
+ */
+function collect(children: React.ReactNode): CollectedMarker[] {
+ const markers: CollectedMarker[] = [];
+ let index = 0;
+ React.Children.forEach(children, (child) => {
+ if (!React.isValidElement(child)) {
+ return;
+ }
+ const type = child.type as OverlayComponentType;
+ if (type.overlayType !== 'NitroMaps.Marker') {
+ return;
+ }
+ const props = child.props as CollectedMarker;
+ markers.push({
+ id: props.id ?? `marker-${index}`,
+ coordinate: props.coordinate,
+ title: props.title,
+ subtitle: props.subtitle,
+ });
+ index += 1;
+ });
+ return markers;
+}
+
+describe('children collection micro-benchmarks', () => {
+ test(' children', () => {
+ const createElements: Measurement[] = [];
+ const collectChildren: Measurement[] = [];
+ const total: Measurement[] = [];
+
+ for (const n of SIZES) {
+ const markers = generateMarkers(n);
+ const build = () =>
+ markers.map((marker) =>
+ React.createElement(Marker, {
+ key: marker.id,
+ id: marker.id,
+ coordinate: marker.coordinate,
+ }),
+ );
+ const elements = build();
+ createElements.push(measure('createElement × n', n, build));
+ collectChildren.push(
+ measure('Children.forEach collect', n, () => collect(elements)),
+ );
+ total.push(measure('elements + collect', n, () => collect(build())));
+ expect(collect(elements)).toHaveLength(n);
+ }
+
+ report('collection', {
+ 'React.createElement for n children (per parent render)':
+ createElements,
+ 'collect descriptors from children (per MapView render)': collectChildren,
+ 'both (what one re-render of a children-based map costs before Nitro)':
+ total,
+ });
+ });
+});
diff --git a/performance/benchmarks/geometry.bench.test.ts b/performance/benchmarks/geometry.bench.test.ts
new file mode 100644
index 0000000..1702d37
--- /dev/null
+++ b/performance/benchmarks/geometry.bench.test.ts
@@ -0,0 +1,103 @@
+import { describe, expect, test } from 'bun:test';
+import { distanceBetween } from '../../package/src/utils/geo';
+import { deepDiffer } from '../app/deepDiffer';
+import {
+ generatePolygonCoordinates,
+ generatePolylineCoordinates,
+ perturbPolyline,
+} from '../fixtures';
+import { SIZES, measure, report, type Measurement } from './lib/bench';
+
+/**
+ * Geometry on the JS side. The library performs no geometry processing in
+ * JS (coordinates go to native as-is), so this documents the cost of what
+ * an app does around it and the cost of the prop diff on large coordinate
+ * arrays; the projection / path building happens in the map SDKs and is
+ * measured on device by the `polyline-*` / `polygon-*` scenarios.
+ */
+describe('geometry micro-benchmarks', () => {
+ test('coordinate arrays', () => {
+ const polyline: Measurement[] = [];
+ const polygon: Measurement[] = [];
+ const diffPolyline: Measurement[] = [];
+ const perturb: Measurement[] = [];
+ const haversine: Measurement[] = [];
+ const flatten: Measurement[] = [];
+ const stringify: Measurement[] = [];
+
+ for (const n of SIZES) {
+ const route = generatePolylineCoordinates(n);
+ const descriptor = {
+ id: 'r',
+ coordinates: route,
+ strokeColor: '#007AFF',
+ strokeWidth: 4,
+ };
+ const moved = perturbPolyline(descriptor, 1);
+ const json = JSON.stringify(route);
+ polyline.push(
+ measure('generatePolylineCoordinates', n, () =>
+ generatePolylineCoordinates(n, { seed: 3 }),
+ ),
+ );
+ polygon.push(
+ measure('generatePolygonCoordinates', n, () =>
+ generatePolygonCoordinates(n, { seed: 3 }),
+ ),
+ );
+ diffPolyline.push(
+ measure('deepDiffer polyline (10% points changed)', n, () =>
+ deepDiffer([descriptor], [moved]),
+ ),
+ );
+ perturb.push(
+ measure('perturbPolyline (app-side immutable update)', n, () =>
+ perturbPolyline(descriptor, 2),
+ ),
+ );
+ haversine.push(
+ measure('distanceBetween along route', n, () => {
+ let total = 0;
+ for (let index = 1; index < route.length; index += 1) {
+ total += distanceBetween(route[index - 1], route[index]);
+ }
+ return total;
+ }),
+ );
+ flatten.push(
+ measure(
+ 'copy to Float64Array (reference: packed representation)',
+ n,
+ () => {
+ const flat = new Float64Array(route.length * 2);
+ for (let index = 0; index < route.length; index += 1) {
+ flat[index * 2] = route[index].latitude;
+ flat[index * 2 + 1] = route[index].longitude;
+ }
+ return flat;
+ },
+ ),
+ );
+ stringify.push(
+ measure('JSON.stringify', n, () => JSON.stringify(route), {
+ iterations: 3,
+ extra: {
+ bytes: json.length,
+ bytesPerPoint: Math.round(json.length / n),
+ },
+ }),
+ );
+ expect(deepDiffer([descriptor], [moved])).toBe(true);
+ }
+
+ report('geometry', {
+ 'polyline fixture generation': polyline,
+ 'polygon fixture generation': polygon,
+ 'Fabric deepDiffer, polyline with 10% points moved': diffPolyline,
+ 'app-side immutable polyline update': perturb,
+ 'haversine distance over route (utils/geo)': haversine,
+ 'flatten to Float64Array (reference point, not a proposal)': flatten,
+ 'JSON payload size': stringify,
+ });
+ });
+});
diff --git a/performance/benchmarks/lib/bench.ts b/performance/benchmarks/lib/bench.ts
new file mode 100644
index 0000000..408c232
--- /dev/null
+++ b/performance/benchmarks/lib/bench.ts
@@ -0,0 +1,146 @@
+import { mkdirSync, writeFileSync } from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const RESULTS_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', 'results', 'bench');
+
+export interface Measurement {
+ name: string;
+ n: number;
+ iterations: number;
+ medianMs: number;
+ meanMs: number;
+ minMs: number;
+ p95Ms: number;
+ /** Optional payload the benchmark wants to record (bytes, counts). */
+ extra?: Record;
+}
+
+let sinkValue = 0;
+
+/** Keeps results observable so the JIT cannot eliminate the measured work. */
+function sink(value: unknown): void {
+ if (Array.isArray(value)) {
+ sinkValue += value.length;
+ } else if (typeof value === 'number') {
+ sinkValue += value;
+ } else if (value != null) {
+ sinkValue += 1;
+ }
+}
+
+export function sinkTotal(): number {
+ return sinkValue;
+}
+
+function percentile(sorted: number[], p: number): number {
+ const rank = Math.min(sorted.length - 1, Math.max(0, Math.ceil((p / 100) * sorted.length) - 1));
+ return sorted[rank];
+}
+
+/**
+ * Times `fn` after warm-up. Iteration count adapts so tiny operations are
+ * sampled often and 100k-element operations only a few times.
+ */
+export function measure(
+ name: string,
+ n: number,
+ fn: () => unknown,
+ options: { iterations?: number; warmup?: number; extra?: Record } = {},
+): Measurement {
+ const iterations = options.iterations ?? Math.max(10, Math.min(200, Math.round(2_000_000 / Math.max(n, 1))));
+ const warmup = options.warmup ?? Math.min(5, iterations);
+ for (let index = 0; index < warmup; index += 1) {
+ sink(fn());
+ }
+ const samples: number[] = [];
+ for (let index = 0; index < iterations; index += 1) {
+ const started = performance.now();
+ sink(fn());
+ samples.push(performance.now() - started);
+ }
+ samples.sort((a, b) => a - b);
+ const mean = samples.reduce((sum, value) => sum + value, 0) / samples.length;
+ return {
+ name,
+ n,
+ iterations,
+ medianMs: percentile(samples, 50),
+ meanMs: mean,
+ minMs: samples[0],
+ p95Ms: percentile(samples, 95),
+ extra: options.extra,
+ };
+}
+
+/** Least-squares slope of log(ms) vs log(n): 1 ≈ linear, 2 ≈ quadratic. */
+export function fitExponent(measurements: Measurement[]): number | null {
+ const usable = measurements.filter((entry) => entry.n > 0 && entry.medianMs > 0);
+ if (usable.length < 2) {
+ return null;
+ }
+ const xs = usable.map((entry) => Math.log(entry.n));
+ const ys = usable.map((entry) => Math.log(entry.medianMs));
+ const meanX = xs.reduce((sum, value) => sum + value, 0) / xs.length;
+ const meanY = ys.reduce((sum, value) => sum + value, 0) / ys.length;
+ let numerator = 0;
+ let denominator = 0;
+ for (let index = 0; index < xs.length; index += 1) {
+ numerator += (xs[index] - meanX) * (ys[index] - meanY);
+ denominator += (xs[index] - meanX) ** 2;
+ }
+ return denominator === 0 ? null : numerator / denominator;
+}
+
+export interface BenchReport {
+ suite: string;
+ runtime: string;
+ recordedAt: string;
+ series: { name: string; exponent: number | null; measurements: Measurement[] }[];
+}
+
+function format(value: number): string {
+ if (value >= 100) {
+ return value.toFixed(0);
+ }
+ if (value >= 10) {
+ return value.toFixed(1);
+ }
+ return value.toFixed(3);
+}
+
+/** Prints a table per series and writes the JSON report under results/bench. */
+export function report(suite: string, series: Record): BenchReport {
+ const out: BenchReport = {
+ suite,
+ runtime: `bun ${process.versions.bun ?? ''} on ${process.platform}/${process.arch}`,
+ recordedAt: new Date().toISOString(),
+ series: Object.entries(series).map(([name, measurements]) => ({
+ name,
+ exponent: fitExponent(measurements),
+ measurements,
+ })),
+ };
+ const lines: string[] = [`\n## ${suite} (${out.runtime})`];
+ for (const entry of out.series) {
+ lines.push(`\n### ${entry.name} (scaling exponent ${entry.exponent == null ? 'N/A' : entry.exponent.toFixed(2)})`);
+ lines.push('| n | median ms | mean ms | p95 ms | per item µs | extra |');
+ lines.push('| ---: | ---: | ---: | ---: | ---: | --- |');
+ for (const measurement of entry.measurements) {
+ const extra = measurement.extra
+ ? Object.entries(measurement.extra)
+ .map(([key, value]) => `${key}=${value}`)
+ .join(' ')
+ : '';
+ lines.push(
+ `| ${measurement.n} | ${format(measurement.medianMs)} | ${format(measurement.meanMs)} | ${format(measurement.p95Ms)} | ${format((measurement.medianMs * 1000) / Math.max(measurement.n, 1))} | ${extra} |`,
+ );
+ }
+ }
+ console.log(lines.join('\n'));
+ mkdirSync(RESULTS_DIR, { recursive: true });
+ writeFileSync(path.join(RESULTS_DIR, `${suite}.json`), `${JSON.stringify(out, null, 2)}\n`);
+ return out;
+}
+
+export const SIZES = [100, 1000, 10_000, 100_000];
diff --git a/performance/benchmarks/native/README.md b/performance/benchmarks/native/README.md
new file mode 100644
index 0000000..53e61e4
--- /dev/null
+++ b/performance/benchmarks/native/README.md
@@ -0,0 +1,41 @@
+# Native pipeline micro-benchmarks
+
+The marker pipeline's pure functions (fingerprint, spatial index, viewport
+filter, clustering, render diff) run without a map view, so they can be timed
+in plain unit tests on a laptop. These numbers show algorithmic scaling
+(1k → 100k), not device speed.
+
+## Android (JVM, JUnit)
+
+```bash
+cd example/android
+NITROMAPS_BENCH=1 ./gradlew :react-native-better-maps:testDebugUnitTest --tests '*PipelineBenchmarkTest*' -i 2>&1 | grep '\[bench\]'
+```
+
+Each line is one JSON record: `{"n":10000,"op":"clusters","medianMs":…}`.
+Without `NITROMAPS_BENCH=1` the test class is skipped, so the normal test
+run stays fast.
+
+## iOS (XCTest)
+
+The library's test spec is only built when the Podfile asks for it. Expo's
+generated Podfile does not, so add this line to `example/ios/Podfile` inside
+the target, run `pod install`, and the `react-native-better-maps-Unit-Tests`
+scheme appears:
+
+```ruby
+pod 'react-native-better-maps', :path => '../../package', :testspecs => ['Tests']
+```
+
+Then:
+
+```bash
+cd example/ios && pod install
+NITROMAPS_BENCH=1 xcodebuild test -workspace NitroMapsExample.xcworkspace \
+ -scheme react-native-better-maps-Unit-Tests \
+ -destination 'platform=iOS Simulator,name=iPhone 17 Pro' 2>&1 | grep '\[bench\]'
+```
+
+`PipelineBenchmarkTests.swift` prints the same `[bench]` records. Both test
+classes generate their own deterministic dataset (seeded, Warsaw-centred
+Gaussian blobs); it is not byte-identical to the JS fixtures.
diff --git a/performance/benchmarks/serialization.bench.test.ts b/performance/benchmarks/serialization.bench.test.ts
new file mode 100644
index 0000000..f7364c0
--- /dev/null
+++ b/performance/benchmarks/serialization.bench.test.ts
@@ -0,0 +1,125 @@
+import { describe, expect, mock, test } from 'bun:test';
+import { deepDiffer } from '../app/deepDiffer';
+import {
+ generateMarkers,
+ moveFirstMarkers,
+ moveMarkerFraction,
+ moveMarkers,
+} from '../fixtures';
+import { SIZES, measure, report, type Measurement } from './lib/bench';
+
+// `normalizeMarkerDescriptors` reaches `Image.resolveAssetSource`; stub the
+// React Native import so the library module loads under bun.
+mock.module('react-native', () => ({
+ Image: {
+ resolveAssetSource: (source: unknown) =>
+ typeof source === 'number'
+ ? { uri: `asset:/${source}.png`, width: 32, height: 32, scale: 2 }
+ : source,
+ },
+ Platform: {
+ OS: 'ios',
+ select: (options: Record) =>
+ options.ios ?? options.default,
+ },
+}));
+
+const { normalizeMarkerDescriptors } =
+ await import('../../package/src/overlays/normalizeMarkerDescriptors');
+
+/**
+ * The JS side of a marker update, isolated from React and the device:
+ * what the library does to the `markers` prop before Nitro parses it, and
+ * what Fabric's deep prop diff costs on the same arrays.
+ */
+describe('serialization micro-benchmarks', () => {
+ test('marker arrays', () => {
+ const generate: Measurement[] = [];
+ const normalizeFirst: Measurement[] = [];
+ const normalizeUnchanged: Measurement[] = [];
+ const normalizeAfterOneChange: Measurement[] = [];
+ const diffFirstChanged: Measurement[] = [];
+ const diffLastChanged: Measurement[] = [];
+ const diffNoChange: Measurement[] = [];
+ const diffSameReference: Measurement[] = [];
+ const mutateOnePercent: Measurement[] = [];
+ const stringify: Measurement[] = [];
+
+ for (const n of SIZES) {
+ const markers = generateMarkers(n);
+ const changedOne = moveFirstMarkers(markers, 1, 1);
+ const changedLast = moveMarkers(markers, [n - 1], 1);
+ const sameObjectsNewArray = markers.slice();
+ const json = JSON.stringify(markers);
+ generate.push(
+ measure('generateMarkers', n, () => generateMarkers(n, { seed: 7 })),
+ );
+ normalizeFirst.push(
+ measure('normalize (new array)', n, () =>
+ normalizeMarkerDescriptors(markers.slice()),
+ ),
+ );
+ normalizeUnchanged.push(
+ measure('normalize (same objects)', n, () =>
+ normalizeMarkerDescriptors(markers),
+ ),
+ );
+ normalizeAfterOneChange.push(
+ measure('normalize (1 changed)', n, () =>
+ normalizeMarkerDescriptors(changedOne),
+ ),
+ );
+ diffFirstChanged.push(
+ measure('deepDiffer first changed', n, () =>
+ deepDiffer(markers, changedOne),
+ ),
+ );
+ diffLastChanged.push(
+ measure('deepDiffer last changed', n, () =>
+ deepDiffer(markers, changedLast),
+ ),
+ );
+ diffNoChange.push(
+ measure('deepDiffer new array, same objects', n, () =>
+ deepDiffer(markers, sameObjectsNewArray),
+ ),
+ );
+ diffSameReference.push(
+ measure('deepDiffer same ref', n, () => deepDiffer(markers, markers)),
+ );
+ mutateOnePercent.push(
+ measure('moveMarkerFraction 1%', n, () =>
+ moveMarkerFraction(markers, 0.01, 2),
+ ),
+ );
+ stringify.push(
+ measure('JSON.stringify', n, () => JSON.stringify(markers), {
+ iterations: 3,
+ extra: {
+ bytes: json.length,
+ bytesPerMarker: Math.round(json.length / n),
+ },
+ }),
+ );
+ expect(deepDiffer(markers, changedOne)).toBe(true);
+ expect(deepDiffer(markers, changedLast)).toBe(true);
+ expect(deepDiffer(markers, sameObjectsNewArray)).toBe(false);
+ expect(deepDiffer(markers, markers)).toBe(false);
+ }
+
+ report('serialization', {
+ 'fixture generation': generate,
+ 'normalizeMarkerDescriptors, fresh array of same objects': normalizeFirst,
+ 'normalizeMarkerDescriptors, unchanged reference': normalizeUnchanged,
+ 'normalizeMarkerDescriptors, one marker changed': normalizeAfterOneChange,
+ 'Fabric deepDiffer, first marker changed (early exit)': diffFirstChanged,
+ 'Fabric deepDiffer, last marker changed (walks all, then exits)':
+ diffLastChanged,
+ 'Fabric deepDiffer, new array of the same objects (walks all, no exit)':
+ diffNoChange,
+ 'Fabric deepDiffer, same reference (fast path)': diffSameReference,
+ 'immutable 1% mutation (app-side cost)': mutateOnePercent,
+ 'JSON payload size (stringify; bytes = wire-equivalent size)': stringify,
+ });
+ });
+});
diff --git a/performance/fixtures/__tests__/fixtures.test.ts b/performance/fixtures/__tests__/fixtures.test.ts
new file mode 100644
index 0000000..6c1fc6c
--- /dev/null
+++ b/performance/fixtures/__tests__/fixtures.test.ts
@@ -0,0 +1,81 @@
+import { describe, expect, test } from 'bun:test';
+import {
+ generateMarkers,
+ generatePolygonCoordinates,
+ generatePolylineCoordinates,
+ hashJson,
+ moveMarkerFraction,
+ pickIndices,
+} from '..';
+
+/**
+ * Pins the fixture generators: if a hash changes, every recorded baseline
+ * stops being comparable with new runs. Update these values only together
+ * with a note in performance/PERFORMANCE.md and a fresh baseline.
+ */
+const EXPECTED_HASHES: Record = {
+ 'markers-100': '475809674c821543',
+ 'markers-1000': '01a979007e9ffb51',
+ 'markers-10000': '2187483cc1a0994e',
+ 'markers-1000-titles-rich': 'dae84dc6398d6f51',
+ 'polyline-1000': 'b030f609e16e08f6',
+ 'polygon-1000': 'a3e49454179a3bc8',
+ 'update-1pct-10000': '7f8d79c8b8bbd359',
+};
+
+describe('fixtures are deterministic', () => {
+ test('the same call yields identical data', () => {
+ expect(generateMarkers(500)).toEqual(generateMarkers(500));
+ expect(generatePolylineCoordinates(500)).toEqual(
+ generatePolylineCoordinates(500),
+ );
+ expect(generatePolygonCoordinates(500)).toEqual(
+ generatePolygonCoordinates(500),
+ );
+ });
+
+ test('seeds change the data', () => {
+ expect(generateMarkers(100, { seed: 1 })).not.toEqual(
+ generateMarkers(100, { seed: 2 }),
+ );
+ });
+
+ test('markers stay inside Poland', () => {
+ for (const marker of generateMarkers(2000)) {
+ expect(marker.coordinate.latitude).toBeGreaterThanOrEqual(49.002);
+ expect(marker.coordinate.latitude).toBeLessThanOrEqual(54.835);
+ expect(marker.coordinate.longitude).toBeGreaterThanOrEqual(14.123);
+ expect(marker.coordinate.longitude).toBeLessThanOrEqual(24.145);
+ }
+ });
+
+ test('mutations only replace the touched objects', () => {
+ const base = generateMarkers(1000);
+ const next = moveMarkerFraction(base, 0.01, 1);
+ let changed = 0;
+ for (let index = 0; index < base.length; index += 1) {
+ if (base[index] !== next[index]) {
+ changed += 1;
+ }
+ }
+ expect(changed).toBe(10);
+ expect(pickIndices(1000, 10)).toEqual(pickIndices(1000, 10));
+ });
+
+ test('pinned hashes', () => {
+ const actual: Record = {
+ 'markers-100': hashJson(generateMarkers(100)),
+ 'markers-1000': hashJson(generateMarkers(1000)),
+ 'markers-10000': hashJson(generateMarkers(10_000)),
+ 'markers-1000-titles-rich': hashJson(
+ generateMarkers(1000, { withTitles: true, rich: true }),
+ ),
+ 'polyline-1000': hashJson(generatePolylineCoordinates(1000)),
+ 'polygon-1000': hashJson(generatePolygonCoordinates(1000)),
+ 'update-1pct-10000': hashJson(
+ moveMarkerFraction(generateMarkers(10_000), 0.01, 3),
+ ),
+ };
+ expect(actual).toEqual(EXPECTED_HASHES);
+ });
+});
diff --git a/performance/fixtures/hash.ts b/performance/fixtures/hash.ts
new file mode 100644
index 0000000..bee6f70
--- /dev/null
+++ b/performance/fixtures/hash.ts
@@ -0,0 +1,15 @@
+/** 64-bit FNV-1a over a string, as two 32-bit halves in hex. Used to pin fixture determinism. */
+export function fnv1a64(input: string): string {
+ let h1 = 0x811c9dc5;
+ let h2 = 0xcbf29ce4;
+ for (let index = 0; index < input.length; index += 1) {
+ const code = input.charCodeAt(index);
+ h1 = Math.imul(h1 ^ code, 0x01000193) >>> 0;
+ h2 = Math.imul(h2 ^ (code + index), 0x01000193) >>> 0;
+ }
+ return `${h1.toString(16).padStart(8, '0')}${h2.toString(16).padStart(8, '0')}`;
+}
+
+export function hashJson(value: unknown): string {
+ return fnv1a64(JSON.stringify(value));
+}
diff --git a/performance/fixtures/index.ts b/performance/fixtures/index.ts
new file mode 100644
index 0000000..3a6a95e
--- /dev/null
+++ b/performance/fixtures/index.ts
@@ -0,0 +1,71 @@
+export { Random, mulberry32, splitmix32, round } from './prng';
+export {
+ DEFAULT_SEED,
+ generateMarkers,
+ type MarkerDistribution,
+ type MarkerFixtureOptions,
+} from './markers';
+export {
+ generatePolyline,
+ generatePolylineCoordinates,
+ generatePolylines,
+ polylineLengthMeters,
+ type PolylineDescriptor,
+ type PolylineFixtureOptions,
+} from './polylines';
+export {
+ generatePolygon,
+ generatePolygonCoordinates,
+ generatePolygons,
+ type PolygonDescriptor,
+ type PolygonFixtureOptions,
+} from './polygons';
+export {
+ appendMarker,
+ moveFirstMarkers,
+ moveMarkerFraction,
+ moveMarkers,
+ perturbPolyline,
+ pickIndices,
+ removeLastMarker,
+ restylePolyline,
+} from './mutations';
+export {
+ POLAND_BOUNDS,
+ POLAND_CAMERA,
+ POLAND_CENTER,
+ POLAND_REGION,
+ WARSAW_CAMERA,
+ WARSAW_CENTER,
+ WARSAW_REGION,
+ cameraAt,
+ type BoundingBox,
+} from './regions';
+export { fnv1a64, hashJson } from './hash';
+
+import type { MarkerDescriptor } from 'react-native-better-maps';
+import { generateMarkers, type MarkerFixtureOptions } from './markers';
+
+const markerCache = new Map();
+
+/**
+ * Memoized marker fixtures so scenarios that share a dataset also share one
+ * array identity (prop diffing then sees "unchanged" until a mutation).
+ */
+export function markers(
+ count: number,
+ options: MarkerFixtureOptions = {},
+): MarkerDescriptor[] {
+ const key = `${count}:${JSON.stringify(options)}`;
+ let cached = markerCache.get(key);
+ if (cached == null) {
+ cached = generateMarkers(count, options);
+ markerCache.set(key, cached);
+ }
+ return cached;
+}
+
+/** Drops memoized fixtures (used between scenarios to release memory). */
+export function clearFixtureCache(): void {
+ markerCache.clear();
+}
diff --git a/performance/fixtures/markers.ts b/performance/fixtures/markers.ts
new file mode 100644
index 0000000..d003a21
--- /dev/null
+++ b/performance/fixtures/markers.ts
@@ -0,0 +1,126 @@
+import type { MarkerDescriptor } from 'react-native-better-maps';
+import { Random, round } from './prng';
+import { POLAND_BOUNDS, type BoundingBox } from './regions';
+
+export type MarkerDistribution = 'cities' | 'uniform';
+
+export interface MarkerFixtureOptions {
+ /** Seed for the generator; the default is the lab-wide fixed seed. */
+ seed?: number;
+ /** `cities`: Gaussian blobs around Polish cities weighted by population, plus 12% rural scatter. */
+ distribution?: MarkerDistribution;
+ bounds?: BoundingBox;
+ /** Adds `title` and `subtitle` strings (extra payload per marker). */
+ withTitles?: boolean;
+ /** Adds rotation/opacity/anchor fields to exercise optional-field conversion. */
+ rich?: boolean;
+ /** Value of `clusterable` written on each marker; omit to leave it undefined. */
+ clusterable?: boolean;
+}
+
+export const DEFAULT_SEED = 12345;
+
+type CityHotspot = { latitude: number; longitude: number; weight: number };
+
+/** Major Polish cities weighted roughly by population. */
+const POLAND_CITIES: readonly CityHotspot[] = [
+ { latitude: 52.2297, longitude: 21.0122, weight: 1.8 }, // Warsaw
+ { latitude: 50.0647, longitude: 19.945, weight: 0.78 }, // Kraków
+ { latitude: 51.7592, longitude: 19.456, weight: 0.68 }, // Łódź
+ { latitude: 51.1079, longitude: 17.0385, weight: 0.64 }, // Wrocław
+ { latitude: 52.4064, longitude: 16.9252, weight: 0.54 }, // Poznań
+ { latitude: 54.352, longitude: 18.6466, weight: 0.47 }, // Gdańsk
+ { latitude: 53.4285, longitude: 14.5528, weight: 0.4 }, // Szczecin
+ { latitude: 53.1235, longitude: 18.0084, weight: 0.35 }, // Bydgoszcz
+ { latitude: 51.2465, longitude: 22.5684, weight: 0.34 }, // Lublin
+ { latitude: 50.2649, longitude: 19.0238, weight: 0.5 }, // Katowice
+ { latitude: 53.1325, longitude: 23.1688, weight: 0.3 }, // Białystok
+ { latitude: 50.0413, longitude: 21.999, weight: 0.2 }, // Rzeszów
+];
+
+const TITLE_WORDS = [
+ 'Depot',
+ 'Store',
+ 'Cafe',
+ 'Hub',
+ 'Station',
+ 'Point',
+ 'Market',
+ 'Office',
+];
+
+function clamp(value: number, min: number, max: number): number {
+ return Math.min(max, Math.max(min, value));
+}
+
+/**
+ * Generates `count` markers deterministically. Calling this twice with the
+ * same arguments yields byte-identical descriptors (see fixtures tests).
+ */
+export function generateMarkers(
+ count: number,
+ options: MarkerFixtureOptions = {},
+): MarkerDescriptor[] {
+ const {
+ seed = DEFAULT_SEED,
+ distribution = 'cities',
+ bounds = POLAND_BOUNDS,
+ withTitles = false,
+ rich = false,
+ clusterable,
+ } = options;
+ const random = new Random(seed ^ count);
+ const totalWeight = POLAND_CITIES.reduce((sum, city) => sum + city.weight, 0);
+ const markers: MarkerDescriptor[] = new Array(count);
+
+ for (let index = 0; index < count; index += 1) {
+ let latitude: number;
+ let longitude: number;
+
+ if (distribution === 'uniform' || random.next() < 0.12) {
+ latitude = random.range(bounds.minLatitude, bounds.maxLatitude);
+ longitude = random.range(bounds.minLongitude, bounds.maxLongitude);
+ } else {
+ let pick = random.next() * totalWeight;
+ let city = POLAND_CITIES[0];
+ for (const candidate of POLAND_CITIES) {
+ pick -= candidate.weight;
+ if (pick <= 0) {
+ city = candidate;
+ break;
+ }
+ }
+ const spread = 0.1 + city.weight * 0.16;
+ latitude = city.latitude + random.gaussian() * spread;
+ longitude = city.longitude + random.gaussian() * spread * 1.4;
+ }
+
+ const marker: MarkerDescriptor = {
+ id: `m-${index}`,
+ coordinate: {
+ latitude: round(
+ clamp(latitude, bounds.minLatitude, bounds.maxLatitude),
+ ),
+ longitude: round(
+ clamp(longitude, bounds.minLongitude, bounds.maxLongitude),
+ ),
+ },
+ };
+ if (clusterable !== undefined) {
+ marker.clusterable = clusterable;
+ }
+ if (withTitles) {
+ marker.title = `${random.pick(TITLE_WORDS)} ${index}`;
+ marker.subtitle = `Fixture marker #${index}`;
+ }
+ if (rich) {
+ marker.rotation = random.int(0, 359);
+ marker.opacity = round(random.range(0.5, 1), 2);
+ marker.anchor = { x: 0.5, y: 1 };
+ marker.flat = index % 2 === 0;
+ }
+ markers[index] = marker;
+ }
+
+ return markers;
+}
diff --git a/performance/fixtures/mutations.ts b/performance/fixtures/mutations.ts
new file mode 100644
index 0000000..2091668
--- /dev/null
+++ b/performance/fixtures/mutations.ts
@@ -0,0 +1,131 @@
+import type { Coordinate, MarkerDescriptor } from 'react-native-better-maps';
+import { Random, round } from './prng';
+import { DEFAULT_SEED } from './markers';
+import type { PolylineDescriptor } from './polylines';
+
+/**
+ * Deterministic marker mutations. Every function returns a new array and new
+ * objects only for the markers it changed, which is how an app would update
+ * state immutably (and what React / Fabric prop diffing then has to walk).
+ */
+
+export function pickIndices(
+ total: number,
+ count: number,
+ seed = DEFAULT_SEED,
+): number[] {
+ return new Random(seed ^ (total * 7 + count)).indices(total, count);
+}
+
+function shifted(
+ coordinate: Coordinate,
+ tick: number,
+ index: number,
+): Coordinate {
+ const angle = tick * 0.35 + index * 0.01;
+ return {
+ latitude: round(coordinate.latitude + Math.sin(angle) * 0.0006),
+ longitude: round(coordinate.longitude + Math.cos(angle) * 0.0009),
+ };
+}
+
+/** Moves the markers at `indices` by a small deterministic step. */
+export function moveMarkers(
+ markers: MarkerDescriptor[],
+ indices: readonly number[],
+ tick: number,
+): MarkerDescriptor[] {
+ if (indices.length === 0) {
+ return markers;
+ }
+ const next = markers.slice();
+ for (const index of indices) {
+ const marker = markers[index];
+ next[index] = {
+ ...marker,
+ coordinate: shifted(marker.coordinate, tick, index),
+ };
+ }
+ return next;
+}
+
+/** Moves the first `count` markers (the animated-marker workload). */
+export function moveFirstMarkers(
+ markers: MarkerDescriptor[],
+ count: number,
+ tick: number,
+): MarkerDescriptor[] {
+ const indices: number[] = [];
+ for (let index = 0; index < Math.min(count, markers.length); index += 1) {
+ indices.push(index);
+ }
+ return moveMarkers(markers, indices, tick);
+}
+
+/** Moves a deterministic `fraction` (0..1) of the markers. */
+export function moveMarkerFraction(
+ markers: MarkerDescriptor[],
+ fraction: number,
+ tick: number,
+ seed = DEFAULT_SEED,
+): MarkerDescriptor[] {
+ const count = Math.max(1, Math.round(markers.length * fraction));
+ return moveMarkers(
+ markers,
+ pickIndices(markers.length, count, seed + tick),
+ tick,
+ );
+}
+
+export function appendMarker(
+ markers: MarkerDescriptor[],
+ tick: number,
+): MarkerDescriptor[] {
+ const last = markers[markers.length - 1];
+ return [
+ ...markers,
+ {
+ id: `m-added-${tick}`,
+ coordinate: shifted(last.coordinate, tick, markers.length),
+ },
+ ];
+}
+
+export function removeLastMarker(
+ markers: MarkerDescriptor[],
+): MarkerDescriptor[] {
+ return markers.slice(0, -1);
+}
+
+/** Recolors a polyline without touching its geometry. */
+export function restylePolyline(
+ polyline: PolylineDescriptor,
+ tick: number,
+): PolylineDescriptor {
+ const colors = [
+ '#FF9500',
+ '#34C759',
+ '#AF52DE',
+ '#FF2D55',
+ '#FF3B30',
+ '#007AFF',
+ ];
+ return {
+ ...polyline,
+ strokeColor: colors[tick % colors.length],
+ strokeWidth: 3 + (tick % 3),
+ };
+}
+
+/** Moves every `stride`-th point of a polyline slightly (a "live route" update). */
+export function perturbPolyline(
+ polyline: PolylineDescriptor,
+ tick: number,
+ stride = 10,
+): PolylineDescriptor {
+ const coordinates = polyline.coordinates.slice();
+ for (let index = 0; index < coordinates.length; index += stride) {
+ coordinates[index] = shifted(coordinates[index], tick, index);
+ }
+ return { ...polyline, coordinates };
+}
diff --git a/performance/fixtures/polygons.ts b/performance/fixtures/polygons.ts
new file mode 100644
index 0000000..5d122ca
--- /dev/null
+++ b/performance/fixtures/polygons.ts
@@ -0,0 +1,110 @@
+import type { Coordinate, MapViewProps } from 'react-native-better-maps';
+import { Random, round } from './prng';
+import { DEFAULT_SEED } from './markers';
+import { WARSAW_CENTER } from './regions';
+
+export type PolygonDescriptor = NonNullable[number];
+
+export interface PolygonFixtureOptions {
+ seed?: number;
+ center?: Coordinate;
+ /** Mean radius in degrees of latitude. */
+ radiusDegrees?: number;
+ id?: string;
+ fillColor?: string;
+ strokeColor?: string;
+}
+
+/**
+ * A star-shaped ring: `points` vertices at evenly spaced angles with a
+ * smoothly varying radius, so every polygon is simple (non-self-intersecting)
+ * and the vertex count is the only thing that scales.
+ */
+export function generatePolygonCoordinates(
+ points: number,
+ options: PolygonFixtureOptions = {},
+): Coordinate[] {
+ const {
+ seed = DEFAULT_SEED,
+ center = WARSAW_CENTER,
+ radiusDegrees = 0.03,
+ } = options;
+ const random = new Random(seed ^ (points * 13));
+ const harmonics = [
+ {
+ k: 2,
+ amplitude: random.range(0.05, 0.15),
+ phase: random.range(0, Math.PI * 2),
+ },
+ {
+ k: 5,
+ amplitude: random.range(0.03, 0.08),
+ phase: random.range(0, Math.PI * 2),
+ },
+ {
+ k: 11,
+ amplitude: random.range(0.01, 0.04),
+ phase: random.range(0, Math.PI * 2),
+ },
+ ];
+ const coordinates: Coordinate[] = new Array(points);
+ const cosLat = Math.cos((center.latitude * Math.PI) / 180);
+
+ for (let index = 0; index < points; index += 1) {
+ const angle = (index / points) * Math.PI * 2;
+ let radius = radiusDegrees;
+ for (const { k, amplitude, phase } of harmonics) {
+ radius += radiusDegrees * amplitude * Math.sin(k * angle + phase);
+ }
+ coordinates[index] = {
+ latitude: round(center.latitude + Math.sin(angle) * radius),
+ longitude: round(center.longitude + (Math.cos(angle) * radius) / cosLat),
+ };
+ }
+
+ return coordinates;
+}
+
+export function generatePolygon(
+ points: number,
+ options: PolygonFixtureOptions = {},
+): PolygonDescriptor {
+ return {
+ id: options.id ?? `area-${points}`,
+ coordinates: generatePolygonCoordinates(points, options),
+ fillColor: options.fillColor ?? '#34C75944',
+ strokeColor: options.strokeColor ?? '#34C759',
+ strokeWidth: 2,
+ };
+}
+
+/** A grid of `count` polygons with `pointsEach` vertices each, around the city. */
+export function generatePolygons(
+ count: number,
+ pointsEach: number,
+ seed = DEFAULT_SEED,
+): PolygonDescriptor[] {
+ const columns = Math.ceil(Math.sqrt(count));
+ const spacing = 0.012;
+ const result: PolygonDescriptor[] = new Array(count);
+ for (let index = 0; index < count; index += 1) {
+ const row = Math.floor(index / columns);
+ const column = index % columns;
+ result[index] = generatePolygon(pointsEach, {
+ id: `area-${index}`,
+ seed: seed + index,
+ radiusDegrees: spacing * 0.4,
+ center: {
+ latitude:
+ WARSAW_CENTER.latitude - (columns / 2) * spacing + row * spacing,
+ longitude:
+ WARSAW_CENTER.longitude -
+ (columns / 2) * spacing * 1.5 +
+ column * spacing * 1.5,
+ },
+ fillColor: index % 2 === 0 ? '#34C75944' : '#FF950044',
+ strokeColor: index % 2 === 0 ? '#34C759' : '#FF9500',
+ });
+ }
+ return result;
+}
diff --git a/performance/fixtures/polylines.ts b/performance/fixtures/polylines.ts
new file mode 100644
index 0000000..cf1b883
--- /dev/null
+++ b/performance/fixtures/polylines.ts
@@ -0,0 +1,109 @@
+import type { Coordinate, MapViewProps } from 'react-native-better-maps';
+import { Random, round } from './prng';
+import { DEFAULT_SEED } from './markers';
+import { WARSAW_CENTER } from './regions';
+
+export type PolylineDescriptor = NonNullable[number];
+
+export interface PolylineFixtureOptions {
+ seed?: number;
+ start?: Coordinate;
+ /** Average distance between consecutive points, in degrees. */
+ stepDegrees?: number;
+ strokeColor?: string;
+ strokeWidth?: number;
+ id?: string;
+}
+
+const METERS_PER_DEGREE_LAT = 111_320;
+
+/**
+ * A smooth random walk (heading drifts slowly, so the line looks like a
+ * route rather than noise). Point count drives the JS payload and the
+ * native path construction cost.
+ */
+export function generatePolylineCoordinates(
+ points: number,
+ options: PolylineFixtureOptions = {},
+): Coordinate[] {
+ const { seed = DEFAULT_SEED, start = WARSAW_CENTER } = options;
+ const random = new Random(seed ^ (points * 31));
+ // Scale the step so 100 points and 100k points both stay within ~30 km.
+ const stepDegrees =
+ options.stepDegrees ?? Math.min(0.0025, 0.3 / Math.max(points, 1));
+ const coordinates: Coordinate[] = new Array(points);
+ let latitude = start.latitude;
+ let longitude = start.longitude;
+ let heading = random.range(0, Math.PI * 2);
+
+ for (let index = 0; index < points; index += 1) {
+ coordinates[index] = {
+ latitude: round(latitude),
+ longitude: round(longitude),
+ };
+ heading += random.gaussian() * 0.35;
+ // Bias back toward the start so long routes orbit the city instead of leaving.
+ const toStartLat = start.latitude - latitude;
+ const toStartLon = start.longitude - longitude;
+ const distance = Math.hypot(toStartLat, toStartLon);
+ if (distance > 0.25) {
+ heading = Math.atan2(toStartLat, toStartLon) + random.gaussian() * 0.2;
+ }
+ latitude += Math.sin(heading) * stepDegrees;
+ longitude +=
+ (Math.cos(heading) * stepDegrees) / Math.cos((latitude * Math.PI) / 180);
+ }
+
+ return coordinates;
+}
+
+export function generatePolyline(
+ points: number,
+ options: PolylineFixtureOptions = {},
+): PolylineDescriptor {
+ return {
+ id: options.id ?? `route-${points}`,
+ coordinates: generatePolylineCoordinates(points, options),
+ strokeColor: options.strokeColor ?? '#007AFF',
+ strokeWidth: options.strokeWidth ?? 4,
+ };
+}
+
+/** `count` polylines of `pointsEach` points scattered around the city. */
+export function generatePolylines(
+ count: number,
+ pointsEach: number,
+ seed = DEFAULT_SEED,
+): PolylineDescriptor[] {
+ const random = new Random(seed ^ (count * 17 + pointsEach));
+ const result: PolylineDescriptor[] = new Array(count);
+ for (let index = 0; index < count; index += 1) {
+ result[index] = generatePolyline(pointsEach, {
+ id: `route-${index}`,
+ seed: seed + index,
+ start: {
+ latitude: WARSAW_CENTER.latitude + random.gaussian() * 0.04,
+ longitude: WARSAW_CENTER.longitude + random.gaussian() * 0.06,
+ },
+ strokeColor: random.pick(['#007AFF', '#FF9500', '#34C759', '#AF52DE']),
+ strokeWidth: 3,
+ });
+ }
+ return result;
+}
+
+/** Approximate length in meters, useful for documenting fixture scale. */
+export function polylineLengthMeters(coordinates: Coordinate[]): number {
+ let total = 0;
+ for (let index = 1; index < coordinates.length; index += 1) {
+ const a = coordinates[index - 1];
+ const b = coordinates[index];
+ const dLat = (b.latitude - a.latitude) * METERS_PER_DEGREE_LAT;
+ const dLon =
+ (b.longitude - a.longitude) *
+ METERS_PER_DEGREE_LAT *
+ Math.cos((a.latitude * Math.PI) / 180);
+ total += Math.hypot(dLat, dLon);
+ }
+ return total;
+}
diff --git a/performance/fixtures/prng.ts b/performance/fixtures/prng.ts
new file mode 100644
index 0000000..2cb48c0
--- /dev/null
+++ b/performance/fixtures/prng.ts
@@ -0,0 +1,90 @@
+/**
+ * Deterministic pseudo-random numbers for fixture generation.
+ *
+ * Every fixture in the lab is generated from an explicit seed through this
+ * module and never from `Math.random()`, so the same scenario produces the
+ * same data on every device and every run. `mulberry32` is a small 32-bit
+ * generator with good statistical behaviour for this purpose; `splitmix32`
+ * turns an arbitrary seed into a well-distributed starting state.
+ */
+
+export type RandomSource = () => number;
+
+export function splitmix32(seed: number): number {
+ let state = seed >>> 0;
+ state = (state + 0x9e3779b9) >>> 0;
+ let z = state;
+ z = Math.imul(z ^ (z >>> 16), 0x21f0aaad);
+ z = Math.imul(z ^ (z >>> 15), 0x735a2d97);
+ return (z ^ (z >>> 15)) >>> 0;
+}
+
+/** Returns a generator of floats in [0, 1) seeded deterministically. */
+export function mulberry32(seed: number): RandomSource {
+ let a = splitmix32(seed);
+ return () => {
+ a = (a + 0x6d2b79f5) | 0;
+ let t = Math.imul(a ^ (a >>> 15), 1 | a);
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
+ return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
+ };
+}
+
+/** Convenience wrapper around a seeded source. */
+export class Random {
+ private readonly source: RandomSource;
+
+ constructor(seed: number) {
+ this.source = mulberry32(seed);
+ }
+
+ /** Float in [0, 1). */
+ next(): number {
+ return this.source();
+ }
+
+ /** Float in [min, max). */
+ range(min: number, max: number): number {
+ return min + this.source() * (max - min);
+ }
+
+ /** Integer in [min, max]. */
+ int(min: number, max: number): number {
+ return min + Math.floor(this.source() * (max - min + 1));
+ }
+
+ /** Standard normal deviate (Box–Muller). */
+ gaussian(): number {
+ const u = Math.max(this.source(), 1e-12);
+ const v = this.source();
+ return Math.sqrt(-2 * Math.log(u)) * Math.cos(2 * Math.PI * v);
+ }
+
+ pick(items: readonly T[]): T {
+ return items[Math.floor(this.source() * items.length)];
+ }
+
+ /** Deterministic partial Fisher–Yates: `count` distinct indices in [0, n). */
+ indices(n: number, count: number): number[] {
+ const wanted = Math.min(count, n);
+ const pool = new Uint32Array(n);
+ for (let index = 0; index < n; index += 1) {
+ pool[index] = index;
+ }
+ const picked: number[] = [];
+ for (let index = 0; index < wanted; index += 1) {
+ const swap = index + Math.floor(this.source() * (n - index));
+ const value = pool[swap];
+ pool[swap] = pool[index];
+ pool[index] = value;
+ picked.push(value);
+ }
+ return picked.sort((a, b) => a - b);
+ }
+}
+
+/** Rounds to a fixed number of decimals so JSON output is byte-stable. */
+export function round(value: number, decimals = 6): number {
+ const factor = 10 ** decimals;
+ return Math.round(value * factor) / factor;
+}
diff --git a/performance/fixtures/regions.ts b/performance/fixtures/regions.ts
new file mode 100644
index 0000000..7ae335a
--- /dev/null
+++ b/performance/fixtures/regions.ts
@@ -0,0 +1,51 @@
+import type { Camera, Region } from 'react-native-better-maps';
+
+export interface BoundingBox {
+ minLatitude: number;
+ maxLatitude: number;
+ minLongitude: number;
+ maxLongitude: number;
+}
+
+/** Approximate mainland Poland bounding box; all fixtures live inside it. */
+export const POLAND_BOUNDS: BoundingBox = {
+ minLatitude: 49.002,
+ maxLatitude: 54.835,
+ minLongitude: 14.123,
+ maxLongitude: 24.145,
+};
+
+/** Warsaw at city scale: the marker fixtures have their densest hotspot here. */
+export const WARSAW_REGION: Region = {
+ latitude: 52.2297,
+ longitude: 21.0122,
+ latitudeDelta: 0.12,
+ longitudeDelta: 0.12,
+};
+
+/** Whole country: clusters form and re-form as the zoom sweeps across octaves. */
+export const POLAND_REGION: Region = {
+ latitude: 51.92,
+ longitude: 19.13,
+ latitudeDelta: 6.2,
+ longitudeDelta: 10.5,
+};
+
+export const WARSAW_CENTER = { latitude: 52.2297, longitude: 21.0122 };
+export const POLAND_CENTER = { latitude: 51.92, longitude: 19.13 };
+
+export function cameraAt(
+ center: { latitude: number; longitude: number },
+ overrides: Partial> = {},
+): Camera {
+ return {
+ center,
+ zoom: 12,
+ heading: 0,
+ pitch: 0,
+ ...overrides,
+ };
+}
+
+export const WARSAW_CAMERA = cameraAt(WARSAW_CENTER, { zoom: 12 });
+export const POLAND_CAMERA = cameraAt(POLAND_CENTER, { zoom: 6 });
diff --git a/performance/perf.config.ts b/performance/perf.config.ts
new file mode 100644
index 0000000..14fb76d
--- /dev/null
+++ b/performance/perf.config.ts
@@ -0,0 +1,64 @@
+/**
+ * Performance lab configuration shared by the in-app runner and the CLI.
+ *
+ * Regression thresholds are deliberately conservative and, until the
+ * baselines on real devices are proven stable across repeated runs, the
+ * `check` command only fails a run when invoked with `--fail`. See
+ * performance/README.md, "Regression detection".
+ */
+
+export interface RegressionThresholds {
+ /** Average FPS drop, in percent of the baseline, that counts as a regression. */
+ fpsDropPct: number;
+ /** p95 frame-time increase, in percent. */
+ p95FrameTimeIncreasePct: number;
+ /** p99 frame-time increase, in percent. */
+ p99FrameTimeIncreasePct: number;
+ /** Memory after interaction increase, in percent. */
+ memoryIncreasePct: number;
+ /** JS commit time increase (average per commit), in percent. */
+ jsCommitIncreasePct: number;
+ /** Native setter time increase, in percent. */
+ nativeSetterIncreasePct: number;
+ /** Jank ratio increase, in absolute percentage points. */
+ jankRatioIncreasePoints: number;
+ /** Ignore differences smaller than this many milliseconds (noise floor). */
+ minAbsoluteMs: number;
+}
+
+export const REGRESSION_THRESHOLDS: RegressionThresholds = {
+ fpsDropPct: 5,
+ p95FrameTimeIncreasePct: 5,
+ p99FrameTimeIncreasePct: 10,
+ memoryIncreasePct: 10,
+ jsCommitIncreasePct: 10,
+ nativeSetterIncreasePct: 10,
+ jankRatioIncreasePoints: 1,
+ minAbsoluteMs: 0.5,
+};
+
+/**
+ * Suites map a name to scenario selectors (ids, groups, `tag:` or `prefix*`).
+ * `baseline` is what `bun perf baseline` records.
+ */
+export const SUITES: Record = {
+ quick: ['tag:quick'],
+ baseline: ['tag:baseline'],
+ full: ['tag:baseline', 'tag:heavy', 'stability-15m'],
+ markers: ['markers'],
+ camera: ['camera'],
+ mutations: ['mutations'],
+ geometry: ['geometry'],
+ clustering: ['clustering'],
+ combined: ['combined'],
+ stability: ['stability'],
+};
+
+/** Frame budgets per refresh rate; frames longer than `jankFactor` × budget are jank. */
+export const FRAME_BUDGET = {
+ jankFactor: 1.5,
+ longFrameMs: 50,
+};
+
+/** Window length used to derive FPS percentiles ("worst second"). */
+export const FPS_WINDOW_MS = 1000;
diff --git a/performance/results/README.md b/performance/results/README.md
new file mode 100644
index 0000000..01b8b90
--- /dev/null
+++ b/performance/results/README.md
@@ -0,0 +1,7 @@
+# Results
+
+- `baseline//-/` — committed baselines, one directory per device and build variant, written by `bun perf baseline`. `run.json` holds the whole run; `.json` one result each; `summary.md` the rendered scorecard.
+- `runs/` — local runs (gitignored). `bun perf run` writes here; `bun perf compare` reads the latest by default.
+- `bench/` — JS micro-benchmark output (gitignored) from `bun perf bench`.
+
+Result files follow the schema in `performance/app/result.ts`. A metric that could not be measured is `null` and is rendered as `N/A`; nothing is estimated.
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-continuous-pan-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-continuous-pan-10k.json
new file mode 100644
index 0000000..0748b8b
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-continuous-pan-10k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-continuous-pan-10k",
+ "name": "Camera continuous-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six seconds of back-to-back pan legs with no settle between them. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:26.126Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7100,
+ "load": {
+ "commitMs": 14.67,
+ "readyMs": 789,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 5.34,
+ "backgroundMs": 0.87,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 3.39,
+ "avgMs": 1.697,
+ "p50Ms": 0,
+ "p95Ms": 3.394,
+ "maxMs": 3.394,
+ "mainThreadMs": 3.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.08,
+ "p50Ms": 0.08,
+ "p95Ms": 0.08,
+ "maxMs": 0.08,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.557,
+ "p50Ms": 0.557,
+ "p95Ms": 0.557,
+ "maxMs": 0.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.026,
+ "p50Ms": 0.015,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.021,
+ "p50Ms": 0.018,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.16,
+ "avgMs": 0.08,
+ "p50Ms": 0.066,
+ "p95Ms": 0.095,
+ "maxMs": 0.095,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.52,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.146,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.35,
+ "avgMs": 0.673,
+ "p50Ms": 0.004,
+ "p95Ms": 1.343,
+ "maxMs": 1.343,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2720064,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 374,
+ "durationMs": 6245.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 374,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.55,
+ "p50": 17.55,
+ "p95": 17.55,
+ "p99": 17.55,
+ "worst": 17.55
+ },
+ "phaseSharePct": {
+ "unknownDelay": 5.2,
+ "inputHandling": 0,
+ "animation": 3,
+ "layoutMeasure": 0.3,
+ "draw": 4.4,
+ "sync": 0.6,
+ "commandIssue": 4.4,
+ "swapBuffers": 33.7,
+ "gpu": 80.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.8,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 1.5,
+ "sync": 0.2,
+ "commandIssue": 1.6,
+ "swapBuffers": 11.8,
+ "gpu": 28.3,
+ "total": 35.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 740,
+ "p50": 0.07,
+ "p95": 0.19,
+ "p99": 0.41,
+ "max": 5.14
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.72,
+ "max": 21.75
+ },
+ "lateFrames": 0,
+ "busyMs": 69.5,
+ "busyRatio": 0.0111,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6247.1,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 407,
+ "mainThreadMs": 12.67,
+ "backgroundMs": 9.07,
+ "byName": {
+ "camera.apply": {
+ "count": 15,
+ "totalMs": 1.71,
+ "avgMs": 0.114,
+ "p50Ms": 0.109,
+ "p95Ms": 0.304,
+ "maxMs": 0.304,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.97,
+ "avgMs": 0.028,
+ "p50Ms": 0.026,
+ "p95Ms": 0.054,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.97,
+ "items": 350000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 2.41,
+ "avgMs": 0.069,
+ "p50Ms": 0.065,
+ "p95Ms": 0.106,
+ "maxMs": 0.111,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.41,
+ "items": 5514
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 1.1,
+ "avgMs": 0.031,
+ "p50Ms": 0.025,
+ "p95Ms": 0.044,
+ "maxMs": 0.22,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.1,
+ "items": 2888
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 4.59,
+ "avgMs": 0.131,
+ "p50Ms": 0.122,
+ "p95Ms": 0.174,
+ "maxMs": 0.396,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.59,
+ "items": 5514
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 8.46,
+ "avgMs": 0.242,
+ "p50Ms": 0.192,
+ "p95Ms": 0.811,
+ "maxMs": 0.838,
+ "mainThreadMs": 8.46,
+ "backgroundMs": 0,
+ "items": 413
+ },
+ "marker.visualProps": {
+ "count": 217,
+ "totalMs": 2.5,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.026,
+ "maxMs": 0.229,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 254.5,
+ "afterLoadMB": 222.7,
+ "afterInteractionMB": 228.7,
+ "afterCleanupMB": 229,
+ "peakMB": 254.5,
+ "loadDeltaMB": -31.8,
+ "interactionDeltaMB": 6,
+ "retainedAfterCleanupMB": -25.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 254.5,
+ "residentMB": 401.1,
+ "javaHeapMB": 34.7,
+ "nativeHeapMB": 149.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 222.7,
+ "residentMB": 369.3,
+ "javaHeapMB": 34.3,
+ "nativeHeapMB": 118,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 228.7,
+ "residentMB": 375.6,
+ "javaHeapMB": 36.5,
+ "nativeHeapMB": 123,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 229,
+ "residentMB": 375.6,
+ "javaHeapMB": 36.7,
+ "nativeHeapMB": 121.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 398432,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": {
+ "javaBytesAllocated": 11866640,
+ "gcCount": 1,
+ "gcTimeMs": 50,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 5275440
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 740,
+ "wallMs": 6254,
+ "percent": 11.8,
+ "threadsBefore": 83,
+ "threadsAfter": 82,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-0.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-0.json
new file mode 100644
index 0000000..4785d62
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-0.json
@@ -0,0 +1,379 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-0",
+ "name": "Camera fast-pan, 0 markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 0 markers.",
+ "recordedAt": "2026-09-10T14:26:39.011Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4565,
+ "load": {
+ "commitMs": 1.73,
+ "readyMs": 782,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 30976,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 223,
+ "durationMs": 3727.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 223,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 10.97,
+ "p50": 10.97,
+ "p95": 10.97,
+ "p99": 10.97,
+ "worst": 10.97
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.2,
+ "inputHandling": 0,
+ "animation": 8,
+ "layoutMeasure": 2.6,
+ "draw": 2.9,
+ "sync": 2.5,
+ "commandIssue": 14.4,
+ "swapBuffers": 64.8,
+ "gpu": 64.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 1.8,
+ "layoutMeasure": 0.6,
+ "draw": 0.6,
+ "sync": 0.5,
+ "commandIssue": 3.2,
+ "swapBuffers": 14.2,
+ "gpu": 14.1,
+ "total": 21.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 441,
+ "p50": 0.07,
+ "p95": 0.21,
+ "p99": 0.53,
+ "max": 2.12
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 17.68,
+ "max": 18.49
+ },
+ "lateFrames": 0,
+ "busyMs": 42.9,
+ "busyRatio": 0.0115,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3728.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 0.88,
+ "avgMs": 0.126,
+ "p50Ms": 0.12,
+ "p95Ms": 0.188,
+ "maxMs": 0.188,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 249.8,
+ "afterLoadMB": 233.7,
+ "afterInteractionMB": 267.1,
+ "afterCleanupMB": 268.7,
+ "peakMB": 268.7,
+ "loadDeltaMB": -16.1,
+ "interactionDeltaMB": 33.4,
+ "retainedAfterCleanupMB": 18.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 249.8,
+ "residentMB": 396,
+ "javaHeapMB": 29.9,
+ "nativeHeapMB": 155.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 233.7,
+ "residentMB": 379.6,
+ "javaHeapMB": 24.1,
+ "nativeHeapMB": 145,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 267.1,
+ "residentMB": 413.3,
+ "javaHeapMB": 33.6,
+ "nativeHeapMB": 169.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 268.7,
+ "residentMB": 414.9,
+ "javaHeapMB": 39.3,
+ "nativeHeapMB": 164.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 171160,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 14046704,
+ "gcCount": 1,
+ "gcTimeMs": 32,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 25697488
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 625,
+ "wallMs": 3732,
+ "percent": 16.7,
+ "threadsBefore": 73,
+ "threadsAfter": 75,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "region": 1
+ },
+ "payload": {},
+ "largestUpdate": {},
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-10k.json
new file mode 100644
index 0000000..f5dfd16
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-10k.json
@@ -0,0 +1,536 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-10k",
+ "name": "Camera fast-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:15.246Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4592,
+ "load": {
+ "commitMs": 13.95,
+ "readyMs": 782,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 5.4,
+ "backgroundMs": 1.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 2.25,
+ "avgMs": 1.126,
+ "p50Ms": 0,
+ "p95Ms": 2.252,
+ "maxMs": 2.252,
+ "mainThreadMs": 2.25,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.104,
+ "p50Ms": 0.104,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.42,
+ "avgMs": 0.42,
+ "p50Ms": 0.42,
+ "p95Ms": 0.42,
+ "maxMs": 0.42,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.42,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.014,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.21,
+ "avgMs": 0.105,
+ "p50Ms": 0.035,
+ "p95Ms": 0.174,
+ "maxMs": 0.174,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.37,
+ "avgMs": 0.187,
+ "p50Ms": 0.063,
+ "p95Ms": 0.312,
+ "maxMs": 0.312,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.68,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.016,
+ "maxMs": 0.16,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 2.36,
+ "avgMs": 1.18,
+ "p50Ms": 0.003,
+ "p95Ms": 2.357,
+ "maxMs": 2.357,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2720080,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 224,
+ "durationMs": 3735.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 224,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.15,
+ "p50": 17.15,
+ "p95": 17.15,
+ "p99": 17.15,
+ "worst": 17.15
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.8,
+ "inputHandling": 0,
+ "animation": 3,
+ "layoutMeasure": 0.5,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 3.8,
+ "swapBuffers": 73.7,
+ "gpu": 87.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 1,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.1,
+ "commandIssue": 1.3,
+ "swapBuffers": 25.3,
+ "gpu": 29.9,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 444,
+ "p50": 0.07,
+ "p95": 0.17,
+ "p99": 0.42,
+ "max": 2.68
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.47,
+ "max": 22.49
+ },
+ "lateFrames": 0,
+ "busyMs": 41.3,
+ "busyRatio": 0.0111,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3736.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 349,
+ "mainThreadMs": 9.23,
+ "backgroundMs": 5.07,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 0.88,
+ "avgMs": 0.126,
+ "p50Ms": 0.098,
+ "p95Ms": 0.233,
+ "maxMs": 0.233,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 0.53,
+ "avgMs": 0.025,
+ "p50Ms": 0.021,
+ "p95Ms": 0.045,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 210000
+ },
+ "markers.viewportFilter": {
+ "count": 21,
+ "totalMs": 1.52,
+ "avgMs": 0.072,
+ "p50Ms": 0.061,
+ "p95Ms": 0.13,
+ "maxMs": 0.138,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.52,
+ "items": 2984
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.45,
+ "avgMs": 0.021,
+ "p50Ms": 0.019,
+ "p95Ms": 0.027,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 1762
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 2.57,
+ "avgMs": 0.122,
+ "p50Ms": 0.106,
+ "p95Ms": 0.216,
+ "maxMs": 0.25,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.57,
+ "items": 2984
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 6.25,
+ "avgMs": 0.298,
+ "p50Ms": 0.246,
+ "p95Ms": 0.757,
+ "maxMs": 0.961,
+ "mainThreadMs": 6.25,
+ "backgroundMs": 0,
+ "items": 454
+ },
+ "marker.visualProps": {
+ "count": 237,
+ "totalMs": 2.1,
+ "avgMs": 0.009,
+ "p50Ms": 0.006,
+ "p95Ms": 0.021,
+ "maxMs": 0.154,
+ "mainThreadMs": 2.1,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 216.6,
+ "afterLoadMB": 285.8,
+ "afterInteractionMB": 269.3,
+ "afterCleanupMB": 265.7,
+ "peakMB": 285.8,
+ "loadDeltaMB": 69.2,
+ "interactionDeltaMB": -16.5,
+ "retainedAfterCleanupMB": 49.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 216.6,
+ "residentMB": 362.9,
+ "javaHeapMB": 33.1,
+ "nativeHeapMB": 114.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 285.8,
+ "residentMB": 432.2,
+ "javaHeapMB": 38.4,
+ "nativeHeapMB": 180.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 269.3,
+ "residentMB": 416,
+ "javaHeapMB": 34.3,
+ "nativeHeapMB": 166.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 265.7,
+ "residentMB": 412.1,
+ "javaHeapMB": 34.6,
+ "nativeHeapMB": 162.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 259800,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": {
+ "javaBytesAllocated": 10486864,
+ "gcCount": 2,
+ "gcTimeMs": 88,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -14035488
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 847,
+ "wallMs": 3743,
+ "percent": 22.6,
+ "threadsBefore": 82,
+ "threadsAfter": 82,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-1k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-1k.json
new file mode 100644
index 0000000..e5705c1
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-1k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-1k",
+ "name": "Camera fast-pan, 1k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 1000 markers.",
+ "recordedAt": "2026-09-10T14:26:46.033Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4584,
+ "load": {
+ "commitMs": 2.37,
+ "readyMs": 761,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0.31,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.042,
+ "p50Ms": 0,
+ "p95Ms": 0.083,
+ "maxMs": 0.083,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.016,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.012,
+ "p50Ms": 0.009,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.008,
+ "p50Ms": 0.007,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.09,
+ "avgMs": 0.047,
+ "p50Ms": 0.032,
+ "p95Ms": 0.061,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.14,
+ "avgMs": 0.034,
+ "p50Ms": 0.005,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.47,
+ "avgMs": 0.233,
+ "p50Ms": 0.003,
+ "p95Ms": 0.464,
+ "maxMs": 0.464,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 316624,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 222,
+ "durationMs": 3724.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.7,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.74,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 221,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0045,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.74,
+ "p50": 17.74,
+ "p95": 17.74,
+ "p99": 17.74,
+ "worst": 17.74
+ },
+ "phaseSharePct": {
+ "unknownDelay": 7.5,
+ "inputHandling": 0,
+ "animation": 5.6,
+ "layoutMeasure": 0.3,
+ "draw": 0.7,
+ "sync": 0.5,
+ "commandIssue": 3.8,
+ "swapBuffers": 26,
+ "gpu": 81.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.7,
+ "inputHandling": 0,
+ "animation": 2,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.3,
+ "swapBuffers": 9.2,
+ "gpu": 28.8,
+ "total": 35.5
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 441,
+ "p50": 0.07,
+ "p95": 0.23,
+ "p99": 0.72,
+ "max": 5.99
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.48,
+ "max": 45.45
+ },
+ "lateFrames": 2,
+ "busyMs": 48.9,
+ "busyRatio": 0.0131,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3726.1,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 148,
+ "mainThreadMs": 3.36,
+ "backgroundMs": 2.39,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 1.12,
+ "avgMs": 0.159,
+ "p50Ms": 0.157,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 23,
+ "totalMs": 0.52,
+ "avgMs": 0.023,
+ "p50Ms": 0.019,
+ "p95Ms": 0.041,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 23000
+ },
+ "markers.viewportFilter": {
+ "count": 23,
+ "totalMs": 0.42,
+ "avgMs": 0.018,
+ "p50Ms": 0.017,
+ "p95Ms": 0.027,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.42,
+ "items": 358
+ },
+ "markers.diff": {
+ "count": 23,
+ "totalMs": 0.22,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.016,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 188
+ },
+ "markers.viewportCompute": {
+ "count": 23,
+ "totalMs": 1.23,
+ "avgMs": 0.054,
+ "p50Ms": 0.049,
+ "p95Ms": 0.083,
+ "maxMs": 0.115,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 358
+ },
+ "markers.applyDiff": {
+ "count": 22,
+ "totalMs": 1.86,
+ "avgMs": 0.085,
+ "p50Ms": 0.098,
+ "p95Ms": 0.247,
+ "maxMs": 0.251,
+ "mainThreadMs": 1.86,
+ "backgroundMs": 0,
+ "items": 52
+ },
+ "marker.visualProps": {
+ "count": 27,
+ "totalMs": 0.39,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.028,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 268.9,
+ "afterLoadMB": 255.1,
+ "afterInteractionMB": 291.1,
+ "afterCleanupMB": 287.5,
+ "peakMB": 291.1,
+ "loadDeltaMB": -13.8,
+ "interactionDeltaMB": 36,
+ "retainedAfterCleanupMB": 18.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 268.9,
+ "residentMB": 415.1,
+ "javaHeapMB": 39.5,
+ "nativeHeapMB": 165,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 255.1,
+ "residentMB": 401.1,
+ "javaHeapMB": 26.8,
+ "nativeHeapMB": 163.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 291.1,
+ "residentMB": 437.4,
+ "javaHeapMB": 31.7,
+ "nativeHeapMB": 195.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 287.5,
+ "residentMB": 434,
+ "javaHeapMB": 31.9,
+ "nativeHeapMB": 191,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 211064,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 11858112,
+ "gcCount": 1,
+ "gcTimeMs": 30,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 32925520
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 712,
+ "wallMs": 3730,
+ "percent": 19.1,
+ "threadsBefore": 77,
+ "threadsAfter": 77,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-50k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-50k.json
new file mode 100644
index 0000000..b2eb46a
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-fast-pan-50k.json
@@ -0,0 +1,536 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-50k",
+ "name": "Camera fast-pan, 50k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 50000 markers.",
+ "recordedAt": "2026-09-10T14:28:26.764Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4583,
+ "load": {
+ "commitMs": 42.15,
+ "readyMs": 922,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 335,
+ "mainThreadMs": 26.91,
+ "backgroundMs": 3.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 5.72,
+ "avgMs": 2.859,
+ "p50Ms": 0,
+ "p95Ms": 5.717,
+ "maxMs": 5.717,
+ "mainThreadMs": 5.72,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.363,
+ "p50Ms": 2.363,
+ "p95Ms": 2.363,
+ "maxMs": 2.363,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.36,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.17,
+ "avgMs": 0.087,
+ "p50Ms": 0.035,
+ "p95Ms": 0.139,
+ "maxMs": 0.139,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 100000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.22,
+ "avgMs": 0.11,
+ "p50Ms": 0.102,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 826
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.24,
+ "avgMs": 0.118,
+ "p50Ms": 0.046,
+ "p95Ms": 0.189,
+ "maxMs": 0.189,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 626
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.64,
+ "avgMs": 0.321,
+ "p50Ms": 0.202,
+ "p95Ms": 0.439,
+ "maxMs": 0.439,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.64,
+ "items": 826
+ },
+ "marker.visualProps": {
+ "count": 313,
+ "totalMs": 7.44,
+ "avgMs": 0.024,
+ "p50Ms": 0.007,
+ "p95Ms": 0.035,
+ "maxMs": 1.164,
+ "mainThreadMs": 7.44,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 13.63,
+ "avgMs": 6.813,
+ "p50Ms": 0.02,
+ "p95Ms": 13.607,
+ "maxMs": 13.607,
+ "mainThreadMs": 13.63,
+ "backgroundMs": 0,
+ "items": 313
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.007232374999999999,
+ "allocatedBytes": 13898624,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 223,
+ "durationMs": 3723.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 223,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 35.78,
+ "p50": 35.78,
+ "p95": 35.78,
+ "p99": 35.78,
+ "worst": 35.78
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.3,
+ "inputHandling": 0,
+ "animation": 4.3,
+ "layoutMeasure": 1,
+ "draw": 0.8,
+ "sync": 1,
+ "commandIssue": 7.1,
+ "swapBuffers": 84.2,
+ "gpu": 84.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.7,
+ "draw": 0.6,
+ "sync": 0.7,
+ "commandIssue": 5,
+ "swapBuffers": 60.3,
+ "gpu": 60.2,
+ "total": 71.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 441,
+ "p50": 0.06,
+ "p95": 0.19,
+ "p99": 0.33,
+ "max": 0.99
+ },
+ "frameGapMs": {
+ "p50": 16.7,
+ "p95": 17.44,
+ "max": 20.24
+ },
+ "lateFrames": 0,
+ "busyMs": 36.7,
+ "busyRatio": 0.0099,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3724.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1332,
+ "mainThreadMs": 36,
+ "backgroundMs": 18.36,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 0.88,
+ "avgMs": 0.126,
+ "p50Ms": 0.094,
+ "p95Ms": 0.326,
+ "maxMs": 0.326,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 0.69,
+ "avgMs": 0.033,
+ "p50Ms": 0.027,
+ "p95Ms": 0.057,
+ "maxMs": 0.099,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.69,
+ "items": 1050000
+ },
+ "markers.viewportFilter": {
+ "count": 21,
+ "totalMs": 4.43,
+ "avgMs": 0.211,
+ "p50Ms": 0.129,
+ "p95Ms": 0.538,
+ "maxMs": 1.126,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.43,
+ "items": 14991
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 4.02,
+ "avgMs": 0.191,
+ "p50Ms": 0.094,
+ "p95Ms": 0.227,
+ "maxMs": 1.995,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.02,
+ "items": 8687
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 9.22,
+ "avgMs": 0.439,
+ "p50Ms": 0.233,
+ "p95Ms": 1.341,
+ "maxMs": 2.179,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.22,
+ "items": 14991
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 26.06,
+ "avgMs": 1.241,
+ "p50Ms": 1.124,
+ "p95Ms": 3.651,
+ "maxMs": 5.535,
+ "mainThreadMs": 26.06,
+ "backgroundMs": 0,
+ "items": 2334
+ },
+ "marker.visualProps": {
+ "count": 1220,
+ "totalMs": 9.06,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.201,
+ "mainThreadMs": 9.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 278.8,
+ "afterLoadMB": 351.6,
+ "afterInteractionMB": 333.6,
+ "afterCleanupMB": 330,
+ "peakMB": 351.6,
+ "loadDeltaMB": 72.8,
+ "interactionDeltaMB": -18,
+ "retainedAfterCleanupMB": 51.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 278.8,
+ "residentMB": 425.7,
+ "javaHeapMB": 56.5,
+ "nativeHeapMB": 142,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 351.6,
+ "residentMB": 498.4,
+ "javaHeapMB": 63.4,
+ "nativeHeapMB": 202.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 333.6,
+ "residentMB": 480.5,
+ "javaHeapMB": 61.6,
+ "nativeHeapMB": 185.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 330,
+ "residentMB": 476.9,
+ "javaHeapMB": 61.8,
+ "nativeHeapMB": 181.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 372288,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 44
+ },
+ "android": {
+ "javaBytesAllocated": 23555632,
+ "gcCount": 5,
+ "gcTimeMs": 272,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -17253680
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1342,
+ "wallMs": 3741,
+ "percent": 35.9,
+ "threadsBefore": 98,
+ "threadsAfter": 98,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-idle-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-idle-10k.json
new file mode 100644
index 0000000..fe9fb63
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-idle-10k.json
@@ -0,0 +1,457 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-idle-10k",
+ "name": "Camera idle, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "No camera movement for 5 s; measures the resting cost of the scene. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:26:55.631Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5850,
+ "load": {
+ "commitMs": 11.75,
+ "readyMs": 760,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.68,
+ "backgroundMs": 0.86,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.26,
+ "avgMs": 0.631,
+ "p50Ms": 0.001,
+ "p95Ms": 1.261,
+ "maxMs": 1.261,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.059,
+ "p50Ms": 0.059,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.5,
+ "avgMs": 0.505,
+ "p50Ms": 0.505,
+ "p95Ms": 0.505,
+ "maxMs": 0.505,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.5,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.018,
+ "p50Ms": 0.015,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.051,
+ "p50Ms": 0.031,
+ "p95Ms": 0.071,
+ "maxMs": 0.071,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.019,
+ "p50Ms": 0.015,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.18,
+ "avgMs": 0.09,
+ "p50Ms": 0.078,
+ "p95Ms": 0.103,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.79,
+ "avgMs": 0.012,
+ "p50Ms": 0.005,
+ "p95Ms": 0.022,
+ "maxMs": 0.254,
+ "mainThreadMs": 0.79,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.57,
+ "avgMs": 0.783,
+ "p50Ms": 0.004,
+ "p95Ms": 1.561,
+ "maxMs": 1.561,
+ "mainThreadMs": 1.57,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.006446832999999999,
+ "allocatedBytes": 2720392,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 300,
+ "durationMs": 5007.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 300,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.03,
+ "p50": 17.03,
+ "p95": 17.03,
+ "p99": 17.03,
+ "worst": 17.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.7,
+ "inputHandling": 0,
+ "animation": 2.6,
+ "layoutMeasure": 0.3,
+ "draw": 0.4,
+ "sync": 0.6,
+ "commandIssue": 3.5,
+ "swapBuffers": 41.3,
+ "gpu": 89.6
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 0.9,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.2,
+ "commandIssue": 1.2,
+ "swapBuffers": 14.1,
+ "gpu": 30.5,
+ "total": 34.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 554,
+ "p50": 0.16,
+ "p95": 0.55,
+ "p99": 0.96,
+ "max": 2.03
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 18.97,
+ "max": 22.7
+ },
+ "lateFrames": 0,
+ "busyMs": 113.7,
+ "busyRatio": 0.0227,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5008.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "byName": {}
+ },
+ "memory": {
+ "beforeMB": 287.7,
+ "afterLoadMB": 266.7,
+ "afterInteractionMB": 270.3,
+ "afterCleanupMB": 266.3,
+ "peakMB": 287.7,
+ "loadDeltaMB": -21,
+ "interactionDeltaMB": 3.6,
+ "retainedAfterCleanupMB": -21.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 287.7,
+ "residentMB": 434.1,
+ "javaHeapMB": 32,
+ "nativeHeapMB": 191.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 266.7,
+ "residentMB": 413,
+ "javaHeapMB": 30.3,
+ "nativeHeapMB": 169.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 270.3,
+ "residentMB": 416.5,
+ "javaHeapMB": 31.1,
+ "nativeHeapMB": 173.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 266.3,
+ "residentMB": 412.8,
+ "javaHeapMB": 31.2,
+ "nativeHeapMB": 168.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 214008,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": {
+ "javaBytesAllocated": 811104,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 3526592
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 267,
+ "wallMs": 5013,
+ "percent": 5.3,
+ "threadsBefore": 80,
+ "threadsAfter": 77,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-pitch-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-pitch-10k.json
new file mode 100644
index 0000000..e64b00f
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-pitch-10k.json
@@ -0,0 +1,524 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-pitch-10k",
+ "name": "Camera pitch, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Pitch to 45°, 60°, back to 0° at street zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:28:07.997Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3345,
+ "load": {
+ "commitMs": 13.98,
+ "readyMs": 748,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.49,
+ "backgroundMs": 0.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.99,
+ "avgMs": 0.495,
+ "p50Ms": 0.001,
+ "p95Ms": 0.989,
+ "maxMs": 0.989,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.241,
+ "p50Ms": 0.241,
+ "p95Ms": 0.241,
+ "maxMs": 0.241,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.022,
+ "p50Ms": 0.016,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.016,
+ "p50Ms": 0.015,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.12,
+ "avgMs": 0.058,
+ "p50Ms": 0.052,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.45,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.007,
+ "maxMs": 0.142,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.01,
+ "avgMs": 0.504,
+ "p50Ms": 0.004,
+ "p95Ms": 1.004,
+ "maxMs": 1.004,
+ "mainThreadMs": 1.01,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004443374999999999,
+ "allocatedBytes": 2719528,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 150,
+ "durationMs": 2502.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 150,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 79,
+ "renderTotalMs": {
+ "average": 17.81,
+ "p50": 17.08,
+ "p95": 17.7,
+ "p99": 69.61,
+ "worst": 69.61
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.1,
+ "inputHandling": 0,
+ "animation": 0.8,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 2.8,
+ "swapBuffers": 12.7,
+ "gpu": 92.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 87.8,
+ "inputHandling": 0.1,
+ "animation": 23.9,
+ "layoutMeasure": 6.3,
+ "draw": 6.3,
+ "sync": 5.7,
+ "commandIssue": 78,
+ "swapBuffers": 356.8,
+ "gpu": 2593.2,
+ "total": 2813.9
+ },
+ "missedDeadline": 79
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 298,
+ "p50": 0.06,
+ "p95": 0.21,
+ "p99": 0.96,
+ "max": 2.96
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.08,
+ "max": 18.84
+ },
+ "lateFrames": 0,
+ "busyMs": 29.5,
+ "busyRatio": 0.0118,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2504.6,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 68,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 4.03,
+ "byName": {
+ "camera.apply": {
+ "count": 3,
+ "totalMs": 1.12,
+ "avgMs": 0.373,
+ "p50Ms": 0.217,
+ "p95Ms": 0.821,
+ "maxMs": 0.821,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 13,
+ "totalMs": 1.14,
+ "avgMs": 0.087,
+ "p50Ms": 0.014,
+ "p95Ms": 0.837,
+ "maxMs": 0.837,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 130000
+ },
+ "markers.viewportFilter": {
+ "count": 13,
+ "totalMs": 0.33,
+ "avgMs": 0.026,
+ "p50Ms": 0.014,
+ "p95Ms": 0.101,
+ "maxMs": 0.101,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.33,
+ "items": 703
+ },
+ "markers.diff": {
+ "count": 13,
+ "totalMs": 0.44,
+ "avgMs": 0.034,
+ "p50Ms": 0.01,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 270
+ },
+ "markers.viewportCompute": {
+ "count": 13,
+ "totalMs": 2.11,
+ "avgMs": 0.163,
+ "p50Ms": 0.052,
+ "p95Ms": 1.027,
+ "maxMs": 1.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.11,
+ "items": 703
+ },
+ "markers.applyDiff": {
+ "count": 13,
+ "totalMs": 0.4,
+ "avgMs": 0.031,
+ "p50Ms": 0.004,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0.4,
+ "backgroundMs": 0,
+ "items": 54
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 253.2,
+ "afterLoadMB": 316,
+ "afterInteractionMB": 287.4,
+ "afterCleanupMB": 283.4,
+ "peakMB": 316,
+ "loadDeltaMB": 62.8,
+ "interactionDeltaMB": -28.6,
+ "retainedAfterCleanupMB": 30.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 253.2,
+ "residentMB": 400,
+ "javaHeapMB": 50.9,
+ "nativeHeapMB": 123.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 316,
+ "residentMB": 462.9,
+ "javaHeapMB": 56.3,
+ "nativeHeapMB": 182.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 287.4,
+ "residentMB": 434.4,
+ "javaHeapMB": 58.4,
+ "nativeHeapMB": 152.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 283.4,
+ "residentMB": 430.4,
+ "javaHeapMB": 58.5,
+ "nativeHeapMB": 147.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 140584,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": {
+ "javaBytesAllocated": 21069184,
+ "gcCount": 1,
+ "gcTimeMs": 58,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -31317184
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1244,
+ "wallMs": 2511,
+ "percent": 49.6,
+ "threadsBefore": 95,
+ "threadsAfter": 95,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rapid-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rapid-10k.json
new file mode 100644
index 0000000..27e5542
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rapid-10k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-rapid-10k",
+ "name": "Camera rapid, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Twenty 150 ms flicks mixing small pans and half-zoom steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:28:16.711Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4976,
+ "load": {
+ "commitMs": 12.13,
+ "readyMs": 754,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.98,
+ "avgMs": 0.491,
+ "p50Ms": 0,
+ "p95Ms": 0.982,
+ "maxMs": 0.982,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.064,
+ "p50Ms": 0.064,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.219,
+ "p50Ms": 0.219,
+ "p95Ms": 0.219,
+ "maxMs": 0.219,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.041,
+ "p50Ms": 0.038,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.51,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.166,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.58,
+ "avgMs": 0.788,
+ "p50Ms": 0.003,
+ "p95Ms": 1.573,
+ "maxMs": 1.573,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2719664,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 246,
+ "durationMs": 4104,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 246,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.4,
+ "p50": 17.4,
+ "p95": 17.4,
+ "p99": 17.4,
+ "worst": 17.4
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.5,
+ "inputHandling": 0,
+ "animation": 2.1,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 5.8,
+ "swapBuffers": 32,
+ "gpu": 86.4
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.6,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 2,
+ "swapBuffers": 11.1,
+ "gpu": 30.1,
+ "total": 34.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 487,
+ "p50": 0.07,
+ "p95": 0.27,
+ "p99": 0.58,
+ "max": 3.52
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.47,
+ "max": 21.57
+ },
+ "lateFrames": 0,
+ "busyMs": 54.3,
+ "busyRatio": 0.0132,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4105.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 556,
+ "mainThreadMs": 17.65,
+ "backgroundMs": 4.83,
+ "byName": {
+ "camera.apply": {
+ "count": 21,
+ "totalMs": 2.48,
+ "avgMs": 0.118,
+ "p50Ms": 0.097,
+ "p95Ms": 0.265,
+ "maxMs": 0.287,
+ "mainThreadMs": 2.48,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 23,
+ "totalMs": 0.71,
+ "avgMs": 0.031,
+ "p50Ms": 0.017,
+ "p95Ms": 0.125,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.71,
+ "items": 230000
+ },
+ "markers.viewportFilter": {
+ "count": 23,
+ "totalMs": 1.15,
+ "avgMs": 0.05,
+ "p50Ms": 0.022,
+ "p95Ms": 0.117,
+ "maxMs": 0.513,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.15,
+ "items": 2477
+ },
+ "markers.diff": {
+ "count": 23,
+ "totalMs": 0.46,
+ "avgMs": 0.02,
+ "p50Ms": 0.015,
+ "p95Ms": 0.041,
+ "maxMs": 0.102,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 1279
+ },
+ "markers.viewportCompute": {
+ "count": 23,
+ "totalMs": 2.51,
+ "avgMs": 0.109,
+ "p50Ms": 0.055,
+ "p95Ms": 0.313,
+ "maxMs": 0.7,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.51,
+ "items": 2477
+ },
+ "markers.applyDiff": {
+ "count": 23,
+ "totalMs": 11.21,
+ "avgMs": 0.487,
+ "p50Ms": 0.074,
+ "p95Ms": 1.807,
+ "maxMs": 3.462,
+ "mainThreadMs": 11.21,
+ "backgroundMs": 0,
+ "items": 837
+ },
+ "marker.visualProps": {
+ "count": 420,
+ "totalMs": 3.96,
+ "avgMs": 0.009,
+ "p50Ms": 0.006,
+ "p95Ms": 0.018,
+ "maxMs": 0.282,
+ "mainThreadMs": 3.96,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 283.5,
+ "afterLoadMB": 352.6,
+ "afterInteractionMB": 293.1,
+ "afterCleanupMB": 289.3,
+ "peakMB": 352.6,
+ "loadDeltaMB": 69.1,
+ "interactionDeltaMB": -59.5,
+ "retainedAfterCleanupMB": 5.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 283.5,
+ "residentMB": 430.4,
+ "javaHeapMB": 58.6,
+ "nativeHeapMB": 147.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 352.6,
+ "residentMB": 499.3,
+ "javaHeapMB": 64,
+ "nativeHeapMB": 213.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 293.1,
+ "residentMB": 439.9,
+ "javaHeapMB": 56,
+ "nativeHeapMB": 159.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 289.3,
+ "residentMB": 436.1,
+ "javaHeapMB": 56.4,
+ "nativeHeapMB": 154.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 359680,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": {
+ "javaBytesAllocated": 15783744,
+ "gcCount": 3,
+ "gcTimeMs": 185,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -56915424
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1124,
+ "wallMs": 4111,
+ "percent": 27.3,
+ "threadsBefore": 97,
+ "threadsAfter": 96,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rapid-zoom-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rapid-zoom-10k.json
new file mode 100644
index 0000000..e625e7c
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rapid-zoom-10k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-rapid-zoom-10k",
+ "name": "Camera rapid-zoom, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Ten alternating zoom jumps of 300 ms each across three octaves. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:52.962Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4529,
+ "load": {
+ "commitMs": 10.46,
+ "readyMs": 762,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 4.72,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.83,
+ "avgMs": 0.917,
+ "p50Ms": 0,
+ "p95Ms": 1.833,
+ "maxMs": 1.833,
+ "mainThreadMs": 1.83,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.201,
+ "p50Ms": 0.201,
+ "p95Ms": 0.201,
+ "maxMs": 0.201,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.018,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.018,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.12,
+ "avgMs": 0.059,
+ "p50Ms": 0.047,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 1.03,
+ "avgMs": 0.016,
+ "p50Ms": 0.004,
+ "p95Ms": 0.027,
+ "maxMs": 0.484,
+ "mainThreadMs": 1.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.79,
+ "avgMs": 0.896,
+ "p50Ms": 0.004,
+ "p95Ms": 1.789,
+ "maxMs": 1.789,
+ "mainThreadMs": 1.79,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.006687542000000005,
+ "allocatedBytes": 2719752,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 220,
+ "durationMs": 3672.4,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 220,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 36.63,
+ "p50": 36.63,
+ "p95": 36.63,
+ "p99": 36.63,
+ "worst": 36.63
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.3,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.9,
+ "swapBuffers": 60.7,
+ "gpu": 92
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 2.3,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 44.5,
+ "gpu": 67.4,
+ "total": 73.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 438,
+ "p50": 0.06,
+ "p95": 0.19,
+ "p99": 1,
+ "max": 4.75
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.49,
+ "max": 23.22
+ },
+ "lateFrames": 0,
+ "busyMs": 44,
+ "busyRatio": 0.012,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3673.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1891,
+ "mainThreadMs": 42.87,
+ "backgroundMs": 5.37,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.06,
+ "avgMs": 0.106,
+ "p50Ms": 0.097,
+ "p95Ms": 0.178,
+ "maxMs": 0.178,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 19,
+ "totalMs": 0.49,
+ "avgMs": 0.026,
+ "p50Ms": 0.025,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 190000
+ },
+ "markers.viewportFilter": {
+ "count": 19,
+ "totalMs": 1.42,
+ "avgMs": 0.075,
+ "p50Ms": 0.029,
+ "p95Ms": 0.269,
+ "maxMs": 0.269,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.42,
+ "items": 6148
+ },
+ "markers.diff": {
+ "count": 19,
+ "totalMs": 0.75,
+ "avgMs": 0.039,
+ "p50Ms": 0.038,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.75,
+ "items": 2732
+ },
+ "markers.viewportCompute": {
+ "count": 19,
+ "totalMs": 2.71,
+ "avgMs": 0.143,
+ "p50Ms": 0.1,
+ "p95Ms": 0.348,
+ "maxMs": 0.348,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.71,
+ "items": 6148
+ },
+ "markers.applyDiff": {
+ "count": 19,
+ "totalMs": 30.14,
+ "avgMs": 1.587,
+ "p50Ms": 0.999,
+ "p95Ms": 4.934,
+ "maxMs": 4.934,
+ "mainThreadMs": 30.14,
+ "backgroundMs": 0,
+ "items": 3550
+ },
+ "marker.visualProps": {
+ "count": 1786,
+ "totalMs": 11.66,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.009,
+ "maxMs": 0.5,
+ "mainThreadMs": 11.66,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 270.9,
+ "afterLoadMB": 248.3,
+ "afterInteractionMB": 334.6,
+ "afterCleanupMB": 330.6,
+ "peakMB": 334.6,
+ "loadDeltaMB": -22.6,
+ "interactionDeltaMB": 86.3,
+ "retainedAfterCleanupMB": 59.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 270.9,
+ "residentMB": 417.6,
+ "javaHeapMB": 48.5,
+ "nativeHeapMB": 147.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 248.3,
+ "residentMB": 395.2,
+ "javaHeapMB": 45.4,
+ "nativeHeapMB": 126.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 334.6,
+ "residentMB": 481.5,
+ "javaHeapMB": 51.8,
+ "nativeHeapMB": 205.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 330.6,
+ "residentMB": 477.6,
+ "javaHeapMB": 52.1,
+ "nativeHeapMB": 201.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 437600,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": {
+ "javaBytesAllocated": 40816896,
+ "gcCount": 6,
+ "gcTimeMs": 222,
+ "blockingGcCount": 2,
+ "nativeHeapDeltaBytes": 83479552
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1252,
+ "wallMs": 3681,
+ "percent": 34,
+ "threadsBefore": 89,
+ "threadsAfter": 88,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rotate-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rotate-10k.json
new file mode 100644
index 0000000..f401b5b
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-rotate-10k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-rotate-10k",
+ "name": "Camera rotate, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four heading changes of 90° at city zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:28:00.931Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4192,
+ "load": {
+ "commitMs": 9.93,
+ "readyMs": 776,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.4,
+ "backgroundMs": 0.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.71,
+ "avgMs": 0.355,
+ "p50Ms": 0,
+ "p95Ms": 0.711,
+ "maxMs": 0.711,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.282,
+ "p50Ms": 0.282,
+ "p95Ms": 0.282,
+ "maxMs": 0.282,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.28,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.014,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.021,
+ "p50Ms": 0.019,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.055,
+ "p50Ms": 0.048,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.51,
+ "avgMs": 0.008,
+ "p50Ms": 0.004,
+ "p95Ms": 0.007,
+ "maxMs": 0.215,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.13,
+ "avgMs": 0.564,
+ "p50Ms": 0.004,
+ "p95Ms": 1.125,
+ "maxMs": 1.125,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0023214160000000067,
+ "allocatedBytes": 2719736,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 199,
+ "durationMs": 3334.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 199,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 175,
+ "renderTotalMs": {
+ "average": 17.4,
+ "p50": 17.06,
+ "p95": 20.35,
+ "p99": 22.97,
+ "worst": 29.97
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.3,
+ "inputHandling": 0,
+ "animation": 1.2,
+ "layoutMeasure": 0.3,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 3.6,
+ "swapBuffers": 21.1,
+ "gpu": 88.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 200,
+ "inputHandling": 0.4,
+ "animation": 75.8,
+ "layoutMeasure": 17.9,
+ "draw": 16.6,
+ "sync": 19.3,
+ "commandIssue": 218.8,
+ "swapBuffers": 1287.6,
+ "gpu": 5402.7,
+ "total": 6090.7
+ },
+ "missedDeadline": 175
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 398,
+ "p50": 0.07,
+ "p95": 0.25,
+ "p99": 1.46,
+ "max": 4.5
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.5,
+ "max": 22.28
+ },
+ "lateFrames": 0,
+ "busyMs": 48,
+ "busyRatio": 0.0144,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3336.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 613,
+ "mainThreadMs": 45.29,
+ "backgroundMs": 3.94,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.65,
+ "avgMs": 0.161,
+ "p50Ms": 0.104,
+ "p95Ms": 0.334,
+ "maxMs": 0.334,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.58,
+ "avgMs": 0.036,
+ "p50Ms": 0.024,
+ "p95Ms": 0.215,
+ "maxMs": 0.215,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.66,
+ "avgMs": 0.041,
+ "p50Ms": 0.039,
+ "p95Ms": 0.073,
+ "maxMs": 0.073,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.66,
+ "items": 4056
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.69,
+ "avgMs": 0.043,
+ "p50Ms": 0.035,
+ "p95Ms": 0.206,
+ "maxMs": 0.206,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.69,
+ "items": 2186
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 2,
+ "avgMs": 0.125,
+ "p50Ms": 0.101,
+ "p95Ms": 0.279,
+ "maxMs": 0.279,
+ "mainThreadMs": 0,
+ "backgroundMs": 2,
+ "items": 4056
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 29.86,
+ "avgMs": 1.866,
+ "p50Ms": 0.405,
+ "p95Ms": 15.206,
+ "maxMs": 15.206,
+ "mainThreadMs": 29.86,
+ "backgroundMs": 0,
+ "items": 999
+ },
+ "marker.visualProps": {
+ "count": 529,
+ "totalMs": 14.78,
+ "avgMs": 0.028,
+ "p50Ms": 0.006,
+ "p95Ms": 0.034,
+ "maxMs": 4.255,
+ "mainThreadMs": 14.78,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 330.1,
+ "afterLoadMB": 294.7,
+ "afterInteractionMB": 257.1,
+ "afterCleanupMB": 253.3,
+ "peakMB": 330.1,
+ "loadDeltaMB": -35.4,
+ "interactionDeltaMB": -37.6,
+ "retainedAfterCleanupMB": -76.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 330.1,
+ "residentMB": 477.1,
+ "javaHeapMB": 52.2,
+ "nativeHeapMB": 201.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 294.7,
+ "residentMB": 441.6,
+ "javaHeapMB": 49.5,
+ "nativeHeapMB": 166.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 257.1,
+ "residentMB": 404,
+ "javaHeapMB": 50.6,
+ "nativeHeapMB": 127.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 253.3,
+ "residentMB": 400.1,
+ "javaHeapMB": 50.8,
+ "nativeHeapMB": 123.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 308000,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": {
+ "javaBytesAllocated": 10701648,
+ "gcCount": 2,
+ "gcTimeMs": 149,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -40778160
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1084,
+ "wallMs": 3342,
+ "percent": 32.4,
+ "threadsBefore": 91,
+ "threadsAfter": 91,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-slow-pan-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-slow-pan-10k.json
new file mode 100644
index 0000000..c086ca0
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-slow-pan-10k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-slow-pan-10k",
+ "name": "Camera slow-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four slow animated pan legs (1.2 s each, small steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:06.880Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7529,
+ "load": {
+ "commitMs": 13.29,
+ "readyMs": 735,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.72,
+ "backgroundMs": 0.8,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.99,
+ "avgMs": 0.495,
+ "p50Ms": 0,
+ "p95Ms": 0.99,
+ "maxMs": 0.99,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.098,
+ "p50Ms": 0.098,
+ "p95Ms": 0.098,
+ "maxMs": 0.098,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.323,
+ "p50Ms": 0.323,
+ "p95Ms": 0.323,
+ "maxMs": 0.323,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.051,
+ "p50Ms": 0.028,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.049,
+ "p50Ms": 0.026,
+ "p95Ms": 0.071,
+ "maxMs": 0.071,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.24,
+ "avgMs": 0.121,
+ "p50Ms": 0.071,
+ "p95Ms": 0.172,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.47,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.16,
+ "avgMs": 0.58,
+ "p50Ms": 0.003,
+ "p95Ms": 1.157,
+ "maxMs": 1.157,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002820749999999997,
+ "allocatedBytes": 2720032,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 400,
+ "durationMs": 6671.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 400,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 12.88,
+ "p50": 12.88,
+ "p95": 12.88,
+ "p99": 12.88,
+ "worst": 12.88
+ },
+ "phaseSharePct": {
+ "unknownDelay": 8.3,
+ "inputHandling": 0,
+ "animation": 4.8,
+ "layoutMeasure": 0.9,
+ "draw": 0.6,
+ "sync": 0.6,
+ "commandIssue": 5.2,
+ "swapBuffers": 78.7,
+ "gpu": 78.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.1,
+ "inputHandling": 0,
+ "animation": 1.2,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.3,
+ "swapBuffers": 20.3,
+ "gpu": 20.2,
+ "total": 25.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 791,
+ "p50": 0.07,
+ "p95": 0.19,
+ "p99": 0.41,
+ "max": 6.4
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.28,
+ "max": 23.04
+ },
+ "lateFrames": 0,
+ "busyMs": 78.6,
+ "busyRatio": 0.0118,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6672.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 255,
+ "mainThreadMs": 6.04,
+ "backgroundMs": 8.94,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.84,
+ "avgMs": 0.168,
+ "p50Ms": 0.122,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.96,
+ "avgMs": 0.027,
+ "p50Ms": 0.022,
+ "p95Ms": 0.062,
+ "maxMs": 0.133,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 350000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 2.61,
+ "avgMs": 0.075,
+ "p50Ms": 0.076,
+ "p95Ms": 0.107,
+ "maxMs": 0.136,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.61,
+ "items": 4921
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.84,
+ "avgMs": 0.024,
+ "p50Ms": 0.022,
+ "p95Ms": 0.037,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.84,
+ "items": 2900
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 4.52,
+ "avgMs": 0.129,
+ "p50Ms": 0.122,
+ "p95Ms": 0.214,
+ "maxMs": 0.256,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.52,
+ "items": 4921
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 4.42,
+ "avgMs": 0.126,
+ "p50Ms": 0.106,
+ "p95Ms": 0.466,
+ "maxMs": 0.873,
+ "mainThreadMs": 4.42,
+ "backgroundMs": 0,
+ "items": 129
+ },
+ "marker.visualProps": {
+ "count": 75,
+ "totalMs": 0.78,
+ "avgMs": 0.01,
+ "p50Ms": 0.007,
+ "p95Ms": 0.024,
+ "maxMs": 0.027,
+ "mainThreadMs": 0.78,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 266.5,
+ "afterLoadMB": 239.5,
+ "afterInteractionMB": 220.3,
+ "afterCleanupMB": 216.5,
+ "peakMB": 266.5,
+ "loadDeltaMB": -27,
+ "interactionDeltaMB": -19.2,
+ "retainedAfterCleanupMB": -50,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 266.5,
+ "residentMB": 413,
+ "javaHeapMB": 31.4,
+ "nativeHeapMB": 168.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 239.5,
+ "residentMB": 386,
+ "javaHeapMB": 30.5,
+ "nativeHeapMB": 140.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 220.3,
+ "residentMB": 366.9,
+ "javaHeapMB": 32.8,
+ "nativeHeapMB": 119.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 216.5,
+ "residentMB": 362.9,
+ "javaHeapMB": 32.9,
+ "nativeHeapMB": 114.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 357168,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": {
+ "javaBytesAllocated": 13132944,
+ "gcCount": 1,
+ "gcTimeMs": 48,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -22596064
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 946,
+ "wallMs": 6679,
+ "percent": 14.2,
+ "threadsBefore": 80,
+ "threadsAfter": 80,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-zoom-in-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-zoom-in-10k.json
new file mode 100644
index 0000000..ca10efd
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-zoom-in-10k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-zoom-in-10k",
+ "name": "Camera zoom-in, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from country scale into street scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:35.416Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5531,
+ "load": {
+ "commitMs": 10.13,
+ "readyMs": 753,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 4.19,
+ "backgroundMs": 3.41,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.72,
+ "avgMs": 0.858,
+ "p50Ms": 0,
+ "p95Ms": 1.716,
+ "maxMs": 1.716,
+ "mainThreadMs": 1.72,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.042,
+ "p50Ms": 0.042,
+ "p95Ms": 0.042,
+ "maxMs": 0.042,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.301,
+ "p50Ms": 0.301,
+ "p95Ms": 0.301,
+ "maxMs": 0.301,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.027,
+ "p50Ms": 0.014,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 1.47,
+ "avgMs": 0.733,
+ "p50Ms": 0.033,
+ "p95Ms": 1.433,
+ "maxMs": 1.433,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.47,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 1.56,
+ "avgMs": 0.778,
+ "p50Ms": 0.064,
+ "p95Ms": 1.493,
+ "maxMs": 1.493,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.56,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.7,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.358,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.73,
+ "avgMs": 0.867,
+ "p50Ms": 0.004,
+ "p95Ms": 1.73,
+ "maxMs": 1.73,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.010434541000000006,
+ "allocatedBytes": 2720104,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 280,
+ "durationMs": 4670.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 280,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.18,
+ "p50": 17.18,
+ "p95": 17.18,
+ "p99": 17.18,
+ "worst": 17.18
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.2,
+ "inputHandling": 0,
+ "animation": 4.9,
+ "layoutMeasure": 0.5,
+ "draw": 0.7,
+ "sync": 0.9,
+ "commandIssue": 6.4,
+ "swapBuffers": 74.8,
+ "gpu": 82.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 1.7,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 2.2,
+ "swapBuffers": 25.7,
+ "gpu": 28.5,
+ "total": 34.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 557,
+ "p50": 0.07,
+ "p95": 0.2,
+ "p99": 0.46,
+ "max": 1.77
+ },
+ "frameGapMs": {
+ "p50": 16.64,
+ "p95": 17.7,
+ "max": 20.27
+ },
+ "lateFrames": 0,
+ "busyMs": 50.5,
+ "busyRatio": 0.0108,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4671.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2460,
+ "mainThreadMs": 51.16,
+ "backgroundMs": 18.27,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.67,
+ "avgMs": 0.135,
+ "p50Ms": 0.1,
+ "p95Ms": 0.279,
+ "maxMs": 0.279,
+ "mainThreadMs": 0.67,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 26,
+ "totalMs": 1.12,
+ "avgMs": 0.043,
+ "p50Ms": 0.033,
+ "p95Ms": 0.128,
+ "maxMs": 0.151,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.12,
+ "items": 260000
+ },
+ "markers.viewportFilter": {
+ "count": 26,
+ "totalMs": 7.06,
+ "avgMs": 0.271,
+ "p50Ms": 0.052,
+ "p95Ms": 0.938,
+ "maxMs": 1.601,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.06,
+ "items": 22782
+ },
+ "markers.diff": {
+ "count": 26,
+ "totalMs": 0.92,
+ "avgMs": 0.036,
+ "p50Ms": 0.03,
+ "p95Ms": 0.082,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.92,
+ "items": 3879
+ },
+ "markers.viewportCompute": {
+ "count": 26,
+ "totalMs": 9.17,
+ "avgMs": 0.353,
+ "p50Ms": 0.128,
+ "p95Ms": 1.151,
+ "maxMs": 1.798,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.17,
+ "items": 22782
+ },
+ "markers.applyDiff": {
+ "count": 26,
+ "totalMs": 36.24,
+ "avgMs": 1.394,
+ "p50Ms": 0.098,
+ "p95Ms": 4.317,
+ "maxMs": 4.628,
+ "mainThreadMs": 36.24,
+ "backgroundMs": 0,
+ "items": 4714
+ },
+ "marker.visualProps": {
+ "count": 2325,
+ "totalMs": 14.25,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.008,
+ "maxMs": 0.565,
+ "mainThreadMs": 14.25,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 229.1,
+ "afterLoadMB": 294.1,
+ "afterInteractionMB": 263.4,
+ "afterCleanupMB": 261,
+ "peakMB": 294.1,
+ "loadDeltaMB": 65,
+ "interactionDeltaMB": -30.7,
+ "retainedAfterCleanupMB": 31.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 229.1,
+ "residentMB": 375.6,
+ "javaHeapMB": 36.8,
+ "nativeHeapMB": 121.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 294.1,
+ "residentMB": 440.6,
+ "javaHeapMB": 42.2,
+ "nativeHeapMB": 181.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 263.4,
+ "residentMB": 410.3,
+ "javaHeapMB": 52.9,
+ "nativeHeapMB": 138.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 261,
+ "residentMB": 407.8,
+ "javaHeapMB": 53.2,
+ "nativeHeapMB": 135.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 590472,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": {
+ "javaBytesAllocated": 41814528,
+ "gcCount": 8,
+ "gcTimeMs": 248,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -44409872
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1159,
+ "wallMs": 4685,
+ "percent": 24.7,
+ "threadsBefore": 85,
+ "threadsAfter": 87,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-zoom-out-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-zoom-out-10k.json
new file mode 100644
index 0000000..b8522a4
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/camera-zoom-out-10k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-zoom-out-10k",
+ "name": "Camera zoom-out, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from street scale out to country scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:44.676Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5525,
+ "load": {
+ "commitMs": 10.79,
+ "readyMs": 751,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.01,
+ "backgroundMs": 1.35,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.22,
+ "avgMs": 0.608,
+ "p50Ms": 0,
+ "p95Ms": 1.216,
+ "maxMs": 1.216,
+ "mainThreadMs": 1.22,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.137,
+ "p50Ms": 0.137,
+ "p95Ms": 0.137,
+ "maxMs": 0.137,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.86,
+ "avgMs": 0.858,
+ "p50Ms": 0.858,
+ "p95Ms": 0.858,
+ "maxMs": 0.858,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.86,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.054,
+ "p50Ms": 0.02,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.051,
+ "p50Ms": 0.024,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.25,
+ "avgMs": 0.124,
+ "p50Ms": 0.059,
+ "p95Ms": 0.188,
+ "maxMs": 0.188,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.52,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.008,
+ "maxMs": 0.186,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.13,
+ "avgMs": 0.567,
+ "p50Ms": 0.003,
+ "p95Ms": 1.132,
+ "maxMs": 1.132,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003150374999999997,
+ "allocatedBytes": 2719872,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 280,
+ "durationMs": 4671.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 280,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.96,
+ "p50": 16.96,
+ "p95": 16.96,
+ "p99": 16.96,
+ "worst": 16.96
+ },
+ "phaseSharePct": {
+ "unknownDelay": 6.4,
+ "inputHandling": 0,
+ "animation": 4.8,
+ "layoutMeasure": 0.5,
+ "draw": 0.6,
+ "sync": 0.5,
+ "commandIssue": 4.3,
+ "swapBuffers": 39.6,
+ "gpu": 82.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.2,
+ "inputHandling": 0,
+ "animation": 1.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.4,
+ "swapBuffers": 13.4,
+ "gpu": 27.9,
+ "total": 33.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 555,
+ "p50": 0.07,
+ "p95": 0.18,
+ "p99": 0.39,
+ "max": 1.56
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.43,
+ "max": 21.58
+ },
+ "lateFrames": 0,
+ "busyMs": 50.2,
+ "busyRatio": 0.0107,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4672.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1580,
+ "mainThreadMs": 42.5,
+ "backgroundMs": 12.99,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.93,
+ "avgMs": 0.186,
+ "p50Ms": 0.196,
+ "p95Ms": 0.325,
+ "maxMs": 0.325,
+ "mainThreadMs": 0.93,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 26,
+ "totalMs": 0.94,
+ "avgMs": 0.036,
+ "p50Ms": 0.023,
+ "p95Ms": 0.07,
+ "maxMs": 0.122,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 260000
+ },
+ "markers.viewportFilter": {
+ "count": 26,
+ "totalMs": 4.8,
+ "avgMs": 0.185,
+ "p50Ms": 0.045,
+ "p95Ms": 0.725,
+ "maxMs": 1.287,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.8,
+ "items": 14111
+ },
+ "markers.diff": {
+ "count": 26,
+ "totalMs": 0.71,
+ "avgMs": 0.027,
+ "p50Ms": 0.018,
+ "p95Ms": 0.075,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.71,
+ "items": 2732
+ },
+ "markers.viewportCompute": {
+ "count": 26,
+ "totalMs": 6.54,
+ "avgMs": 0.251,
+ "p50Ms": 0.083,
+ "p95Ms": 0.903,
+ "maxMs": 1.417,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.54,
+ "items": 14111
+ },
+ "markers.applyDiff": {
+ "count": 26,
+ "totalMs": 30.39,
+ "avgMs": 1.169,
+ "p50Ms": 0.156,
+ "p95Ms": 5.432,
+ "maxMs": 8.608,
+ "mainThreadMs": 30.39,
+ "backgroundMs": 0,
+ "items": 2760
+ },
+ "marker.visualProps": {
+ "count": 1445,
+ "totalMs": 11.18,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.561,
+ "mainThreadMs": 11.18,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 260.3,
+ "afterLoadMB": 250.7,
+ "afterInteractionMB": 272.4,
+ "afterCleanupMB": 271.2,
+ "peakMB": 272.4,
+ "loadDeltaMB": -9.6,
+ "interactionDeltaMB": 21.7,
+ "retainedAfterCleanupMB": 10.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 260.3,
+ "residentMB": 406.9,
+ "javaHeapMB": 53.4,
+ "nativeHeapMB": 135.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 250.7,
+ "residentMB": 397.4,
+ "javaHeapMB": 42.4,
+ "nativeHeapMB": 133.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 272.4,
+ "residentMB": 420.5,
+ "javaHeapMB": 47.4,
+ "nativeHeapMB": 151.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 271.2,
+ "residentMB": 418.2,
+ "javaHeapMB": 48.3,
+ "nativeHeapMB": 147.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 444880,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": {
+ "javaBytesAllocated": 37898160,
+ "gcCount": 5,
+ "gcTimeMs": 192,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 18715296
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1177,
+ "wallMs": 4680,
+ "percent": 25.1,
+ "threadsBefore": 88,
+ "threadsAfter": 88,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-10k.json
new file mode 100644
index 0000000..f2dccc5
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-10k.json
@@ -0,0 +1,909 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "cluster-10k",
+ "name": "Clustering, 10k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "10000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:31:16.150Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10939,
+ "load": {
+ "commitMs": 10.52,
+ "readyMs": 618,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 11.25,
+ "backgroundMs": 9.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.13,
+ "avgMs": 0.376,
+ "p50Ms": 0.001,
+ "p95Ms": 1.129,
+ "maxMs": 1.129,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.242,
+ "p50Ms": 0.242,
+ "p95Ms": 0.242,
+ "maxMs": 0.242,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.62,
+ "avgMs": 0.309,
+ "p50Ms": 0.262,
+ "p95Ms": 0.356,
+ "maxMs": 0.356,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 3.95,
+ "avgMs": 1.975,
+ "p50Ms": 1.874,
+ "p95Ms": 2.075,
+ "maxMs": 2.075,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.95,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.01,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 52
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 4.62,
+ "avgMs": 2.309,
+ "p50Ms": 2.168,
+ "p95Ms": 2.449,
+ "maxMs": 2.449,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.62,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 10.08,
+ "avgMs": 5.04,
+ "p50Ms": 0.004,
+ "p95Ms": 10.077,
+ "maxMs": 10.077,
+ "mainThreadMs": 10.08,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005132042000000003,
+ "allocatedBytes": 2709200,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 601,
+ "durationMs": 10046.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.69,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 600,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0017,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.03,
+ "p50": 17.03,
+ "p95": 17.03,
+ "p99": 17.03,
+ "worst": 17.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.2,
+ "inputHandling": 0,
+ "animation": 2.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 4.2,
+ "swapBuffers": 43.8,
+ "gpu": 89.6
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 0.9,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 14.9,
+ "gpu": 30.5,
+ "total": 34.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 1185,
+ "p50": 0.06,
+ "p95": 0.21,
+ "p99": 0.81,
+ "max": 5.6
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.54,
+ "max": 34.52
+ },
+ "lateFrames": 1,
+ "busyMs": 121.5,
+ "busyRatio": 0.0121,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10048.1,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.16,
+ "avgMs": 11.16,
+ "p95Ms": 11.16,
+ "maxMs": 11.16
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.102,
+ "maxMs": 6.102
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.083,
+ "maxMs": 1.083
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 587,
+ "mainThreadMs": 80.57,
+ "backgroundMs": 170.07,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 0.99,
+ "avgMs": 0.099,
+ "p50Ms": 0.085,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 10.22,
+ "avgMs": 0.193,
+ "p50Ms": 0.229,
+ "p95Ms": 0.345,
+ "maxMs": 0.467,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.22,
+ "items": 530000
+ },
+ "markers.cluster": {
+ "count": 53,
+ "totalMs": 73.57,
+ "avgMs": 1.388,
+ "p50Ms": 1.729,
+ "p95Ms": 2.577,
+ "maxMs": 3.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 73.57,
+ "items": 370906
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 0.93,
+ "avgMs": 0.018,
+ "p50Ms": 0.014,
+ "p95Ms": 0.038,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 3186
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 85.04,
+ "avgMs": 1.604,
+ "p50Ms": 2.014,
+ "p95Ms": 2.846,
+ "maxMs": 3.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 85.04,
+ "items": 370906
+ },
+ "markers.applyDiff": {
+ "count": 53,
+ "totalMs": 74.52,
+ "avgMs": 1.406,
+ "p50Ms": 0.171,
+ "p95Ms": 7.057,
+ "maxMs": 18.171,
+ "mainThreadMs": 74.52,
+ "backgroundMs": 0,
+ "items": 3567
+ },
+ "marker.visualProps": {
+ "count": 309,
+ "totalMs": 2.91,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.018,
+ "maxMs": 0.245,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.07,
+ "p50Ms": 1.07,
+ "p95Ms": 1.07,
+ "maxMs": 1.07,
+ "mainThreadMs": 1.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.08,
+ "avgMs": 1.083,
+ "p50Ms": 1.083,
+ "p95Ms": 1.083,
+ "maxMs": 1.083,
+ "mainThreadMs": 1.08,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.309,
+ "p50Ms": 0.309,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 10000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 466.4,
+ "afterLoadMB": 485,
+ "afterInteractionMB": 391.2,
+ "afterCleanupMB": 387.1,
+ "peakMB": 485,
+ "loadDeltaMB": 18.6,
+ "interactionDeltaMB": -93.8,
+ "retainedAfterCleanupMB": -79.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 466.4,
+ "residentMB": 614.4,
+ "javaHeapMB": 112,
+ "nativeHeapMB": 229.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 485,
+ "residentMB": 632.9,
+ "javaHeapMB": 94.9,
+ "nativeHeapMB": 261.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 391.2,
+ "residentMB": 539.4,
+ "javaHeapMB": 91.8,
+ "nativeHeapMB": 151.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 387.1,
+ "residentMB": 535.4,
+ "javaHeapMB": 92.1,
+ "nativeHeapMB": 147,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1669584,
+ "gcCount": 1,
+ "gcTimeMs": 0.005923999999999985,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 74436128,
+ "gcCount": 9,
+ "gcTimeMs": 533,
+ "blockingGcCount": 2,
+ "nativeHeapDeltaBytes": -115106240
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 2248,
+ "wallMs": 10068,
+ "percent": 22.3,
+ "threadsBefore": 130,
+ "threadsAfter": 129,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 20000,
+ "coordinates": 20000,
+ "estimatedBytes": 1811880
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5161.21,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 464,
+ "mainThreadMs": 76.34,
+ "backgroundMs": 66.81,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.56,
+ "avgMs": 0.111,
+ "p50Ms": 0.12,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 3.82,
+ "avgMs": 0.127,
+ "p50Ms": 0.082,
+ "p95Ms": 0.309,
+ "maxMs": 0.326,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.82,
+ "items": 300000
+ },
+ "markers.cluster": {
+ "count": 30,
+ "totalMs": 28.84,
+ "avgMs": 0.961,
+ "p50Ms": 0.62,
+ "p95Ms": 2.275,
+ "maxMs": 2.577,
+ "mainThreadMs": 0,
+ "backgroundMs": 28.84,
+ "items": 140906
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.65,
+ "avgMs": 0.022,
+ "p50Ms": 0.02,
+ "p95Ms": 0.04,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.65,
+ "items": 2616
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 33.49,
+ "avgMs": 1.116,
+ "p50Ms": 0.725,
+ "p95Ms": 2.525,
+ "maxMs": 2.846,
+ "mainThreadMs": 0,
+ "backgroundMs": 33.49,
+ "items": 140906
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 72.87,
+ "avgMs": 2.429,
+ "p50Ms": 1.061,
+ "p95Ms": 8.55,
+ "maxMs": 18.171,
+ "mainThreadMs": 72.87,
+ "backgroundMs": 0,
+ "items": 3490
+ },
+ "marker.visualProps": {
+ "count": 309,
+ "totalMs": 2.91,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.018,
+ "maxMs": 0.245,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 258800,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3664.43,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 110,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 94.59,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.43,
+ "avgMs": 0.086,
+ "p50Ms": 0.077,
+ "p95Ms": 0.117,
+ "maxMs": 0.117,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 5.91,
+ "avgMs": 0.281,
+ "p50Ms": 0.259,
+ "p95Ms": 0.411,
+ "maxMs": 0.467,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.91,
+ "items": 210000
+ },
+ "markers.cluster": {
+ "count": 21,
+ "totalMs": 41.08,
+ "avgMs": 1.956,
+ "p50Ms": 1.807,
+ "p95Ms": 2.891,
+ "maxMs": 3.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 41.08,
+ "items": 210000
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.25,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.018,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 516
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 47.36,
+ "avgMs": 2.255,
+ "p50Ms": 2.081,
+ "p95Ms": 3.143,
+ "maxMs": 3.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 47.36,
+ "items": 210000
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 1.46,
+ "avgMs": 0.07,
+ "p50Ms": 0.003,
+ "p95Ms": 0.17,
+ "maxMs": 1.088,
+ "mainThreadMs": 1.46,
+ "backgroundMs": 0,
+ "items": 63
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 112800,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000
+ },
+ "wallMs": 1215.39,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.16,
+ "avgMs": 11.16,
+ "p95Ms": 11.16,
+ "maxMs": 11.16
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.102,
+ "maxMs": 6.102
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.083,
+ "maxMs": 1.083
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 2.33,
+ "backgroundMs": 8.67,
+ "byName": {
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.49,
+ "avgMs": 0.246,
+ "p50Ms": 0.193,
+ "p95Ms": 0.299,
+ "maxMs": 0.299,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 3.66,
+ "avgMs": 1.828,
+ "p50Ms": 1.592,
+ "p95Ms": 2.064,
+ "maxMs": 2.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.66,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 54
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 4.19,
+ "avgMs": 2.095,
+ "p50Ms": 1.803,
+ "p95Ms": 2.387,
+ "maxMs": 2.387,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.19,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.18,
+ "avgMs": 0.09,
+ "p50Ms": 0.004,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 14
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.07,
+ "p50Ms": 1.07,
+ "p95Ms": 1.07,
+ "maxMs": 1.07,
+ "mainThreadMs": 1.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.08,
+ "avgMs": 1.083,
+ "p50Ms": 1.083,
+ "p95Ms": 1.083,
+ "maxMs": 1.083,
+ "mainThreadMs": 1.08,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.309,
+ "p50Ms": 0.309,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 954744,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-1k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-1k.json
new file mode 100644
index 0000000..35abe3f
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-1k.json
@@ -0,0 +1,909 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "cluster-1k",
+ "name": "Clustering, 1k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "1000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:31:01.570Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10934,
+ "load": {
+ "commitMs": 2.51,
+ "readyMs": 964,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 5.26,
+ "backgroundMs": 5.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.09,
+ "avgMs": 0.031,
+ "p50Ms": 0,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.578,
+ "p50Ms": 0.578,
+ "p95Ms": 0.578,
+ "maxMs": 0.578,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.49,
+ "avgMs": 0.243,
+ "p50Ms": 0.125,
+ "p95Ms": 0.362,
+ "maxMs": 0.362,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 2000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 2.09,
+ "avgMs": 1.043,
+ "p50Ms": 0.628,
+ "p95Ms": 1.457,
+ "maxMs": 1.457,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.09,
+ "items": 2000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.009,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 46
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 2.64,
+ "avgMs": 1.318,
+ "p50Ms": 0.767,
+ "p95Ms": 1.87,
+ "maxMs": 1.87,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.64,
+ "items": 2000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 5.1,
+ "avgMs": 2.548,
+ "p50Ms": 0.005,
+ "p95Ms": 5.091,
+ "maxMs": 5.091,
+ "mainThreadMs": 5.1,
+ "backgroundMs": 0,
+ "items": 23
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 319400,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 602,
+ "durationMs": 10056.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.69,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 601,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0017,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.51,
+ "p50": 17.51,
+ "p95": 17.51,
+ "p99": 17.51,
+ "worst": 17.51
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2,
+ "inputHandling": 0,
+ "animation": 2.8,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.4,
+ "commandIssue": 6.8,
+ "swapBuffers": 44.2,
+ "gpu": 86.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 2.4,
+ "swapBuffers": 15.5,
+ "gpu": 30.4,
+ "total": 35
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 1192,
+ "p50": 0.07,
+ "p95": 0.22,
+ "p99": 0.5,
+ "max": 3.71
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.72,
+ "max": 42.15
+ },
+ "lateFrames": 1,
+ "busyMs": 122.3,
+ "busyRatio": 0.0122,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10058.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.584,
+ "p95Ms": 1.584,
+ "maxMs": 1.584
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.651,
+ "maxMs": 13.651
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.26,
+ "maxMs": 0.26
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 508,
+ "mainThreadMs": 74.57,
+ "backgroundMs": 47.87,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.2,
+ "avgMs": 0.12,
+ "p50Ms": 0.096,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 1.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 7.44,
+ "avgMs": 0.14,
+ "p50Ms": 0.152,
+ "p95Ms": 0.264,
+ "maxMs": 0.302,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.44,
+ "items": 53000
+ },
+ "markers.cluster": {
+ "count": 53,
+ "totalMs": 15.53,
+ "avgMs": 0.293,
+ "p50Ms": 0.227,
+ "p95Ms": 0.784,
+ "maxMs": 1.567,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.53,
+ "items": 37159
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 0.68,
+ "avgMs": 0.013,
+ "p50Ms": 0.01,
+ "p95Ms": 0.024,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.68,
+ "items": 1968
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 23.96,
+ "avgMs": 0.452,
+ "p50Ms": 0.418,
+ "p95Ms": 1.042,
+ "maxMs": 1.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 23.96,
+ "items": 37159
+ },
+ "markers.applyDiff": {
+ "count": 53,
+ "totalMs": 70.11,
+ "avgMs": 1.323,
+ "p50Ms": 0.109,
+ "p95Ms": 5.651,
+ "maxMs": 34.017,
+ "mainThreadMs": 70.11,
+ "backgroundMs": 0,
+ "items": 1758
+ },
+ "marker.visualProps": {
+ "count": 230,
+ "totalMs": 2.76,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.025,
+ "maxMs": 0.332,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.244,
+ "p50Ms": 0.244,
+ "p95Ms": 0.244,
+ "maxMs": 0.244,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 386.3,
+ "afterLoadMB": 401.9,
+ "afterInteractionMB": 470.1,
+ "afterCleanupMB": 466.2,
+ "peakMB": 470.1,
+ "loadDeltaMB": 15.6,
+ "interactionDeltaMB": 68.2,
+ "retainedAfterCleanupMB": 79.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 386.3,
+ "residentMB": 533.7,
+ "javaHeapMB": 87.8,
+ "nativeHeapMB": 176.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 401.9,
+ "residentMB": 549.7,
+ "javaHeapMB": 85.7,
+ "nativeHeapMB": 193.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 470.1,
+ "residentMB": 618.1,
+ "javaHeapMB": 111.7,
+ "nativeHeapMB": 233.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 466.2,
+ "residentMB": 614.2,
+ "javaHeapMB": 111.9,
+ "nativeHeapMB": 228.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 830016,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 59022192,
+ "gcCount": 3,
+ "gcTimeMs": 189,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 41995312
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1453,
+ "wallMs": 10066,
+ "percent": 14.4,
+ "threadsBefore": 129,
+ "threadsAfter": 127,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 2000,
+ "coordinates": 2000,
+ "estimatedBytes": 181192
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 90596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5166.92,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 385,
+ "mainThreadMs": 72.29,
+ "backgroundMs": 25.44,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.66,
+ "avgMs": 0.131,
+ "p50Ms": 0.1,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 3.24,
+ "avgMs": 0.108,
+ "p50Ms": 0.099,
+ "p95Ms": 0.265,
+ "maxMs": 0.302,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.24,
+ "items": 30000
+ },
+ "markers.cluster": {
+ "count": 30,
+ "totalMs": 8.91,
+ "avgMs": 0.297,
+ "p50Ms": 0.249,
+ "p95Ms": 0.784,
+ "maxMs": 0.825,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.91,
+ "items": 14159
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.47,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1440
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 12.81,
+ "avgMs": 0.427,
+ "p50Ms": 0.382,
+ "p95Ms": 1.042,
+ "maxMs": 1.068,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.81,
+ "items": 14159
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 68.88,
+ "avgMs": 2.296,
+ "p50Ms": 0.531,
+ "p95Ms": 8.582,
+ "maxMs": 34.017,
+ "mainThreadMs": 68.88,
+ "backgroundMs": 0,
+ "items": 1680
+ },
+ "marker.visualProps": {
+ "count": 230,
+ "totalMs": 2.76,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.025,
+ "maxMs": 0.332,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 225696,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3663.79,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 110,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 20.46,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.55,
+ "avgMs": 0.11,
+ "p50Ms": 0.096,
+ "p95Ms": 0.156,
+ "maxMs": 0.156,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 3.82,
+ "avgMs": 0.182,
+ "p50Ms": 0.184,
+ "p95Ms": 0.259,
+ "maxMs": 0.264,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.82,
+ "items": 21000
+ },
+ "markers.cluster": {
+ "count": 21,
+ "totalMs": 6.16,
+ "avgMs": 0.293,
+ "p50Ms": 0.221,
+ "p95Ms": 0.329,
+ "maxMs": 1.567,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.16,
+ "items": 21000
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.19,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.013,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 478
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 10.29,
+ "avgMs": 0.49,
+ "p50Ms": 0.421,
+ "p95Ms": 0.57,
+ "maxMs": 1.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.29,
+ "items": 21000
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 1.13,
+ "avgMs": 0.054,
+ "p50Ms": 0.004,
+ "p95Ms": 0.257,
+ "maxMs": 0.396,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 71
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 111856,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000
+ },
+ "wallMs": 1216.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.584,
+ "p95Ms": 1.584,
+ "maxMs": 1.584
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.651,
+ "maxMs": 13.651
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.26,
+ "maxMs": 0.26
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 1.97,
+ "byName": {
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.38,
+ "avgMs": 0.19,
+ "p50Ms": 0.17,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 2000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 0.45,
+ "avgMs": 0.226,
+ "p50Ms": 0.218,
+ "p95Ms": 0.235,
+ "maxMs": 0.235,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 2000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 50
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.86,
+ "avgMs": 0.429,
+ "p50Ms": 0.418,
+ "p95Ms": 0.441,
+ "maxMs": 0.441,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.86,
+ "items": 2000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.049,
+ "p50Ms": 0.003,
+ "p95Ms": 0.095,
+ "maxMs": 0.095,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.244,
+ "p50Ms": 0.244,
+ "p95Ms": 0.244,
+ "maxMs": 0.244,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 151944,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-50k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-50k.json
new file mode 100644
index 0000000..08be41b
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/cluster-50k.json
@@ -0,0 +1,908 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "cluster-50k",
+ "name": "Clustering, 50k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline"
+ ],
+ "description": "50000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:31:32.366Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 11011,
+ "load": {
+ "commitMs": 38.87,
+ "readyMs": 656,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 10.64,
+ "backgroundMs": 44.2,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 2.93,
+ "avgMs": 0.975,
+ "p50Ms": 0,
+ "p95Ms": 2.926,
+ "maxMs": 2.926,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.77,
+ "p50Ms": 0.77,
+ "p95Ms": 0.77,
+ "maxMs": 0.77,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.77,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.96,
+ "avgMs": 0.481,
+ "p50Ms": 0.453,
+ "p95Ms": 0.51,
+ "maxMs": 0.51,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 100000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 20.72,
+ "avgMs": 10.361,
+ "p50Ms": 9.734,
+ "p95Ms": 10.988,
+ "maxMs": 10.988,
+ "mainThreadMs": 0,
+ "backgroundMs": 20.72,
+ "items": 100000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.011,
+ "p50Ms": 0.009,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 44
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 21.72,
+ "avgMs": 10.862,
+ "p50Ms": 10.208,
+ "p95Ms": 11.517,
+ "maxMs": 11.517,
+ "mainThreadMs": 0,
+ "backgroundMs": 21.72,
+ "items": 100000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 7.61,
+ "avgMs": 3.805,
+ "p50Ms": 0.003,
+ "p95Ms": 7.606,
+ "maxMs": 7.606,
+ "mainThreadMs": 7.61,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.005736542000000011,
+ "allocatedBytes": 13821736,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 605,
+ "durationMs": 10117.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.69,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 604,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0017,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 0,
+ "renderTotalMs": {
+ "average": 0,
+ "p50": 0,
+ "p95": 0,
+ "p99": 0,
+ "worst": 0
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0,
+ "total": 0
+ },
+ "missedDeadline": 0
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 1202,
+ "p50": 0.06,
+ "p95": 0.24,
+ "p99": 2.32,
+ "max": 75.89
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.89,
+ "max": 60.09
+ },
+ "lateFrames": 6,
+ "busyMs": 512.4,
+ "busyRatio": 0.0506,
+ "longTasks": {
+ "count": 1,
+ "totalMs": 60,
+ "maxMs": 60,
+ "source": "performance-observer"
+ },
+ "durationMs": 10119.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 62.29,
+ "avgMs": 62.295,
+ "p95Ms": 62.295,
+ "maxMs": 62.295
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.389,
+ "maxMs": 15.389
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.954,
+ "maxMs": 2.954
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 501,
+ "mainThreadMs": 175.19,
+ "backgroundMs": 1029.19,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.23,
+ "avgMs": 0.123,
+ "p50Ms": 0.092,
+ "p95Ms": 0.276,
+ "maxMs": 0.276,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 29.07,
+ "avgMs": 0.549,
+ "p50Ms": 0.465,
+ "p95Ms": 1.198,
+ "maxMs": 7.7,
+ "mainThreadMs": 0,
+ "backgroundMs": 29.07,
+ "items": 2650000
+ },
+ "markers.cluster": {
+ "count": 53,
+ "totalMs": 483.66,
+ "avgMs": 9.126,
+ "p50Ms": 9.796,
+ "p95Ms": 15.972,
+ "maxMs": 51.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 483.66,
+ "items": 1857651
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 1.23,
+ "avgMs": 0.023,
+ "p50Ms": 0.02,
+ "p95Ms": 0.043,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 3976
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 514.55,
+ "avgMs": 9.708,
+ "p50Ms": 10.346,
+ "p95Ms": 16.8,
+ "maxMs": 59.085,
+ "mainThreadMs": 0,
+ "backgroundMs": 514.55,
+ "items": 1857651
+ },
+ "markers.applyDiff": {
+ "count": 53,
+ "totalMs": 166.05,
+ "avgMs": 3.133,
+ "p50Ms": 0.359,
+ "p95Ms": 24.44,
+ "maxMs": 32.951,
+ "mainThreadMs": 166.05,
+ "backgroundMs": 0,
+ "items": 4895
+ },
+ "marker.visualProps": {
+ "count": 223,
+ "totalMs": 2.02,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.02,
+ "maxMs": 0.12,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.93,
+ "avgMs": 2.93,
+ "p50Ms": 2.93,
+ "p95Ms": 2.93,
+ "maxMs": 2.93,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.95,
+ "avgMs": 2.954,
+ "p50Ms": 2.954,
+ "p95Ms": 2.954,
+ "maxMs": 2.954,
+ "mainThreadMs": 2.95,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.671,
+ "p50Ms": 0.671,
+ "p95Ms": 0.671,
+ "maxMs": 0.671,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.67,
+ "items": 50000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 381.8,
+ "afterLoadMB": 451.6,
+ "afterInteractionMB": 446.8,
+ "afterCleanupMB": 442.8,
+ "peakMB": 451.6,
+ "loadDeltaMB": 69.8,
+ "interactionDeltaMB": -4.8,
+ "retainedAfterCleanupMB": 61,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 381.8,
+ "residentMB": 530.1,
+ "javaHeapMB": 92.2,
+ "nativeHeapMB": 147.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 451.6,
+ "residentMB": 599.8,
+ "javaHeapMB": 98.1,
+ "nativeHeapMB": 207,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 446.8,
+ "residentMB": 595.1,
+ "javaHeapMB": 97.8,
+ "nativeHeapMB": 183.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 442.8,
+ "residentMB": 591.2,
+ "javaHeapMB": 98,
+ "nativeHeapMB": 179,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 5203824,
+ "gcCount": 1,
+ "gcTimeMs": 0.014084833000000019,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 234180272,
+ "gcCount": 14,
+ "gcTimeMs": 1006,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -24528848
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 3397,
+ "wallMs": 10133,
+ "percent": 33.5,
+ "threadsBefore": 130,
+ "threadsAfter": 129,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100000,
+ "coordinates": 100000,
+ "estimatedBytes": 9057816
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 4528908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5165.28,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 378,
+ "mainThreadMs": 166.56,
+ "backgroundMs": 485.33,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.68,
+ "avgMs": 0.136,
+ "p50Ms": 0.1,
+ "p95Ms": 0.276,
+ "maxMs": 0.276,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 16.33,
+ "avgMs": 0.544,
+ "p50Ms": 0.207,
+ "p95Ms": 1.485,
+ "maxMs": 7.7,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.33,
+ "items": 1500000
+ },
+ "markers.cluster": {
+ "count": 30,
+ "totalMs": 225.24,
+ "avgMs": 7.508,
+ "p50Ms": 3.586,
+ "p95Ms": 30.53,
+ "maxMs": 51.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 225.24,
+ "items": 707651
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.94,
+ "avgMs": 0.031,
+ "p50Ms": 0.027,
+ "p95Ms": 0.06,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 3460
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 242.82,
+ "avgMs": 8.094,
+ "p50Ms": 3.832,
+ "p95Ms": 32.065,
+ "maxMs": 59.085,
+ "mainThreadMs": 0,
+ "backgroundMs": 242.82,
+ "items": 707651
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 163.86,
+ "avgMs": 5.462,
+ "p50Ms": 2.015,
+ "p95Ms": 29.177,
+ "maxMs": 32.951,
+ "mainThreadMs": 163.86,
+ "backgroundMs": 0,
+ "items": 4828
+ },
+ "marker.visualProps": {
+ "count": 223,
+ "totalMs": 2.02,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.02,
+ "maxMs": 0.12,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 224136,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3664.31,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 110,
+ "mainThreadMs": 2.6,
+ "backgroundMs": 497.4,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.55,
+ "avgMs": 0.11,
+ "p50Ms": 0.091,
+ "p95Ms": 0.203,
+ "maxMs": 0.203,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 11.95,
+ "avgMs": 0.569,
+ "p50Ms": 0.535,
+ "p95Ms": 0.782,
+ "maxMs": 1.198,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.95,
+ "items": 1050000
+ },
+ "markers.cluster": {
+ "count": 21,
+ "totalMs": 236.37,
+ "avgMs": 11.256,
+ "p50Ms": 11.368,
+ "p95Ms": 13.409,
+ "maxMs": 14.11,
+ "mainThreadMs": 0,
+ "backgroundMs": 236.37,
+ "items": 1050000
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.27,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.018,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 466
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 248.82,
+ "avgMs": 11.849,
+ "p50Ms": 11.877,
+ "p95Ms": 14.058,
+ "maxMs": 14.693,
+ "mainThreadMs": 0,
+ "backgroundMs": 248.82,
+ "items": 1050000
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 2.05,
+ "avgMs": 0.098,
+ "p50Ms": 0.004,
+ "p95Ms": 0.616,
+ "maxMs": 1.167,
+ "mainThreadMs": 2.05,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 113136,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 500,
+ "total": 50000
+ },
+ "wallMs": 1282.79,
+ "commits": {
+ "count": 1,
+ "totalMs": 62.29,
+ "avgMs": 62.295,
+ "p95Ms": 62.295,
+ "maxMs": 62.295
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.389,
+ "maxMs": 15.389
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.954,
+ "maxMs": 2.954
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 6.03,
+ "backgroundMs": 46.45,
+ "byName": {
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.79,
+ "avgMs": 0.396,
+ "p50Ms": 0.324,
+ "p95Ms": 0.469,
+ "maxMs": 0.469,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.79,
+ "items": 100000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 22.06,
+ "avgMs": 11.03,
+ "p50Ms": 8.94,
+ "p95Ms": 13.12,
+ "maxMs": 13.12,
+ "mainThreadMs": 0,
+ "backgroundMs": 22.06,
+ "items": 100000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 50
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 22.9,
+ "avgMs": 11.451,
+ "p50Ms": 9.288,
+ "p95Ms": 13.614,
+ "maxMs": 13.614,
+ "mainThreadMs": 0,
+ "backgroundMs": 22.9,
+ "items": 100000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.15,
+ "avgMs": 0.073,
+ "p50Ms": 0.006,
+ "p95Ms": 0.14,
+ "maxMs": 0.14,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 17
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.93,
+ "avgMs": 2.93,
+ "p50Ms": 2.93,
+ "p95Ms": 2.93,
+ "maxMs": 2.93,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.95,
+ "avgMs": 2.954,
+ "p50Ms": 2.954,
+ "p95Ms": 2.954,
+ "maxMs": 2.954,
+ "mainThreadMs": 2.95,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.671,
+ "p50Ms": 0.671,
+ "p95Ms": 0.671,
+ "maxMs": 0.671,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.67,
+ "items": 50000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.014084833000000019,
+ "allocatedBytes": 4524384,
+ "heapSizeAfterBytes": 83886080
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-camera.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-camera.json
new file mode 100644
index 0000000..10c8055
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-camera.json
@@ -0,0 +1,536 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-camera",
+ "name": "10k markers + camera",
+ "group": "combined",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast pan legs and a zoom sweep with 10k markers (no clustering).",
+ "recordedAt": "2026-09-10T14:31:43.264Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7123,
+ "load": {
+ "commitMs": 11.09,
+ "readyMs": 769,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.83,
+ "backgroundMs": 0.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.32,
+ "avgMs": 0.662,
+ "p50Ms": 0.001,
+ "p95Ms": 1.323,
+ "maxMs": 1.323,
+ "mainThreadMs": 1.32,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.218,
+ "p50Ms": 0.218,
+ "p95Ms": 0.218,
+ "maxMs": 0.218,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.056,
+ "p50Ms": 0.026,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.048,
+ "p50Ms": 0.016,
+ "p95Ms": 0.081,
+ "maxMs": 0.081,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.011,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.25,
+ "avgMs": 0.125,
+ "p50Ms": 0.054,
+ "p95Ms": 0.196,
+ "maxMs": 0.196,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.43,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.009,
+ "maxMs": 0.118,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.01,
+ "avgMs": 0.507,
+ "p50Ms": 0.004,
+ "p95Ms": 1.011,
+ "maxMs": 1.011,
+ "mainThreadMs": 1.01,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0010516669999999784,
+ "allocatedBytes": 2721904,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 373,
+ "durationMs": 6230.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 373,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 38.31,
+ "p50": 38.31,
+ "p95": 38.31,
+ "p99": 38.31,
+ "worst": 38.31
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.4,
+ "inputHandling": 0,
+ "animation": 5.1,
+ "layoutMeasure": 0.6,
+ "draw": 0.6,
+ "sync": 0.2,
+ "commandIssue": 2.7,
+ "swapBuffers": 66.5,
+ "gpu": 89.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 3.9,
+ "layoutMeasure": 0.5,
+ "draw": 0.5,
+ "sync": 0.2,
+ "commandIssue": 2.1,
+ "swapBuffers": 51,
+ "gpu": 68.2,
+ "total": 76.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 746,
+ "p50": 0.06,
+ "p95": 0.16,
+ "p99": 0.36,
+ "max": 1.37
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.46,
+ "max": 19.79
+ },
+ "lateFrames": 0,
+ "busyMs": 60,
+ "busyRatio": 0.0096,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6231.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1164,
+ "mainThreadMs": 26.21,
+ "backgroundMs": 11.76,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.54,
+ "avgMs": 0.154,
+ "p50Ms": 0.107,
+ "p95Ms": 0.472,
+ "maxMs": 0.472,
+ "mainThreadMs": 1.54,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 34,
+ "totalMs": 0.94,
+ "avgMs": 0.028,
+ "p50Ms": 0.022,
+ "p95Ms": 0.087,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 340000
+ },
+ "markers.viewportFilter": {
+ "count": 34,
+ "totalMs": 3.82,
+ "avgMs": 0.112,
+ "p50Ms": 0.043,
+ "p95Ms": 0.295,
+ "maxMs": 1.553,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.82,
+ "items": 7104
+ },
+ "markers.diff": {
+ "count": 34,
+ "totalMs": 1.07,
+ "avgMs": 0.031,
+ "p50Ms": 0.026,
+ "p95Ms": 0.073,
+ "maxMs": 0.134,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.07,
+ "items": 3391
+ },
+ "markers.viewportCompute": {
+ "count": 34,
+ "totalMs": 5.94,
+ "avgMs": 0.175,
+ "p50Ms": 0.099,
+ "p95Ms": 0.409,
+ "maxMs": 1.608,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.94,
+ "items": 7104
+ },
+ "markers.applyDiff": {
+ "count": 34,
+ "totalMs": 17.77,
+ "avgMs": 0.523,
+ "p50Ms": 0.289,
+ "p95Ms": 2.164,
+ "maxMs": 2.73,
+ "mainThreadMs": 17.77,
+ "backgroundMs": 0,
+ "items": 1956
+ },
+ "marker.visualProps": {
+ "count": 984,
+ "totalMs": 6.9,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.334,
+ "mainThreadMs": 6.9,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 443,
+ "afterLoadMB": 511.8,
+ "afterInteractionMB": 488,
+ "afterCleanupMB": 484.4,
+ "peakMB": 511.8,
+ "loadDeltaMB": 68.8,
+ "interactionDeltaMB": -23.8,
+ "retainedAfterCleanupMB": 41.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 443,
+ "residentMB": 591.3,
+ "javaHeapMB": 98.1,
+ "nativeHeapMB": 179.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 511.8,
+ "residentMB": 660.2,
+ "javaHeapMB": 103.4,
+ "nativeHeapMB": 244.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 488,
+ "residentMB": 636.2,
+ "javaHeapMB": 101,
+ "nativeHeapMB": 222.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 484.4,
+ "residentMB": 632.7,
+ "javaHeapMB": 101.5,
+ "nativeHeapMB": 218,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 470344,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 32158384,
+ "gcCount": 5,
+ "gcTimeMs": 415,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -23143184
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1722,
+ "wallMs": 6240,
+ "percent": 27.6,
+ "threadsBefore": 131,
+ "threadsAfter": 130,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-cluster-camera.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-cluster-camera.json
new file mode 100644
index 0000000..df5a0a2
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-cluster-camera.json
@@ -0,0 +1,525 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-cluster-camera",
+ "name": "10k markers + clustering + camera",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom sweep and pan with 10k clustered markers at country scale.",
+ "recordedAt": "2026-09-10T14:31:53.771Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6854,
+ "load": {
+ "commitMs": 10.86,
+ "readyMs": 634,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 13.24,
+ "backgroundMs": 8.73,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 2.42,
+ "avgMs": 0.807,
+ "p50Ms": 0,
+ "p95Ms": 2.422,
+ "maxMs": 2.422,
+ "mainThreadMs": 2.42,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.16,
+ "p50Ms": 0.16,
+ "p95Ms": 0.16,
+ "maxMs": 0.16,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.216,
+ "p50Ms": 0.216,
+ "p95Ms": 0.216,
+ "maxMs": 0.216,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.59,
+ "avgMs": 0.293,
+ "p50Ms": 0.273,
+ "p95Ms": 0.313,
+ "maxMs": 0.313,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 3.61,
+ "avgMs": 1.806,
+ "p50Ms": 1.735,
+ "p95Ms": 1.878,
+ "maxMs": 1.878,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.61,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.022,
+ "p50Ms": 0.014,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 52
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 4.27,
+ "avgMs": 2.135,
+ "p50Ms": 2.059,
+ "p95Ms": 2.211,
+ "maxMs": 2.211,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.27,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 10.65,
+ "avgMs": 5.327,
+ "p50Ms": 0.003,
+ "p95Ms": 10.651,
+ "maxMs": 10.651,
+ "mainThreadMs": 10.65,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.013167792000000011,
+ "allocatedBytes": 2708408,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 358,
+ "durationMs": 5972.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 358,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 50.12,
+ "p50": 50.12,
+ "p95": 50.12,
+ "p99": 50.12,
+ "worst": 50.12
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.2,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.7,
+ "swapBuffers": 71.2,
+ "gpu": 95.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.2,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.7,
+ "swapBuffers": 71.3,
+ "gpu": 95.5,
+ "total": 100.2
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 715,
+ "p50": 0.07,
+ "p95": 0.25,
+ "p99": 1.31,
+ "max": 4.44
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.75,
+ "max": 24.93
+ },
+ "lateFrames": 0,
+ "busyMs": 86.8,
+ "busyRatio": 0.0145,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5974.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 295,
+ "mainThreadMs": 79.23,
+ "backgroundMs": 201.46,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 1.18,
+ "avgMs": 0.147,
+ "p50Ms": 0.131,
+ "p95Ms": 0.245,
+ "maxMs": 0.245,
+ "mainThreadMs": 1.18,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 31,
+ "totalMs": 22.74,
+ "avgMs": 0.734,
+ "p50Ms": 0.305,
+ "p95Ms": 4.936,
+ "maxMs": 8.956,
+ "mainThreadMs": 0,
+ "backgroundMs": 22.74,
+ "items": 310000
+ },
+ "markers.cluster": {
+ "count": 31,
+ "totalMs": 77.02,
+ "avgMs": 2.484,
+ "p50Ms": 2.092,
+ "p95Ms": 7.95,
+ "maxMs": 12.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 77.02,
+ "items": 248534
+ },
+ "markers.diff": {
+ "count": 31,
+ "totalMs": 0.77,
+ "avgMs": 0.025,
+ "p50Ms": 0.021,
+ "p95Ms": 0.048,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.77,
+ "items": 1760
+ },
+ "markers.viewportCompute": {
+ "count": 31,
+ "totalMs": 100.94,
+ "avgMs": 3.256,
+ "p50Ms": 2.374,
+ "p95Ms": 12.949,
+ "maxMs": 21.089,
+ "mainThreadMs": 0,
+ "backgroundMs": 100.94,
+ "items": 248534
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 76.3,
+ "avgMs": 2.543,
+ "p50Ms": 0.005,
+ "p95Ms": 14.386,
+ "maxMs": 25.589,
+ "mainThreadMs": 76.3,
+ "backgroundMs": 0,
+ "items": 1901
+ },
+ "marker.visualProps": {
+ "count": 133,
+ "totalMs": 1.76,
+ "avgMs": 0.013,
+ "p50Ms": 0.005,
+ "p95Ms": 0.039,
+ "maxMs": 0.21,
+ "mainThreadMs": 1.76,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 484.1,
+ "afterLoadMB": 467.1,
+ "afterInteractionMB": 475,
+ "afterCleanupMB": 471,
+ "peakMB": 484.1,
+ "loadDeltaMB": -17,
+ "interactionDeltaMB": 7.9,
+ "retainedAfterCleanupMB": -13.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 484.1,
+ "residentMB": 632.2,
+ "javaHeapMB": 101.7,
+ "nativeHeapMB": 218.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 467.1,
+ "residentMB": 615.4,
+ "javaHeapMB": 101.5,
+ "nativeHeapMB": 199.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 475,
+ "residentMB": 623,
+ "javaHeapMB": 104.1,
+ "nativeHeapMB": 197.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 471,
+ "residentMB": 619.2,
+ "javaHeapMB": 104.4,
+ "nativeHeapMB": 192.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 351888,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 48717744,
+ "gcCount": 4,
+ "gcTimeMs": 331,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -2179280
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1763,
+ "wallMs": 5980,
+ "percent": 29.5,
+ "threadsBefore": 132,
+ "threadsAfter": 133,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-polygon.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-polygon.json
new file mode 100644
index 0000000..6c0f456
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-polygon.json
@@ -0,0 +1,722 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-polygon",
+ "name": "10k markers + 200 polygons",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "200 polygons over 10k markers: three restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:32:23.508Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5296,
+ "load": {
+ "commitMs": 11.31,
+ "readyMs": 856,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 5.69,
+ "backgroundMs": 0.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 3,
+ "avgMs": 1.502,
+ "p50Ms": 0,
+ "p95Ms": 3.004,
+ "maxMs": 3.004,
+ "mainThreadMs": 3,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.409,
+ "p50Ms": 0.409,
+ "p95Ms": 0.409,
+ "maxMs": 0.409,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 10000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.055,
+ "p50Ms": 0.055,
+ "p95Ms": 0.055,
+ "maxMs": 0.055,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.028,
+ "p50Ms": 0.02,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.012,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.057,
+ "p50Ms": 0.051,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.97,
+ "avgMs": 0.015,
+ "p50Ms": 0.005,
+ "p95Ms": 0.016,
+ "maxMs": 0.455,
+ "mainThreadMs": 0.97,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.65,
+ "avgMs": 0.827,
+ "p50Ms": 0.003,
+ "p95Ms": 1.651,
+ "maxMs": 1.651,
+ "mainThreadMs": 1.65,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0024540000000000117,
+ "allocatedBytes": 3409048,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ "frames": {
+ "frames": 264,
+ "durationMs": 4426.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.8,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.73,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 263,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0038,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 53.21,
+ "p50": 53.21,
+ "p95": 53.21,
+ "p99": 53.21,
+ "worst": 53.21
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 3.3,
+ "layoutMeasure": 0.6,
+ "draw": 0.4,
+ "sync": 0.4,
+ "commandIssue": 7.1,
+ "swapBuffers": 86.9,
+ "gpu": 86.5
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 3.5,
+ "layoutMeasure": 0.6,
+ "draw": 0.4,
+ "sync": 0.5,
+ "commandIssue": 7.5,
+ "swapBuffers": 92.5,
+ "gpu": 92,
+ "total": 106.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 527,
+ "p50": 0.07,
+ "p95": 0.2,
+ "p99": 0.71,
+ "max": 3.15
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.64,
+ "max": 43.72
+ },
+ "lateFrames": 1,
+ "busyMs": 54.4,
+ "busyRatio": 0.0123,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4427.6,
+ "commits": {
+ "count": 3,
+ "totalMs": 12.7,
+ "avgMs": 4.234,
+ "p95Ms": 6.483,
+ "maxMs": 6.483
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 13.532,
+ "maxMs": 17.22
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 13.706,
+ "maxMs": 26.523
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 185,
+ "mainThreadMs": 45.94,
+ "backgroundMs": 2.22,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 41.12,
+ "avgMs": 13.706,
+ "p50Ms": 7.988,
+ "p95Ms": 26.523,
+ "maxMs": 26.523,
+ "mainThreadMs": 41.12,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.68,
+ "avgMs": 0.137,
+ "p50Ms": 0.12,
+ "p95Ms": 0.235,
+ "maxMs": 0.235,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.32,
+ "avgMs": 0.02,
+ "p50Ms": 0.019,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.45,
+ "avgMs": 0.028,
+ "p50Ms": 0.027,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 2349
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.32,
+ "avgMs": 0.02,
+ "p50Ms": 0.015,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 1314
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 1.14,
+ "avgMs": 0.071,
+ "p50Ms": 0.067,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 2349
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 3.1,
+ "avgMs": 0.194,
+ "p50Ms": 0.183,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 3.1,
+ "backgroundMs": 0,
+ "items": 172
+ },
+ "marker.visualProps": {
+ "count": 97,
+ "totalMs": 1.05,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.173,
+ "mainThreadMs": 1.05,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 558,
+ "afterLoadMB": 577.6,
+ "afterInteractionMB": 564.2,
+ "afterCleanupMB": 560.3,
+ "peakMB": 577.6,
+ "loadDeltaMB": 19.6,
+ "interactionDeltaMB": -13.4,
+ "retainedAfterCleanupMB": 2.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 558,
+ "residentMB": 706.1,
+ "javaHeapMB": 112.5,
+ "nativeHeapMB": 269.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 577.6,
+ "residentMB": 725.7,
+ "javaHeapMB": 116.2,
+ "nativeHeapMB": 285.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 564.2,
+ "residentMB": 712.2,
+ "javaHeapMB": 122.6,
+ "nativeHeapMB": 264.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 560.3,
+ "residentMB": 708.4,
+ "javaHeapMB": 122.8,
+ "nativeHeapMB": 260.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1459456,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 88
+ },
+ "android": {
+ "javaBytesAllocated": 60862816,
+ "gcCount": 2,
+ "gcTimeMs": 230,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -22190384
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1694,
+ "wallMs": 4447,
+ "percent": 38.1,
+ "threadsBefore": 139,
+ "threadsAfter": 139,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 423.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.48,
+ "avgMs": 6.483,
+ "p95Ms": 6.483,
+ "maxMs": 6.483
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.22,
+ "maxMs": 17.22
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 26.523,
+ "maxMs": 26.523
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 26.52,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 26.52,
+ "avgMs": 26.523,
+ "p50Ms": 26.523,
+ "p95Ms": 26.523,
+ "maxMs": 26.523,
+ "mainThreadMs": 26.52,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 240608,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 415.92,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.91,
+ "avgMs": 4.91,
+ "p95Ms": 4.91,
+ "maxMs": 4.91
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.577,
+ "maxMs": 9.577
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 6.606,
+ "maxMs": 6.606
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 6.61,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 6.61,
+ "avgMs": 6.606,
+ "p50Ms": 6.606,
+ "p95Ms": 6.606,
+ "maxMs": 6.606,
+ "mainThreadMs": 6.61,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 240064,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 417.67,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.31,
+ "avgMs": 1.308,
+ "p95Ms": 1.308,
+ "maxMs": 1.308
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.798,
+ "maxMs": 13.798
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 7.988,
+ "maxMs": 7.988
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 7.99,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 7.99,
+ "avgMs": 7.988,
+ "p50Ms": 7.988,
+ "p95Ms": 7.988,
+ "maxMs": 7.988,
+ "mainThreadMs": 7.99,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 240416,
+ "heapSizeAfterBytes": 92274688
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-polyline.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-polyline.json
new file mode 100644
index 0000000..3eabe13
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-polyline.json
@@ -0,0 +1,722 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-polyline",
+ "name": "10k markers + 10k-point polyline",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "A 10k-point route over 10k markers: three route updates, then a pan.",
+ "recordedAt": "2026-09-10T14:32:14.331Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5351,
+ "load": {
+ "commitMs": 10.58,
+ "readyMs": 798,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.84,
+ "backgroundMs": 0.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.29,
+ "avgMs": 0.646,
+ "p50Ms": 0,
+ "p95Ms": 1.291,
+ "maxMs": 1.291,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.242,
+ "p50Ms": 0.242,
+ "p95Ms": 0.242,
+ "maxMs": 0.242,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 10000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.081,
+ "p50Ms": 0.081,
+ "p95Ms": 0.081,
+ "maxMs": 0.081,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.021,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.027,
+ "p50Ms": 0.025,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.064,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.91,
+ "avgMs": 0.014,
+ "p50Ms": 0.005,
+ "p95Ms": 0.011,
+ "maxMs": 0.541,
+ "mainThreadMs": 0.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.56,
+ "avgMs": 0.781,
+ "p50Ms": 0.003,
+ "p95Ms": 1.559,
+ "maxMs": 1.559,
+ "mainThreadMs": 1.56,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002673833999999986,
+ "allocatedBytes": 4612536,
+ "heapSizeAfterBytes": 88080384
+ }
+ },
+ "frames": {
+ "frames": 268,
+ "durationMs": 4474.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 268,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 18.71,
+ "p50": 18.71,
+ "p95": 18.71,
+ "p99": 18.71,
+ "worst": 18.71
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.4,
+ "inputHandling": 0,
+ "animation": 7.1,
+ "layoutMeasure": 2.2,
+ "draw": 5.7,
+ "sync": 6.9,
+ "commandIssue": 13.5,
+ "swapBuffers": 59.6,
+ "gpu": 58.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.6,
+ "inputHandling": 0,
+ "animation": 2.7,
+ "layoutMeasure": 0.8,
+ "draw": 2.1,
+ "sync": 2.6,
+ "commandIssue": 5,
+ "swapBuffers": 22.3,
+ "gpu": 22,
+ "total": 37.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 526,
+ "p50": 0.07,
+ "p95": 0.25,
+ "p99": 4.94,
+ "max": 25.35
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.38,
+ "max": 22.72
+ },
+ "lateFrames": 0,
+ "busyMs": 129.4,
+ "busyRatio": 0.0289,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4478.1,
+ "commits": {
+ "count": 3,
+ "totalMs": 11.44,
+ "avgMs": 3.814,
+ "p95Ms": 6.174,
+ "maxMs": 6.174
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 13.244,
+ "maxMs": 17.057
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 3.124,
+ "maxMs": 5.551
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 186,
+ "mainThreadMs": 15.24,
+ "backgroundMs": 4.04,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 9.37,
+ "avgMs": 3.124,
+ "p50Ms": 1.935,
+ "p95Ms": 5.551,
+ "maxMs": 5.551,
+ "mainThreadMs": 9.37,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.89,
+ "avgMs": 0.178,
+ "p50Ms": 0.099,
+ "p95Ms": 0.433,
+ "maxMs": 0.433,
+ "mainThreadMs": 0.89,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.54,
+ "avgMs": 0.033,
+ "p50Ms": 0.019,
+ "p95Ms": 0.191,
+ "maxMs": 0.191,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.99,
+ "avgMs": 0.062,
+ "p50Ms": 0.02,
+ "p95Ms": 0.509,
+ "maxMs": 0.509,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.99,
+ "items": 2349
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.47,
+ "avgMs": 0.029,
+ "p50Ms": 0.017,
+ "p95Ms": 0.099,
+ "maxMs": 0.099,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1315
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 2.05,
+ "avgMs": 0.128,
+ "p50Ms": 0.065,
+ "p95Ms": 0.753,
+ "maxMs": 0.753,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.05,
+ "items": 2349
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 3.79,
+ "avgMs": 0.237,
+ "p50Ms": 0.182,
+ "p95Ms": 0.591,
+ "maxMs": 0.591,
+ "mainThreadMs": 3.79,
+ "backgroundMs": 0,
+ "items": 174
+ },
+ "marker.visualProps": {
+ "count": 98,
+ "totalMs": 1.19,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.036,
+ "maxMs": 0.113,
+ "mainThreadMs": 1.19,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 488.7,
+ "afterLoadMB": 562.7,
+ "afterInteractionMB": 561.6,
+ "afterCleanupMB": 557.8,
+ "peakMB": 562.7,
+ "loadDeltaMB": 74,
+ "interactionDeltaMB": -1.1,
+ "retainedAfterCleanupMB": 69.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 488.7,
+ "residentMB": 636.9,
+ "javaHeapMB": 104.8,
+ "nativeHeapMB": 210.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 562.7,
+ "residentMB": 710.7,
+ "javaHeapMB": 112.2,
+ "nativeHeapMB": 276.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 561.6,
+ "residentMB": 709.9,
+ "javaHeapMB": 112.2,
+ "nativeHeapMB": 273.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 557.8,
+ "residentMB": 706,
+ "javaHeapMB": 112.3,
+ "nativeHeapMB": 269.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 4641448,
+ "gcCount": 2,
+ "gcTimeMs": 0.008003040999999989,
+ "heapSizeAfterMB": 84
+ },
+ "android": {
+ "javaBytesAllocated": 14493680,
+ "gcCount": 1,
+ "gcTimeMs": 194,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -3180320
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 958,
+ "wallMs": 4503,
+ "percent": 21.3,
+ "threadsBefore": 137,
+ "threadsAfter": 137,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 4,
+ "coordinates": 40000,
+ "estimatedBytes": 1791427
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 442.2,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.17,
+ "avgMs": 6.174,
+ "p95Ms": 6.174,
+ "maxMs": 6.174
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.482,
+ "maxMs": 15.482
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.551,
+ "maxMs": 5.551
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5.55,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 5.55,
+ "avgMs": 5.551,
+ "p50Ms": 5.551,
+ "p95Ms": 5.551,
+ "maxMs": 5.551,
+ "mainThreadMs": 5.55,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005893957999999977,
+ "allocatedBytes": 1176008,
+ "heapSizeAfterBytes": 88080384
+ }
+ },
+ {
+ "index": 1,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 415.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.85,
+ "avgMs": 2.847,
+ "p95Ms": 2.847,
+ "maxMs": 2.847
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.193,
+ "maxMs": 7.193
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.888,
+ "maxMs": 1.888
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.89,
+ "avgMs": 1.888,
+ "p50Ms": 1.888,
+ "p95Ms": 1.888,
+ "maxMs": 1.888,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1175224,
+ "heapSizeAfterBytes": 88080384
+ }
+ },
+ {
+ "index": 2,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 433.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.42,
+ "avgMs": 2.42,
+ "p95Ms": 2.42,
+ "maxMs": 2.42
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.057,
+ "maxMs": 17.057
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.935,
+ "maxMs": 1.935
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.93,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.93,
+ "avgMs": 1.935,
+ "p50Ms": 1.935,
+ "p95Ms": 1.935,
+ "maxMs": 1.935,
+ "mainThreadMs": 1.93,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0021090830000000116,
+ "allocatedBytes": 1175744,
+ "heapSizeAfterBytes": 88080384
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-updates.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-updates.json
new file mode 100644
index 0000000..20abe4c
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-10k-updates.json
@@ -0,0 +1,728 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-updates",
+ "name": "10k markers + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "1 % of 10k markers move at 5 Hz for 5 s while the camera pans slowly.",
+ "recordedAt": "2026-09-10T14:32:05.101Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7537,
+ "load": {
+ "commitMs": 17.13,
+ "readyMs": 774,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.66,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.78,
+ "avgMs": 0.892,
+ "p50Ms": 0,
+ "p95Ms": 1.783,
+ "maxMs": 1.783,
+ "mainThreadMs": 1.78,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.07,
+ "avgMs": 0.033,
+ "p50Ms": 0.02,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.049,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.46,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.132,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.37,
+ "avgMs": 0.683,
+ "p50Ms": 0.003,
+ "p95Ms": 1.363,
+ "maxMs": 1.363,
+ "mainThreadMs": 1.37,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005947874999999991,
+ "allocatedBytes": 2720272,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 399,
+ "durationMs": 6658.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 399,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.96,
+ "p50": 16.96,
+ "p95": 16.96,
+ "p99": 16.96,
+ "worst": 16.96
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.1,
+ "inputHandling": 0,
+ "animation": 4.6,
+ "layoutMeasure": 0.4,
+ "draw": 0.7,
+ "sync": 0.5,
+ "commandIssue": 3.4,
+ "swapBuffers": 31.1,
+ "gpu": 69.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 1.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.2,
+ "swapBuffers": 10.6,
+ "gpu": 23.5,
+ "total": 33.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 795,
+ "p50": 0.07,
+ "p95": 0.97,
+ "p99": 9.24,
+ "max": 11.19
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 19.74,
+ "max": 22.07
+ },
+ "lateFrames": 0,
+ "busyMs": 273,
+ "busyRatio": 0.041,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6659.8,
+ "commits": {
+ "count": 25,
+ "totalMs": 255.01,
+ "avgMs": 10.2,
+ "p95Ms": 13.412,
+ "maxMs": 16.497
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 8.258,
+ "maxMs": 10.491
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 1.071,
+ "maxMs": 2.081
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 469,
+ "mainThreadMs": 61.33,
+ "backgroundMs": 16.32,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.76,
+ "avgMs": 0.152,
+ "p50Ms": 0.109,
+ "p95Ms": 0.272,
+ "maxMs": 0.272,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 59,
+ "totalMs": 1.11,
+ "avgMs": 0.019,
+ "p50Ms": 0.014,
+ "p95Ms": 0.039,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.11,
+ "items": 590000
+ },
+ "markers.viewportFilter": {
+ "count": 59,
+ "totalMs": 1.6,
+ "avgMs": 0.027,
+ "p50Ms": 0.019,
+ "p95Ms": 0.123,
+ "maxMs": 0.145,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.6,
+ "items": 8259
+ },
+ "markers.diff": {
+ "count": 59,
+ "totalMs": 1.52,
+ "avgMs": 0.026,
+ "p50Ms": 0.019,
+ "p95Ms": 0.06,
+ "maxMs": 0.221,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.52,
+ "items": 4877
+ },
+ "markers.viewportCompute": {
+ "count": 59,
+ "totalMs": 4.41,
+ "avgMs": 0.075,
+ "p50Ms": 0.056,
+ "p95Ms": 0.187,
+ "maxMs": 0.308,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.41,
+ "items": 8259
+ },
+ "markers.applyDiff": {
+ "count": 57,
+ "totalMs": 6.41,
+ "avgMs": 0.112,
+ "p50Ms": 0.087,
+ "p95Ms": 0.406,
+ "maxMs": 0.842,
+ "mainThreadMs": 6.41,
+ "backgroundMs": 0,
+ "items": 150
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 26.04,
+ "avgMs": 1.041,
+ "p50Ms": 0.873,
+ "p95Ms": 2.008,
+ "maxMs": 2.062,
+ "mainThreadMs": 26.04,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 26.77,
+ "avgMs": 1.071,
+ "p50Ms": 0.894,
+ "p95Ms": 2.036,
+ "maxMs": 2.081,
+ "mainThreadMs": 26.77,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 25,
+ "totalMs": 7.67,
+ "avgMs": 0.307,
+ "p50Ms": 0.273,
+ "p95Ms": 0.529,
+ "maxMs": 0.562,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.67,
+ "items": 250000
+ },
+ "marker.visualProps": {
+ "count": 96,
+ "totalMs": 1.36,
+ "avgMs": 0.014,
+ "p50Ms": 0.007,
+ "p95Ms": 0.036,
+ "maxMs": 0.196,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 471.1,
+ "afterLoadMB": 533.5,
+ "afterInteractionMB": 492.4,
+ "afterCleanupMB": 488.6,
+ "peakMB": 533.5,
+ "loadDeltaMB": 62.4,
+ "interactionDeltaMB": -41.1,
+ "retainedAfterCleanupMB": 17.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 471.1,
+ "residentMB": 619.2,
+ "javaHeapMB": 104.5,
+ "nativeHeapMB": 193,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 533.5,
+ "residentMB": 681.6,
+ "javaHeapMB": 109.9,
+ "nativeHeapMB": 251.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 492.4,
+ "residentMB": 640.7,
+ "javaHeapMB": 104.5,
+ "nativeHeapMB": 214.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 488.6,
+ "residentMB": 636.7,
+ "javaHeapMB": 104.7,
+ "nativeHeapMB": 210.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 23592432,
+ "gcCount": 6,
+ "gcTimeMs": 0.009613916000000056,
+ "heapSizeAfterMB": 84
+ },
+ "android": {
+ "javaBytesAllocated": 97296224,
+ "gcCount": 4,
+ "gcTimeMs": 322,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -38818448
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1568,
+ "wallMs": 6666,
+ "percent": 23.5,
+ "threadsBefore": 136,
+ "threadsAfter": 134,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 26,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 260000,
+ "coordinates": 260000,
+ "estimatedBytes": 18613491
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 716252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 5422.96,
+ "commits": {
+ "count": 25,
+ "totalMs": 255.01,
+ "avgMs": 10.2,
+ "p95Ms": 13.412,
+ "maxMs": 16.497
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 8.258,
+ "maxMs": 10.491
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 1.071,
+ "maxMs": 2.081
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 414,
+ "mainThreadMs": 58.56,
+ "backgroundMs": 14.62,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.76,
+ "avgMs": 0.152,
+ "p50Ms": 0.109,
+ "p95Ms": 0.272,
+ "maxMs": 0.272,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 0.83,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.036,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.83,
+ "items": 530000
+ },
+ "markers.viewportFilter": {
+ "count": 53,
+ "totalMs": 1.4,
+ "avgMs": 0.026,
+ "p50Ms": 0.018,
+ "p95Ms": 0.123,
+ "maxMs": 0.145,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.4,
+ "items": 7417
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 1.18,
+ "avgMs": 0.022,
+ "p50Ms": 0.019,
+ "p95Ms": 0.052,
+ "maxMs": 0.069,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.18,
+ "items": 4364
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 3.55,
+ "avgMs": 0.067,
+ "p50Ms": 0.054,
+ "p95Ms": 0.171,
+ "maxMs": 0.187,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.55,
+ "items": 7417
+ },
+ "markers.applyDiff": {
+ "count": 51,
+ "totalMs": 4.19,
+ "avgMs": 0.082,
+ "p50Ms": 0.077,
+ "p95Ms": 0.231,
+ "maxMs": 0.406,
+ "mainThreadMs": 4.19,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 26.04,
+ "avgMs": 1.041,
+ "p50Ms": 0.873,
+ "p95Ms": 2.008,
+ "maxMs": 2.062,
+ "mainThreadMs": 26.04,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 26.77,
+ "avgMs": 1.071,
+ "p50Ms": 0.894,
+ "p95Ms": 2.036,
+ "maxMs": 2.081,
+ "mainThreadMs": 26.77,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 25,
+ "totalMs": 7.67,
+ "avgMs": 0.307,
+ "p50Ms": 0.273,
+ "p95Ms": 0.529,
+ "maxMs": 0.562,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.67,
+ "items": 250000
+ },
+ "marker.visualProps": {
+ "count": 71,
+ "totalMs": 0.81,
+ "avgMs": 0.011,
+ "p50Ms": 0.007,
+ "p95Ms": 0.03,
+ "maxMs": 0.057,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.009613916000000056,
+ "allocatedBytes": 23341760,
+ "heapSizeAfterBytes": 88080384
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-all.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-all.json
new file mode 100644
index 0000000..068fecf
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/combined-all.json
@@ -0,0 +1,740 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-all",
+ "name": "Markers + clustering + geometry + camera + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "10k clustered markers, a 5k-point route and 100 polygons; zoom sweep, pan, and 100 moving markers at 5 Hz.",
+ "recordedAt": "2026-09-10T14:32:36.554Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 8848,
+ "load": {
+ "commitMs": 10.08,
+ "readyMs": 684,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 8.02,
+ "backgroundMs": 10.65,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.34,
+ "avgMs": 0.447,
+ "p50Ms": 0,
+ "p95Ms": 1.339,
+ "maxMs": 1.339,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.364,
+ "p50Ms": 0.364,
+ "p95Ms": 0.364,
+ "maxMs": 0.364,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 10000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.79,
+ "avgMs": 0.396,
+ "p50Ms": 0.359,
+ "p95Ms": 0.433,
+ "maxMs": 0.433,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.79,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 4.31,
+ "avgMs": 2.157,
+ "p50Ms": 2.112,
+ "p95Ms": 2.201,
+ "maxMs": 2.201,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.31,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 52
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 5.15,
+ "avgMs": 2.576,
+ "p50Ms": 2.571,
+ "p95Ms": 2.582,
+ "maxMs": 2.582,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.15,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 6.62,
+ "avgMs": 3.311,
+ "p50Ms": 0.004,
+ "p95Ms": 6.619,
+ "maxMs": 6.619,
+ "mainThreadMs": 6.62,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.010935499999999987,
+ "allocatedBytes": 4103352,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ "frames": {
+ "frames": 476,
+ "durationMs": 7965.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 8
+ },
+ "frameTimeMs": {
+ "average": 16.7,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 475,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0021,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.16,
+ "p50": 17.16,
+ "p95": 17.16,
+ "p99": 17.16,
+ "worst": 17.16
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.9,
+ "inputHandling": 0,
+ "animation": 3.3,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.4,
+ "commandIssue": 4,
+ "swapBuffers": 39.8,
+ "gpu": 88.5
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 13.7,
+ "gpu": 30.4,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 951,
+ "p50": 0.07,
+ "p95": 0.47,
+ "p99": 9.72,
+ "max": 30.01
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 19.51,
+ "max": 47.67
+ },
+ "lateFrames": 2,
+ "busyMs": 343.5,
+ "busyRatio": 0.0431,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 7967.2,
+ "commits": {
+ "count": 20,
+ "totalMs": 239.2,
+ "avgMs": 11.96,
+ "p95Ms": 18.799,
+ "maxMs": 28.656
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 9.907,
+ "maxMs": 17.886
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 1.015,
+ "maxMs": 3.14
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 874,
+ "mainThreadMs": 128.78,
+ "backgroundMs": 86.96,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 1.15,
+ "avgMs": 0.144,
+ "p50Ms": 0.114,
+ "p95Ms": 0.287,
+ "maxMs": 0.287,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 68,
+ "totalMs": 4.77,
+ "avgMs": 0.07,
+ "p50Ms": 0.022,
+ "p95Ms": 0.413,
+ "maxMs": 0.566,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.77,
+ "items": 680000
+ },
+ "markers.cluster": {
+ "count": 68,
+ "totalMs": 31.74,
+ "avgMs": 0.467,
+ "p50Ms": 0.142,
+ "p95Ms": 2.23,
+ "maxMs": 3.917,
+ "mainThreadMs": 0,
+ "backgroundMs": 31.74,
+ "items": 83339
+ },
+ "markers.diff": {
+ "count": 68,
+ "totalMs": 2.38,
+ "avgMs": 0.035,
+ "p50Ms": 0.021,
+ "p95Ms": 0.099,
+ "maxMs": 0.31,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.38,
+ "items": 6505
+ },
+ "markers.viewportCompute": {
+ "count": 68,
+ "totalMs": 39.5,
+ "avgMs": 0.581,
+ "p50Ms": 0.201,
+ "p95Ms": 2.668,
+ "maxMs": 4.794,
+ "mainThreadMs": 0,
+ "backgroundMs": 39.5,
+ "items": 83339
+ },
+ "markers.applyDiff": {
+ "count": 67,
+ "totalMs": 83.22,
+ "avgMs": 1.242,
+ "p50Ms": 0.005,
+ "p95Ms": 5.116,
+ "maxMs": 33.996,
+ "mainThreadMs": 83.22,
+ "backgroundMs": 0,
+ "items": 3658
+ },
+ "marker.visualProps": {
+ "count": 467,
+ "totalMs": 4.7,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.316,
+ "mainThreadMs": 4.7,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 19.41,
+ "avgMs": 0.97,
+ "p50Ms": 0.756,
+ "p95Ms": 1.609,
+ "maxMs": 3.091,
+ "mainThreadMs": 19.41,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 20.3,
+ "avgMs": 1.015,
+ "p50Ms": 0.847,
+ "p95Ms": 1.627,
+ "maxMs": 3.14,
+ "mainThreadMs": 20.3,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 8.57,
+ "avgMs": 0.428,
+ "p50Ms": 0.29,
+ "p95Ms": 0.821,
+ "maxMs": 1.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.57,
+ "items": 200000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 560.4,
+ "afterLoadMB": 579.4,
+ "afterInteractionMB": 603.5,
+ "afterCleanupMB": 599.6,
+ "peakMB": 603.5,
+ "loadDeltaMB": 19,
+ "interactionDeltaMB": 24.1,
+ "retainedAfterCleanupMB": 39.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 560.4,
+ "residentMB": 708.5,
+ "javaHeapMB": 122.9,
+ "nativeHeapMB": 260.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 579.4,
+ "residentMB": 727.3,
+ "javaHeapMB": 114.6,
+ "nativeHeapMB": 284.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 603.5,
+ "residentMB": 751.8,
+ "javaHeapMB": 136.6,
+ "nativeHeapMB": 278.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 599.6,
+ "residentMB": 747.9,
+ "javaHeapMB": 136.8,
+ "nativeHeapMB": 273.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 19200856,
+ "gcCount": 5,
+ "gcTimeMs": 0.013021583000000003,
+ "heapSizeAfterMB": 92
+ },
+ "android": {
+ "javaBytesAllocated": 176565616,
+ "gcCount": 8,
+ "gcTimeMs": 780,
+ "blockingGcCount": 2,
+ "nativeHeapDeltaBytes": -6142656
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 3519,
+ "wallMs": 7973,
+ "percent": 44.1,
+ "threadsBefore": 142,
+ "threadsAfter": 142,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 21,
+ "polylines": 1,
+ "polygons": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 210000,
+ "coordinates": 210000,
+ "estimatedBytes": 19031295
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 907033
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 4397.6,
+ "commits": {
+ "count": 20,
+ "totalMs": 239.2,
+ "avgMs": 11.96,
+ "p95Ms": 18.799,
+ "maxMs": 28.656
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 9.907,
+ "maxMs": 17.886
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 1.015,
+ "maxMs": 3.14
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 566,
+ "mainThreadMs": 65.06,
+ "backgroundMs": 36.44,
+ "byName": {
+ "markers.candidates": {
+ "count": 48,
+ "totalMs": 1.38,
+ "avgMs": 0.029,
+ "p50Ms": 0.019,
+ "p95Ms": 0.08,
+ "maxMs": 0.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.38,
+ "items": 480000
+ },
+ "markers.cluster": {
+ "count": 48,
+ "totalMs": 10.72,
+ "avgMs": 0.223,
+ "p50Ms": 0.138,
+ "p95Ms": 0.543,
+ "maxMs": 2.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.72,
+ "items": 9305
+ },
+ "markers.diff": {
+ "count": 48,
+ "totalMs": 1.65,
+ "avgMs": 0.034,
+ "p50Ms": 0.021,
+ "p95Ms": 0.099,
+ "maxMs": 0.273,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.65,
+ "items": 4910
+ },
+ "markers.viewportCompute": {
+ "count": 48,
+ "totalMs": 14.13,
+ "avgMs": 0.294,
+ "p50Ms": 0.191,
+ "p95Ms": 0.643,
+ "maxMs": 2.499,
+ "mainThreadMs": 0,
+ "backgroundMs": 14.13,
+ "items": 9305
+ },
+ "markers.applyDiff": {
+ "count": 48,
+ "totalMs": 22.01,
+ "avgMs": 0.459,
+ "p50Ms": 0.004,
+ "p95Ms": 1.698,
+ "maxMs": 6.913,
+ "mainThreadMs": 22.01,
+ "backgroundMs": 0,
+ "items": 2022
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 19.41,
+ "avgMs": 0.97,
+ "p50Ms": 0.756,
+ "p95Ms": 1.609,
+ "maxMs": 3.091,
+ "mainThreadMs": 19.41,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 20.3,
+ "avgMs": 1.015,
+ "p50Ms": 0.847,
+ "p95Ms": 1.627,
+ "maxMs": 3.14,
+ "mainThreadMs": 20.3,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 8.57,
+ "avgMs": 0.428,
+ "p50Ms": 0.29,
+ "p95Ms": 0.821,
+ "maxMs": 1.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.57,
+ "items": 200000
+ },
+ "marker.visualProps": {
+ "count": 262,
+ "totalMs": 2.69,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.316,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.65,
+ "avgMs": 0.163,
+ "p50Ms": 0.114,
+ "p95Ms": 0.287,
+ "maxMs": 0.287,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.013021583000000003,
+ "allocatedBytes": 18805936,
+ "heapSizeAfterBytes": 96468992
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-100.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-100.json
new file mode 100644
index 0000000..f7aaf0a
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-100.json
@@ -0,0 +1,415 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-100",
+ "name": "100 markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 100 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:25:54.075Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3808,
+ "load": {
+ "commitMs": 0.89,
+ "readyMs": 841,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 112,
+ "mainThreadMs": 13.85,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.21,
+ "avgMs": 0.104,
+ "p50Ms": 0.007,
+ "p95Ms": 0.201,
+ "maxMs": 0.201,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.004,
+ "p50Ms": 0,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.018,
+ "p50Ms": 0,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.004,
+ "p50Ms": 0,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "marker.visualProps": {
+ "count": 100,
+ "totalMs": 3.22,
+ "avgMs": 0.032,
+ "p50Ms": 0.021,
+ "p95Ms": 0.056,
+ "maxMs": 0.599,
+ "mainThreadMs": 3.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applySync": {
+ "count": 1,
+ "totalMs": 10.02,
+ "avgMs": 10.018,
+ "p50Ms": 10.018,
+ "p95Ms": 10.018,
+ "maxMs": 10.018,
+ "mainThreadMs": 10.02,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.361,
+ "p50Ms": 0.361,
+ "p95Ms": 0.361,
+ "maxMs": 0.361,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 152264,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 176,
+ "durationMs": 2940.4,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.17,
+ "p50": 17.17,
+ "p95": 17.17,
+ "p99": 17.17,
+ "worst": 17.17
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.5,
+ "inputHandling": 0,
+ "animation": 6.5,
+ "layoutMeasure": 0.5,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 8.2,
+ "swapBuffers": 36.7,
+ "gpu": 80.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.1,
+ "commandIssue": 2.8,
+ "swapBuffers": 12.6,
+ "gpu": 27.6,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 346,
+ "p50": 0.07,
+ "p95": 0.2,
+ "p99": 0.65,
+ "max": 4.31
+ },
+ "frameGapMs": {
+ "p50": 16.63,
+ "p95": 17.69,
+ "max": 20.52
+ },
+ "lateFrames": 0,
+ "busyMs": 38.5,
+ "busyRatio": 0.0131,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2942.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 4,
+ "mainThreadMs": 1.54,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.54,
+ "avgMs": 0.385,
+ "p50Ms": 0.335,
+ "p95Ms": 0.539,
+ "maxMs": 0.539,
+ "mainThreadMs": 1.54,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 146.7,
+ "afterLoadMB": 159.7,
+ "afterInteractionMB": 177.5,
+ "afterCleanupMB": 173.6,
+ "peakMB": 177.5,
+ "loadDeltaMB": 13,
+ "interactionDeltaMB": 17.8,
+ "retainedAfterCleanupMB": 26.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 146.7,
+ "residentMB": 268.3,
+ "javaHeapMB": 12.1,
+ "nativeHeapMB": 94,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 159.7,
+ "residentMB": 302.5,
+ "javaHeapMB": 8.4,
+ "nativeHeapMB": 101.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 177.5,
+ "residentMB": 321.1,
+ "javaHeapMB": 11.5,
+ "nativeHeapMB": 107.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 173.6,
+ "residentMB": 317.3,
+ "javaHeapMB": 11.6,
+ "nativeHeapMB": 103,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 148464,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": {
+ "javaBytesAllocated": 7104192,
+ "gcCount": 1,
+ "gcTimeMs": 12,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 6602784
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 531,
+ "wallMs": 2948,
+ "percent": 18,
+ "threadsBefore": 56,
+ "threadsAfter": 56,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-10k-rich.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-10k-rich.json
new file mode 100644
index 0000000..85dd710
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-10k-rich.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-10k-rich",
+ "name": "10k markers with titles and visual props",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Same as markers-10k but every descriptor carries title, subtitle, rotation, opacity, anchor and flat, to measure optional-field conversion cost.",
+ "recordedAt": "2026-09-10T14:26:31.996Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3796,
+ "load": {
+ "commitMs": 11.4,
+ "readyMs": 773,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 92,
+ "mainThreadMs": 5.68,
+ "backgroundMs": 1.11,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 3.28,
+ "avgMs": 1.642,
+ "p50Ms": 0,
+ "p95Ms": 3.284,
+ "maxMs": 3.284,
+ "mainThreadMs": 3.28,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.136,
+ "p50Ms": 0.136,
+ "p95Ms": 0.136,
+ "maxMs": 0.136,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.586,
+ "p50Ms": 0.586,
+ "p95Ms": 0.586,
+ "maxMs": 0.586,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.04,
+ "p50Ms": 0.02,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.05,
+ "p95Ms": 0.08,
+ "maxMs": 0.08,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 170
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.016,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 140
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.27,
+ "avgMs": 0.134,
+ "p50Ms": 0.089,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 170
+ },
+ "marker.visualProps": {
+ "count": 70,
+ "totalMs": 0.57,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.013,
+ "maxMs": 0.15,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.69,
+ "avgMs": 0.845,
+ "p50Ms": 0.003,
+ "p95Ms": 1.686,
+ "maxMs": 1.686,
+ "mainThreadMs": 1.69,
+ "backgroundMs": 0,
+ "items": 70
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.027060249999999997,
+ "allocatedBytes": 5468072,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 176,
+ "durationMs": 2938.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.15,
+ "p50": 17.15,
+ "p95": 17.15,
+ "p99": 17.15,
+ "worst": 17.15
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3,
+ "inputHandling": 0,
+ "animation": 7.3,
+ "layoutMeasure": 0.4,
+ "draw": 0.6,
+ "sync": 0.4,
+ "commandIssue": 2.7,
+ "swapBuffers": 40.9,
+ "gpu": 85.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 2.5,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 0.9,
+ "swapBuffers": 14,
+ "gpu": 29.2,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 349,
+ "p50": 0.07,
+ "p95": 0.18,
+ "p99": 0.3,
+ "max": 0.44
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 17.5,
+ "max": 17.91
+ },
+ "lateFrames": 0,
+ "busyMs": 30.6,
+ "busyRatio": 0.0104,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2940.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 166,
+ "mainThreadMs": 4.21,
+ "backgroundMs": 6,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.72,
+ "avgMs": 0.181,
+ "p50Ms": 0.198,
+ "p95Ms": 0.213,
+ "maxMs": 0.213,
+ "mainThreadMs": 0.72,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.37,
+ "avgMs": 0.023,
+ "p50Ms": 0.021,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 2.15,
+ "avgMs": 0.134,
+ "p50Ms": 0.089,
+ "p95Ms": 0.769,
+ "maxMs": 0.769,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.15,
+ "items": 2477
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.45,
+ "avgMs": 0.028,
+ "p50Ms": 0.023,
+ "p95Ms": 0.114,
+ "maxMs": 0.114,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 1426
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 3.03,
+ "avgMs": 0.189,
+ "p50Ms": 0.139,
+ "p95Ms": 0.818,
+ "maxMs": 0.818,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.03,
+ "items": 2477
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 2.68,
+ "avgMs": 0.168,
+ "p50Ms": 0.134,
+ "p95Ms": 0.566,
+ "maxMs": 0.566,
+ "mainThreadMs": 2.68,
+ "backgroundMs": 0,
+ "items": 145
+ },
+ "marker.visualProps": {
+ "count": 82,
+ "totalMs": 0.8,
+ "avgMs": 0.01,
+ "p50Ms": 0.006,
+ "p95Ms": 0.021,
+ "maxMs": 0.055,
+ "mainThreadMs": 0.8,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 236.6,
+ "afterLoadMB": 199.8,
+ "afterInteractionMB": 253.4,
+ "afterCleanupMB": 249.4,
+ "peakMB": 253.4,
+ "loadDeltaMB": -36.8,
+ "interactionDeltaMB": 53.6,
+ "retainedAfterCleanupMB": 12.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 236.6,
+ "residentMB": 382.5,
+ "javaHeapMB": 22.4,
+ "nativeHeapMB": 153.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 199.8,
+ "residentMB": 345.8,
+ "javaHeapMB": 23.8,
+ "nativeHeapMB": 111,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 253.4,
+ "residentMB": 399.5,
+ "javaHeapMB": 29.7,
+ "nativeHeapMB": 159.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 249.4,
+ "residentMB": 395.6,
+ "javaHeapMB": 29.8,
+ "nativeHeapMB": 155,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 180056,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 6123184,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 50977808
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 419,
+ "wallMs": 2945,
+ "percent": 14.2,
+ "threadsBefore": 71,
+ "threadsAfter": 71,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-10k.json
new file mode 100644
index 0000000..71f912c
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-10k.json
@@ -0,0 +1,536 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-10k",
+ "name": "10k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 10000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:26:08.127Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3781,
+ "load": {
+ "commitMs": 11.96,
+ "readyMs": 763,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 6.14,
+ "backgroundMs": 3.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 2.63,
+ "avgMs": 1.315,
+ "p50Ms": 0.001,
+ "p95Ms": 2.63,
+ "maxMs": 2.63,
+ "mainThreadMs": 2.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.45,
+ "avgMs": 0.446,
+ "p50Ms": 0.446,
+ "p95Ms": 0.446,
+ "maxMs": 0.446,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 3.14,
+ "avgMs": 3.139,
+ "p50Ms": 3.139,
+ "p95Ms": 3.139,
+ "maxMs": 3.139,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.14,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.12,
+ "avgMs": 0.058,
+ "p50Ms": 0.02,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.053,
+ "p50Ms": 0.048,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.023,
+ "p50Ms": 0.016,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.28,
+ "avgMs": 0.139,
+ "p50Ms": 0.105,
+ "p95Ms": 0.174,
+ "maxMs": 0.174,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.28,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 1.12,
+ "avgMs": 0.018,
+ "p50Ms": 0.006,
+ "p95Ms": 0.015,
+ "maxMs": 0.563,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.94,
+ "avgMs": 0.969,
+ "p50Ms": 0.005,
+ "p95Ms": 1.932,
+ "maxMs": 1.932,
+ "mainThreadMs": 1.94,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0051092080000000005,
+ "allocatedBytes": 2718864,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 175,
+ "durationMs": 2927.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 30.71,
+ "p50": 30.71,
+ "p95": 30.71,
+ "p99": 30.71,
+ "worst": 30.71
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 3.3,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1,
+ "swapBuffers": 93.2,
+ "gpu": 92.4
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 2,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 0.6,
+ "swapBuffers": 57.2,
+ "gpu": 56.8,
+ "total": 61.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 344,
+ "p50": 0.08,
+ "p95": 0.21,
+ "p99": 0.45,
+ "max": 3.79
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.3,
+ "max": 20.88
+ },
+ "lateFrames": 0,
+ "busyMs": 39.8,
+ "busyRatio": 0.0136,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2928.6,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 154,
+ "mainThreadMs": 7.62,
+ "backgroundMs": 6.41,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.73,
+ "avgMs": 0.183,
+ "p50Ms": 0.156,
+ "p95Ms": 0.249,
+ "maxMs": 0.249,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.67,
+ "avgMs": 0.042,
+ "p50Ms": 0.032,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.67,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 1.83,
+ "avgMs": 0.114,
+ "p50Ms": 0.092,
+ "p95Ms": 0.341,
+ "maxMs": 0.341,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.83,
+ "items": 2237
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.59,
+ "avgMs": 0.037,
+ "p50Ms": 0.032,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 1328
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 3.32,
+ "avgMs": 0.207,
+ "p50Ms": 0.176,
+ "p95Ms": 0.433,
+ "maxMs": 0.433,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.32,
+ "items": 2237
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 5.57,
+ "avgMs": 0.348,
+ "p50Ms": 0.187,
+ "p95Ms": 2.202,
+ "maxMs": 2.202,
+ "mainThreadMs": 5.57,
+ "backgroundMs": 0,
+ "items": 119
+ },
+ "marker.visualProps": {
+ "count": 70,
+ "totalMs": 1.32,
+ "avgMs": 0.019,
+ "p50Ms": 0.01,
+ "p95Ms": 0.088,
+ "maxMs": 0.111,
+ "mainThreadMs": 1.32,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 176.3,
+ "afterLoadMB": 201.5,
+ "afterInteractionMB": 199.5,
+ "afterCleanupMB": 195.7,
+ "peakMB": 201.5,
+ "loadDeltaMB": 25.2,
+ "interactionDeltaMB": -2,
+ "retainedAfterCleanupMB": 19.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 176.3,
+ "residentMB": 321.4,
+ "javaHeapMB": 12.1,
+ "nativeHeapMB": 113.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 201.5,
+ "residentMB": 346.8,
+ "javaHeapMB": 12.6,
+ "nativeHeapMB": 136.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 199.5,
+ "residentMB": 345.1,
+ "javaHeapMB": 15.1,
+ "nativeHeapMB": 132.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 195.7,
+ "residentMB": 341.4,
+ "javaHeapMB": 15.3,
+ "nativeHeapMB": 128,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 178328,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": {
+ "javaBytesAllocated": 6536688,
+ "gcCount": 1,
+ "gcTimeMs": 34,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -4379376
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 653,
+ "wallMs": 2938,
+ "percent": 22.2,
+ "threadsBefore": 61,
+ "threadsAfter": 61,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-1k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-1k.json
new file mode 100644
index 0000000..ea27fab
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-1k.json
@@ -0,0 +1,536 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-1k",
+ "name": "1k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 1000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:26:00.594Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3801,
+ "load": {
+ "commitMs": 2.85,
+ "readyMs": 762,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 1.86,
+ "backgroundMs": 1.15,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.67,
+ "avgMs": 0.333,
+ "p50Ms": 0.007,
+ "p95Ms": 0.658,
+ "maxMs": 0.658,
+ "mainThreadMs": 0.67,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.114,
+ "p50Ms": 0.114,
+ "p95Ms": 0.114,
+ "maxMs": 0.114,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.47,
+ "avgMs": 0.469,
+ "p50Ms": 0.469,
+ "p95Ms": 0.469,
+ "maxMs": 0.469,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.19,
+ "avgMs": 0.095,
+ "p50Ms": 0.094,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.031,
+ "p50Ms": 0.016,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.04,
+ "p50Ms": 0.021,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.35,
+ "avgMs": 0.175,
+ "p50Ms": 0.138,
+ "p95Ms": 0.212,
+ "maxMs": 0.212,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.35,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.3,
+ "avgMs": 0.075,
+ "p50Ms": 0.026,
+ "p95Ms": 0.18,
+ "maxMs": 0.18,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.77,
+ "avgMs": 0.385,
+ "p50Ms": 0.007,
+ "p95Ms": 0.763,
+ "maxMs": 0.763,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 314856,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 175,
+ "durationMs": 2930.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.58,
+ "p50": 16.58,
+ "p95": 16.58,
+ "p99": 16.58,
+ "worst": 16.58
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.2,
+ "inputHandling": 0,
+ "animation": 8.4,
+ "layoutMeasure": 1.8,
+ "draw": 1,
+ "sync": 2.3,
+ "commandIssue": 14.8,
+ "swapBuffers": 66.4,
+ "gpu": 65.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 2.8,
+ "layoutMeasure": 0.6,
+ "draw": 0.3,
+ "sync": 0.8,
+ "commandIssue": 4.9,
+ "swapBuffers": 22,
+ "gpu": 21.8,
+ "total": 33.2
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 346,
+ "p50": 0.08,
+ "p95": 0.24,
+ "p99": 0.59,
+ "max": 5.09
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.97,
+ "max": 24.21
+ },
+ "lateFrames": 0,
+ "busyMs": 42.5,
+ "busyRatio": 0.0145,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 90,
+ "mainThreadMs": 3.67,
+ "backgroundMs": 4.16,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.01,
+ "avgMs": 0.253,
+ "p50Ms": 0.168,
+ "p95Ms": 0.44,
+ "maxMs": 0.44,
+ "mainThreadMs": 1.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.58,
+ "avgMs": 0.036,
+ "p50Ms": 0.028,
+ "p95Ms": 0.088,
+ "maxMs": 0.088,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 16000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.81,
+ "avgMs": 0.051,
+ "p50Ms": 0.021,
+ "p95Ms": 0.429,
+ "maxMs": 0.429,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.81,
+ "items": 252
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.61,
+ "avgMs": 0.038,
+ "p50Ms": 0.014,
+ "p95Ms": 0.346,
+ "maxMs": 0.346,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.61,
+ "items": 105
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 2.16,
+ "avgMs": 0.135,
+ "p50Ms": 0.086,
+ "p95Ms": 0.562,
+ "maxMs": 0.562,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.16,
+ "items": 252
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 2.01,
+ "avgMs": 0.125,
+ "p50Ms": 0.012,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 2.01,
+ "backgroundMs": 0,
+ "items": 10
+ },
+ "marker.visualProps": {
+ "count": 6,
+ "totalMs": 0.65,
+ "avgMs": 0.108,
+ "p50Ms": 0.05,
+ "p95Ms": 0.245,
+ "maxMs": 0.245,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 174.4,
+ "afterLoadMB": 185,
+ "afterInteractionMB": 179.9,
+ "afterCleanupMB": 176.1,
+ "peakMB": 185,
+ "loadDeltaMB": 10.6,
+ "interactionDeltaMB": -5.1,
+ "retainedAfterCleanupMB": 1.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 174.4,
+ "residentMB": 318.1,
+ "javaHeapMB": 11.7,
+ "nativeHeapMB": 103.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 185,
+ "residentMB": 329.2,
+ "javaHeapMB": 10.2,
+ "nativeHeapMB": 124.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 179.9,
+ "residentMB": 324.5,
+ "javaHeapMB": 11.9,
+ "nativeHeapMB": 117.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 176.1,
+ "residentMB": 321.3,
+ "javaHeapMB": 12,
+ "nativeHeapMB": 113.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 160880,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": {
+ "javaBytesAllocated": 4390896,
+ "gcCount": 1,
+ "gcTimeMs": 15,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -6976832
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 578,
+ "wallMs": 2935,
+ "percent": 19.7,
+ "threadsBefore": 59,
+ "threadsAfter": 58,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-50k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-50k.json
new file mode 100644
index 0000000..5ba045f
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-50k.json
@@ -0,0 +1,535 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-50k",
+ "name": "50k markers",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 50000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:26:17.354Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3797,
+ "load": {
+ "commitMs": 44.06,
+ "readyMs": 832,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 335,
+ "mainThreadMs": 20.95,
+ "backgroundMs": 5.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 10.17,
+ "avgMs": 5.086,
+ "p50Ms": 0.001,
+ "p95Ms": 10.172,
+ "maxMs": 10.172,
+ "mainThreadMs": 10.17,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.227,
+ "p50Ms": 0.227,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 3.16,
+ "avgMs": 3.16,
+ "p50Ms": 3.16,
+ "p95Ms": 3.16,
+ "maxMs": 3.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.16,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.053,
+ "p50Ms": 0.019,
+ "p95Ms": 0.086,
+ "maxMs": 0.086,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 100000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.77,
+ "avgMs": 0.385,
+ "p50Ms": 0.185,
+ "p95Ms": 0.585,
+ "maxMs": 0.585,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.77,
+ "items": 826
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.14,
+ "avgMs": 0.071,
+ "p50Ms": 0.068,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 626
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 1.04,
+ "avgMs": 0.518,
+ "p50Ms": 0.281,
+ "p95Ms": 0.755,
+ "maxMs": 0.755,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.04,
+ "items": 826
+ },
+ "marker.visualProps": {
+ "count": 313,
+ "totalMs": 2.44,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.301,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 8.1,
+ "avgMs": 4.051,
+ "p50Ms": 0.005,
+ "p95Ms": 8.097,
+ "maxMs": 8.097,
+ "mainThreadMs": 8.1,
+ "backgroundMs": 0,
+ "items": 313
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.008974793000000002,
+ "allocatedBytes": 13886000,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 173,
+ "durationMs": 2932.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.3,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.86,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 50,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 172,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0058,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 103.66,
+ "p50": 103.66,
+ "p95": 103.66,
+ "p99": 103.66,
+ "worst": 103.66
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0.8,
+ "inputHandling": 0,
+ "animation": 4.2,
+ "layoutMeasure": 0.8,
+ "draw": 1.1,
+ "sync": 1.4,
+ "commandIssue": 4.6,
+ "swapBuffers": 86.6,
+ "gpu": 86.4
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 8.6,
+ "layoutMeasure": 1.6,
+ "draw": 2.3,
+ "sync": 2.9,
+ "commandIssue": 9.4,
+ "swapBuffers": 179.5,
+ "gpu": 179.2,
+ "total": 207.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 345,
+ "p50": 0.08,
+ "p95": 0.23,
+ "p99": 0.36,
+ "max": 2.02
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 18,
+ "max": 48.71
+ },
+ "lateFrames": 1,
+ "busyMs": 36.8,
+ "busyRatio": 0.0125,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2934.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 504,
+ "mainThreadMs": 28.77,
+ "backgroundMs": 33.27,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 4.96,
+ "avgMs": 1.24,
+ "p50Ms": 0.137,
+ "p95Ms": 4.564,
+ "maxMs": 4.564,
+ "mainThreadMs": 4.96,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.78,
+ "avgMs": 0.049,
+ "p50Ms": 0.033,
+ "p95Ms": 0.224,
+ "maxMs": 0.224,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 800000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 13.49,
+ "avgMs": 0.843,
+ "p50Ms": 0.316,
+ "p95Ms": 4.897,
+ "maxMs": 4.897,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.49,
+ "items": 11219
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 2.24,
+ "avgMs": 0.14,
+ "p50Ms": 0.122,
+ "p95Ms": 0.411,
+ "maxMs": 0.411,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.24,
+ "items": 6678
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 16.75,
+ "avgMs": 1.047,
+ "p50Ms": 0.501,
+ "p95Ms": 5.362,
+ "maxMs": 5.362,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.75,
+ "items": 11219
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 20.58,
+ "avgMs": 1.286,
+ "p50Ms": 0.555,
+ "p95Ms": 8.717,
+ "maxMs": 8.717,
+ "mainThreadMs": 20.58,
+ "backgroundMs": 0,
+ "items": 723
+ },
+ "marker.visualProps": {
+ "count": 420,
+ "totalMs": 3.23,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.019,
+ "maxMs": 0.107,
+ "mainThreadMs": 3.23,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 195.9,
+ "afterLoadMB": 259.3,
+ "afterInteractionMB": 252.5,
+ "afterCleanupMB": 248.7,
+ "peakMB": 259.3,
+ "loadDeltaMB": 63.4,
+ "interactionDeltaMB": -6.8,
+ "retainedAfterCleanupMB": 52.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 195.9,
+ "residentMB": 341.6,
+ "javaHeapMB": 15.4,
+ "nativeHeapMB": 128.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 259.3,
+ "residentMB": 404.9,
+ "javaHeapMB": 21.6,
+ "nativeHeapMB": 177.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 252.5,
+ "residentMB": 398.4,
+ "javaHeapMB": 27.5,
+ "nativeHeapMB": 164.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 248.7,
+ "residentMB": 394.7,
+ "javaHeapMB": 27.6,
+ "nativeHeapMB": 160,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 254872,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 15391920,
+ "gcCount": 2,
+ "gcTimeMs": 83,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -13411728
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1156,
+ "wallMs": 2977,
+ "percent": 38.8,
+ "threadsBefore": 64,
+ "threadsAfter": 64,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-children-1k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-children-1k.json
new file mode 100644
index 0000000..4c5456e
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/markers-children-1k.json
@@ -0,0 +1,590 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-children-1k",
+ "name": "1k children",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 1000 markers as children (collected from React children on every render), then a short pan.",
+ "recordedAt": "2026-09-10T14:26:24.402Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3792,
+ "load": {
+ "commitMs": 3.52,
+ "readyMs": 791,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 4.71,
+ "backgroundMs": 6.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.33,
+ "avgMs": 0.164,
+ "p50Ms": 0.001,
+ "p95Ms": 0.328,
+ "maxMs": 0.328,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.07,
+ "avgMs": 0.033,
+ "p50Ms": 0,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.117,
+ "p50Ms": 0.117,
+ "p95Ms": 0.117,
+ "maxMs": 0.117,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 2,
+ "avgMs": 2.001,
+ "p50Ms": 2.001,
+ "p95Ms": 2.001,
+ "maxMs": 2.001,
+ "mainThreadMs": 2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.048,
+ "p50Ms": 0.039,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 2.99,
+ "avgMs": 1.493,
+ "p50Ms": 0.021,
+ "p95Ms": 2.966,
+ "maxMs": 2.966,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.99,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.019,
+ "p50Ms": 0.006,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 3.16,
+ "avgMs": 1.578,
+ "p50Ms": 0.078,
+ "p95Ms": 3.077,
+ "maxMs": 3.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.16,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.61,
+ "avgMs": 0.154,
+ "p50Ms": 0.013,
+ "p95Ms": 0.574,
+ "maxMs": 0.574,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.7,
+ "avgMs": 0.85,
+ "p50Ms": 0.004,
+ "p95Ms": 1.696,
+ "maxMs": 1.696,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 884264,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 175,
+ "durationMs": 2929.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 56.6,
+ "p50": 56.6,
+ "p95": 56.6,
+ "p99": 56.6,
+ "worst": 56.6
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 9.4,
+ "layoutMeasure": 1.6,
+ "draw": 2.3,
+ "sync": 0.3,
+ "commandIssue": 2.4,
+ "swapBuffers": 55.9,
+ "gpu": 82.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.9,
+ "inputHandling": 0,
+ "animation": 10.6,
+ "layoutMeasure": 1.8,
+ "draw": 2.6,
+ "sync": 0.4,
+ "commandIssue": 2.8,
+ "swapBuffers": 63.3,
+ "gpu": 93,
+ "total": 113.2
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 348,
+ "p50": 0.08,
+ "p95": 0.27,
+ "p99": 1.43,
+ "max": 1.68
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.7,
+ "max": 21.37
+ },
+ "lateFrames": 0,
+ "busyMs": 44.2,
+ "busyRatio": 0.0151,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 100,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 3.68,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.64,
+ "avgMs": 0.16,
+ "p50Ms": 0.165,
+ "p95Ms": 0.19,
+ "maxMs": 0.19,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 17,
+ "totalMs": 0.51,
+ "avgMs": 0.03,
+ "p50Ms": 0.024,
+ "p95Ms": 0.075,
+ "maxMs": 0.075,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 17000
+ },
+ "markers.viewportFilter": {
+ "count": 17,
+ "totalMs": 0.45,
+ "avgMs": 0.026,
+ "p50Ms": 0.023,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 272
+ },
+ "markers.diff": {
+ "count": 17,
+ "totalMs": 0.84,
+ "avgMs": 0.05,
+ "p50Ms": 0.008,
+ "p95Ms": 0.665,
+ "maxMs": 0.665,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.84,
+ "items": 113
+ },
+ "markers.viewportCompute": {
+ "count": 17,
+ "totalMs": 1.88,
+ "avgMs": 0.11,
+ "p50Ms": 0.059,
+ "p95Ms": 0.723,
+ "maxMs": 0.723,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.88,
+ "items": 272
+ },
+ "markers.applyDiff": {
+ "count": 17,
+ "totalMs": 1.29,
+ "avgMs": 0.076,
+ "p50Ms": 0.004,
+ "p95Ms": 0.529,
+ "maxMs": 0.529,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.35,
+ "p50Ms": 0.35,
+ "p95Ms": 0.35,
+ "maxMs": 0.35,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.36,
+ "p50Ms": 0.36,
+ "p95Ms": 0.36,
+ "maxMs": 0.36,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.111,
+ "p50Ms": 0.111,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "marker.visualProps": {
+ "count": 6,
+ "totalMs": 0.21,
+ "avgMs": 0.035,
+ "p50Ms": 0.023,
+ "p95Ms": 0.094,
+ "maxMs": 0.094,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 248.8,
+ "afterLoadMB": 276.1,
+ "afterInteractionMB": 240.4,
+ "afterCleanupMB": 236.4,
+ "peakMB": 276.1,
+ "loadDeltaMB": 27.3,
+ "interactionDeltaMB": -35.7,
+ "retainedAfterCleanupMB": -12.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 248.8,
+ "residentMB": 394.7,
+ "javaHeapMB": 27.8,
+ "nativeHeapMB": 160.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 276.1,
+ "residentMB": 422.1,
+ "javaHeapMB": 20.8,
+ "nativeHeapMB": 194.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 240.4,
+ "residentMB": 386.4,
+ "javaHeapMB": 22.1,
+ "nativeHeapMB": 157.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 236.4,
+ "residentMB": 382.4,
+ "javaHeapMB": 22.3,
+ "nativeHeapMB": 153,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 160632,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 4669792,
+ "gcCount": 1,
+ "gcTimeMs": 85,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -38770880
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 735,
+ "wallMs": 2938,
+ "percent": 25,
+ "threadsBefore": 67,
+ "threadsAfter": 67,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 1,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-10k.json
new file mode 100644
index 0000000..2dace42
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-10k.json
@@ -0,0 +1,6030 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-10k",
+ "name": "Marker update cost at 10k",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "With 10000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:28:50.798Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 20265,
+ "load": {
+ "commitMs": 10.14,
+ "readyMs": 771,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.27,
+ "backgroundMs": 0.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.75,
+ "avgMs": 0.873,
+ "p50Ms": 0,
+ "p95Ms": 1.745,
+ "maxMs": 1.745,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.106,
+ "p50Ms": 0.106,
+ "p95Ms": 0.106,
+ "maxMs": 0.106,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.192,
+ "p50Ms": 0.192,
+ "p95Ms": 0.192,
+ "maxMs": 0.192,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.023,
+ "p50Ms": 0.015,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.024,
+ "p50Ms": 0.022,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.064,
+ "p50Ms": 0.053,
+ "p95Ms": 0.076,
+ "maxMs": 0.076,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.44,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.006,
+ "maxMs": 0.13,
+ "mainThreadMs": 0.44,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.98,
+ "avgMs": 0.49,
+ "p50Ms": 0.003,
+ "p95Ms": 0.978,
+ "maxMs": 0.978,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.007621500000000003,
+ "allocatedBytes": 2720448,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 1161,
+ "durationMs": 19393,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.7,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1159,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0017,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.48,
+ "p50": 17.48,
+ "p95": 17.48,
+ "p99": 17.48,
+ "worst": 17.48
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.5,
+ "inputHandling": 0,
+ "animation": 2.5,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 3,
+ "swapBuffers": 31.6,
+ "gpu": 92
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.9,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1,
+ "swapBuffers": 11.1,
+ "gpu": 32.2,
+ "total": 35
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 2140,
+ "p50": 0.13,
+ "p95": 0.66,
+ "p99": 14.96,
+ "max": 34.81
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 19.03,
+ "max": 48.27
+ },
+ "lateFrames": 7,
+ "busyMs": 1314.6,
+ "busyRatio": 0.0678,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 19394.8,
+ "commits": {
+ "count": 40,
+ "totalMs": 640.67,
+ "avgMs": 16.017,
+ "p95Ms": 19.152,
+ "maxMs": 23.074
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 14.061,
+ "maxMs": 22.554
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 2.071,
+ "maxMs": 18.332
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 675,
+ "mainThreadMs": 170.62,
+ "backgroundMs": 28.06,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 40,
+ "totalMs": 80.78,
+ "avgMs": 2.019,
+ "p50Ms": 1.302,
+ "p95Ms": 3.93,
+ "maxMs": 18.256,
+ "mainThreadMs": 80.78,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.set": {
+ "count": 40,
+ "totalMs": 82.82,
+ "avgMs": 2.071,
+ "p50Ms": 1.338,
+ "p95Ms": 3.987,
+ "maxMs": 18.332,
+ "mainThreadMs": 82.82,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 21.62,
+ "avgMs": 0.54,
+ "p50Ms": 0.404,
+ "p95Ms": 1.269,
+ "maxMs": 1.646,
+ "mainThreadMs": 0,
+ "backgroundMs": 21.62,
+ "items": 400025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 1.07,
+ "avgMs": 0.027,
+ "p50Ms": 0.019,
+ "p95Ms": 0.057,
+ "maxMs": 0.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.07,
+ "items": 400025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.96,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.044,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 3254
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 1.14,
+ "avgMs": 0.029,
+ "p50Ms": 0.024,
+ "p95Ms": 0.046,
+ "maxMs": 0.119,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 2558
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 3.27,
+ "avgMs": 0.082,
+ "p50Ms": 0.062,
+ "p95Ms": 0.16,
+ "maxMs": 0.297,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.27,
+ "items": 3254
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 5.49,
+ "avgMs": 0.137,
+ "p50Ms": 0.006,
+ "p95Ms": 0.532,
+ "maxMs": 1.404,
+ "mainThreadMs": 5.49,
+ "backgroundMs": 0,
+ "items": 357
+ },
+ "marker.visualProps": {
+ "count": 355,
+ "totalMs": 1.52,
+ "avgMs": 0.004,
+ "p50Ms": 0.002,
+ "p95Ms": 0.011,
+ "maxMs": 0.256,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 329.8,
+ "afterLoadMB": 368,
+ "afterInteractionMB": 313.6,
+ "afterCleanupMB": 309.6,
+ "peakMB": 368,
+ "loadDeltaMB": 38.2,
+ "interactionDeltaMB": -54.4,
+ "retainedAfterCleanupMB": -20.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 329.8,
+ "residentMB": 476.7,
+ "javaHeapMB": 62,
+ "nativeHeapMB": 181.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 368,
+ "residentMB": 514.7,
+ "javaHeapMB": 67.4,
+ "nativeHeapMB": 214.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 313.6,
+ "residentMB": 460.6,
+ "javaHeapMB": 75.4,
+ "nativeHeapMB": 144.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 309.6,
+ "residentMB": 456.6,
+ "javaHeapMB": 75.5,
+ "nativeHeapMB": 140.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 45769000,
+ "gcCount": 12,
+ "gcTimeMs": 0.05694537499999999,
+ "heapSizeAfterMB": 48
+ },
+ "android": {
+ "javaBytesAllocated": 140014240,
+ "gcCount": 5,
+ "gcTimeMs": 398,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -72915776
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 2409,
+ "wallMs": 19402,
+ "percent": 12.4,
+ "threadsBefore": 100,
+ "threadsAfter": 98,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 41,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 410025,
+ "coordinates": 410025,
+ "estimatedBytes": 29361098
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717190
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 472.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.36,
+ "avgMs": 11.36,
+ "p95Ms": 11.36,
+ "maxMs": 11.36
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.348,
+ "maxMs": 14.348
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.774,
+ "maxMs": 0.774
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 0.36,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.75,
+ "avgMs": 0.747,
+ "p50Ms": 0.747,
+ "p95Ms": 0.747,
+ "maxMs": 0.747,
+ "mainThreadMs": 0.75,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.774,
+ "p50Ms": 0.774,
+ "p95Ms": 0.774,
+ "maxMs": 0.774,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.263,
+ "p50Ms": 0.263,
+ "p95Ms": 0.263,
+ "maxMs": 0.263,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1026128,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 1
+ },
+ "wallMs": 484.03,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.46,
+ "avgMs": 17.458,
+ "p95Ms": 17.458,
+ "maxMs": 17.458
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.305,
+ "maxMs": 16.305
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.284,
+ "maxMs": 1.284
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.53,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.241,
+ "p50Ms": 1.241,
+ "p95Ms": 1.241,
+ "maxMs": 1.241,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.28,
+ "avgMs": 1.284,
+ "p50Ms": 1.284,
+ "p95Ms": 1.284,
+ "maxMs": 1.284,
+ "mainThreadMs": 1.28,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.324,
+ "p50Ms": 0.324,
+ "p95Ms": 0.324,
+ "maxMs": 0.324,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1024360,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 2
+ },
+ "wallMs": 482.48,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.26,
+ "avgMs": 18.259,
+ "p95Ms": 18.259,
+ "maxMs": 18.259
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.769,
+ "maxMs": 13.769
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.977,
+ "maxMs": 0.977
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.92,
+ "backgroundMs": 0.42,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.94,
+ "avgMs": 0.943,
+ "p50Ms": 0.943,
+ "p95Ms": 0.943,
+ "maxMs": 0.943,
+ "mainThreadMs": 0.94,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.977,
+ "p50Ms": 0.977,
+ "p95Ms": 0.977,
+ "maxMs": 0.977,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.301,
+ "p50Ms": 0.301,
+ "p95Ms": 0.301,
+ "maxMs": 0.301,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.061,
+ "p50Ms": 0.061,
+ "p95Ms": 0.061,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002484708000000002,
+ "allocatedBytes": 1024840,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 3
+ },
+ "wallMs": 479.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.7,
+ "avgMs": 16.705,
+ "p95Ms": 16.705,
+ "maxMs": 16.705
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.77,
+ "maxMs": 14.77
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.798,
+ "maxMs": 1.798
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.55,
+ "backgroundMs": 0.49,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.75,
+ "avgMs": 1.75,
+ "p50Ms": 1.75,
+ "p95Ms": 1.75,
+ "maxMs": 1.75,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.8,
+ "avgMs": 1.798,
+ "p50Ms": 1.798,
+ "p95Ms": 1.798,
+ "maxMs": 1.798,
+ "mainThreadMs": 1.8,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.366,
+ "p50Ms": 0.366,
+ "p95Ms": 0.366,
+ "maxMs": 0.366,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1023376,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 4
+ },
+ "wallMs": 485.85,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.31,
+ "avgMs": 12.313,
+ "p95Ms": 12.313,
+ "maxMs": 12.313
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.993,
+ "maxMs": 2.993
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.833,
+ "maxMs": 0.833
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.65,
+ "backgroundMs": 0.29,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.81,
+ "avgMs": 0.811,
+ "p50Ms": 0.811,
+ "p95Ms": 0.811,
+ "maxMs": 0.811,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.83,
+ "avgMs": 0.833,
+ "p50Ms": 0.833,
+ "p95Ms": 0.833,
+ "maxMs": 0.833,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.206,
+ "p50Ms": 0.206,
+ "p95Ms": 0.206,
+ "maxMs": 0.206,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 10005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1025808,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10005,
+ "repeat": 0
+ },
+ "wallMs": 477.38,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.57,
+ "avgMs": 15.569,
+ "p95Ms": 15.569,
+ "maxMs": 15.569
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.005,
+ "maxMs": 14.005
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.434,
+ "maxMs": 1.434
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.78,
+ "backgroundMs": 0.6,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.35,
+ "avgMs": 1.346,
+ "p50Ms": 1.346,
+ "p95Ms": 1.346,
+ "maxMs": 1.346,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.43,
+ "avgMs": 1.434,
+ "p50Ms": 1.434,
+ "p95Ms": 1.434,
+ "maxMs": 1.434,
+ "mainThreadMs": 1.43,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.442,
+ "p50Ms": 0.442,
+ "p95Ms": 0.442,
+ "maxMs": 0.442,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931768,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 1
+ },
+ "wallMs": 481.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.67,
+ "avgMs": 16.674,
+ "p95Ms": 16.674,
+ "maxMs": 16.674
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.991,
+ "maxMs": 16.991
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.273,
+ "maxMs": 1.273
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.52,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.241,
+ "p50Ms": 1.241,
+ "p95Ms": 1.241,
+ "maxMs": 1.241,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.273,
+ "p50Ms": 1.273,
+ "p95Ms": 1.273,
+ "maxMs": 1.273,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.404,
+ "p50Ms": 0.404,
+ "p95Ms": 0.404,
+ "maxMs": 0.404,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.4,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016481250000000003,
+ "allocatedBytes": 931568,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 2
+ },
+ "wallMs": 482.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.79,
+ "avgMs": 17.786,
+ "p95Ms": 17.786,
+ "maxMs": 17.786
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.179,
+ "maxMs": 15.179
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.163,
+ "maxMs": 1.163
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 1,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.11,
+ "avgMs": 1.111,
+ "p50Ms": 1.111,
+ "p95Ms": 1.111,
+ "maxMs": 1.111,
+ "mainThreadMs": 1.11,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.163,
+ "p50Ms": 1.163,
+ "p95Ms": 1.163,
+ "maxMs": 1.163,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.765,
+ "p50Ms": 0.765,
+ "p95Ms": 0.765,
+ "maxMs": 0.765,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.76,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.119,
+ "p50Ms": 0.119,
+ "p95Ms": 0.119,
+ "maxMs": 0.119,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931392,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 3
+ },
+ "wallMs": 478.31,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.38,
+ "avgMs": 17.379,
+ "p95Ms": 17.379,
+ "maxMs": 17.379
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.671,
+ "maxMs": 14.671
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.901,
+ "maxMs": 1.901
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.76,
+ "backgroundMs": 0.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.84,
+ "avgMs": 1.844,
+ "p50Ms": 1.844,
+ "p95Ms": 1.844,
+ "maxMs": 1.844,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.9,
+ "avgMs": 1.901,
+ "p50Ms": 1.901,
+ "p95Ms": 1.901,
+ "maxMs": 1.901,
+ "mainThreadMs": 1.9,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.51,
+ "p50Ms": 0.51,
+ "p95Ms": 0.51,
+ "maxMs": 0.51,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.103,
+ "p50Ms": 0.103,
+ "p95Ms": 0.103,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 936464,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 4
+ },
+ "wallMs": 482.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.88,
+ "avgMs": 15.88,
+ "p95Ms": 15.88,
+ "maxMs": 15.88
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.47,
+ "maxMs": 18.47
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.724,
+ "maxMs": 1.724
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.41,
+ "backgroundMs": 0.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.682,
+ "p50Ms": 1.682,
+ "p95Ms": 1.682,
+ "maxMs": 1.682,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.72,
+ "avgMs": 1.724,
+ "p50Ms": 1.724,
+ "p95Ms": 1.724,
+ "maxMs": 1.724,
+ "mainThreadMs": 1.72,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.534,
+ "p50Ms": 0.534,
+ "p95Ms": 0.534,
+ "maxMs": 0.534,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931096,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 481.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.21,
+ "avgMs": 17.208,
+ "p95Ms": 17.208,
+ "maxMs": 17.208
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.61,
+ "maxMs": 16.61
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.334,
+ "maxMs": 1.334
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.64,
+ "backgroundMs": 0.57,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.3,
+ "avgMs": 1.302,
+ "p50Ms": 1.302,
+ "p95Ms": 1.302,
+ "maxMs": 1.302,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.33,
+ "avgMs": 1.334,
+ "p50Ms": 1.334,
+ "p95Ms": 1.334,
+ "maxMs": 1.334,
+ "mainThreadMs": 1.33,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.45,
+ "avgMs": 0.45,
+ "p50Ms": 0.45,
+ "p95Ms": 0.45,
+ "maxMs": 0.45,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.06,
+ "p50Ms": 0.06,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931400,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 484.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.81,
+ "avgMs": 17.812,
+ "p95Ms": 17.812,
+ "maxMs": 17.812
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.343,
+ "maxMs": 16.343
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.358,
+ "maxMs": 1.358
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.33,
+ "avgMs": 1.328,
+ "p50Ms": 1.328,
+ "p95Ms": 1.328,
+ "maxMs": 1.328,
+ "mainThreadMs": 1.33,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.36,
+ "avgMs": 1.358,
+ "p50Ms": 1.358,
+ "p95Ms": 1.358,
+ "maxMs": 1.358,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.337,
+ "p50Ms": 0.337,
+ "p95Ms": 0.337,
+ "maxMs": 0.337,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.34,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003186207999999996,
+ "allocatedBytes": 931264,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 485.14,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.33,
+ "avgMs": 17.328,
+ "p95Ms": 17.328,
+ "maxMs": 17.328
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.191,
+ "maxMs": 15.191
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.162,
+ "maxMs": 1.162
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.3,
+ "backgroundMs": 0.45,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.13,
+ "avgMs": 1.129,
+ "p50Ms": 1.129,
+ "p95Ms": 1.129,
+ "maxMs": 1.129,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.162,
+ "p50Ms": 1.162,
+ "p95Ms": 1.162,
+ "maxMs": 1.162,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.339,
+ "p50Ms": 0.339,
+ "p95Ms": 0.339,
+ "maxMs": 0.339,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.34,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931328,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 477.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.11,
+ "avgMs": 15.111,
+ "p95Ms": 15.111,
+ "maxMs": 15.111
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.67,
+ "maxMs": 14.67
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.403,
+ "maxMs": 1.403
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.37,
+ "avgMs": 1.366,
+ "p50Ms": 1.366,
+ "p95Ms": 1.366,
+ "maxMs": 1.366,
+ "mainThreadMs": 1.37,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.403,
+ "p50Ms": 1.403,
+ "p95Ms": 1.403,
+ "maxMs": 1.403,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.321,
+ "p50Ms": 0.321,
+ "p95Ms": 0.321,
+ "maxMs": 0.321,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931264,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 480.47,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.19,
+ "avgMs": 14.193,
+ "p95Ms": 14.193,
+ "maxMs": 14.193
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 19.027,
+ "maxMs": 19.027
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.06,
+ "maxMs": 1.06
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.06,
+ "backgroundMs": 0.56,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.99,
+ "p50Ms": 0.99,
+ "p95Ms": 0.99,
+ "maxMs": 0.99,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.06,
+ "avgMs": 1.06,
+ "p50Ms": 1.06,
+ "p95Ms": 1.06,
+ "maxMs": 1.06,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.348,
+ "p50Ms": 0.348,
+ "p95Ms": 0.348,
+ "maxMs": 0.348,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.35,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931328,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 481.68,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.81,
+ "avgMs": 18.81,
+ "p95Ms": 18.81,
+ "maxMs": 18.81
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.303,
+ "maxMs": 15.303
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.123,
+ "maxMs": 1.123
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.21,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.09,
+ "avgMs": 1.085,
+ "p50Ms": 1.085,
+ "p95Ms": 1.085,
+ "maxMs": 1.085,
+ "mainThreadMs": 1.09,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.12,
+ "avgMs": 1.123,
+ "p50Ms": 1.123,
+ "p95Ms": 1.123,
+ "maxMs": 1.123,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.397,
+ "p50Ms": 0.397,
+ "p95Ms": 0.397,
+ "maxMs": 0.397,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.4,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.06,
+ "p50Ms": 0.06,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0026310830000000063,
+ "allocatedBytes": 932472,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 483.21,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.22,
+ "avgMs": 15.225,
+ "p95Ms": 15.225,
+ "maxMs": 15.225
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 22.554,
+ "maxMs": 22.554
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 4.758,
+ "maxMs": 4.758
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 9.4,
+ "backgroundMs": 1.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 4.64,
+ "avgMs": 4.64,
+ "p50Ms": 4.64,
+ "p95Ms": 4.64,
+ "maxMs": 4.64,
+ "mainThreadMs": 4.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 4.76,
+ "avgMs": 4.758,
+ "p50Ms": 4.758,
+ "p95Ms": 4.758,
+ "maxMs": 4.758,
+ "mainThreadMs": 4.76,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.15,
+ "avgMs": 1.146,
+ "p50Ms": 1.146,
+ "p95Ms": 1.146,
+ "maxMs": 1.146,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.15,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 934456,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 482.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.81,
+ "avgMs": 18.815,
+ "p95Ms": 18.815,
+ "maxMs": 18.815
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.003,
+ "maxMs": 17.003
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 18.332,
+ "maxMs": 18.332
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 36.59,
+ "backgroundMs": 0.78,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 18.26,
+ "avgMs": 18.256,
+ "p50Ms": 18.256,
+ "p95Ms": 18.256,
+ "maxMs": 18.256,
+ "mainThreadMs": 18.26,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 18.33,
+ "avgMs": 18.332,
+ "p50Ms": 18.332,
+ "p95Ms": 18.332,
+ "maxMs": 18.332,
+ "mainThreadMs": 18.33,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.629,
+ "p50Ms": 0.629,
+ "p95Ms": 0.629,
+ "maxMs": 0.629,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.63,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.033,
+ "p50Ms": 0.033,
+ "p95Ms": 0.033,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 940480,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 480.94,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.03,
+ "avgMs": 14.034,
+ "p95Ms": 14.034,
+ "maxMs": 14.034
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.309,
+ "maxMs": 18.309
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.062,
+ "maxMs": 1.062
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.1,
+ "backgroundMs": 0.66,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.04,
+ "avgMs": 1.036,
+ "p50Ms": 1.036,
+ "p95Ms": 1.036,
+ "maxMs": 1.036,
+ "mainThreadMs": 1.04,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.06,
+ "avgMs": 1.062,
+ "p50Ms": 1.062,
+ "p95Ms": 1.062,
+ "maxMs": 1.062,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.54,
+ "avgMs": 0.543,
+ "p50Ms": 0.543,
+ "p95Ms": 0.543,
+ "maxMs": 0.543,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 932424,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 487.32,
+ "commits": {
+ "count": 1,
+ "totalMs": 23.07,
+ "avgMs": 23.074,
+ "p95Ms": 23.074,
+ "maxMs": 23.074
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.991,
+ "maxMs": 11.991
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.231,
+ "maxMs": 1.231
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0.62,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.2,
+ "avgMs": 1.204,
+ "p50Ms": 1.204,
+ "p95Ms": 1.204,
+ "maxMs": 1.204,
+ "mainThreadMs": 1.2,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.23,
+ "avgMs": 1.231,
+ "p50Ms": 1.231,
+ "p95Ms": 1.231,
+ "maxMs": 1.231,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.511,
+ "p50Ms": 0.511,
+ "p95Ms": 0.511,
+ "maxMs": 0.511,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 932440,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 491.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.02,
+ "avgMs": 12.023,
+ "p95Ms": 12.023,
+ "maxMs": 12.023
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.212,
+ "maxMs": 8.212
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.82,
+ "maxMs": 2.82
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 5.54,
+ "backgroundMs": 1.96,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.7,
+ "avgMs": 2.703,
+ "p50Ms": 2.703,
+ "p95Ms": 2.703,
+ "maxMs": 2.703,
+ "mainThreadMs": 2.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.82,
+ "avgMs": 2.82,
+ "p50Ms": 2.82,
+ "p95Ms": 2.82,
+ "maxMs": 2.82,
+ "mainThreadMs": 2.82,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.65,
+ "avgMs": 1.646,
+ "p50Ms": 1.646,
+ "p95Ms": 1.646,
+ "maxMs": 1.646,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.65,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.066,
+ "p50Ms": 0.066,
+ "p95Ms": 0.066,
+ "maxMs": 0.066,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.16,
+ "p50Ms": 0.16,
+ "p95Ms": 0.16,
+ "maxMs": 0.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.023658417000000015,
+ "allocatedBytes": 943512,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 482.99,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.32,
+ "avgMs": 16.321,
+ "p95Ms": 16.321,
+ "maxMs": 16.321
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.907,
+ "maxMs": 17.907
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.338,
+ "maxMs": 1.338
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.61,
+ "backgroundMs": 0.75,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.26,
+ "avgMs": 1.265,
+ "p50Ms": 1.265,
+ "p95Ms": 1.265,
+ "maxMs": 1.265,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.338,
+ "p50Ms": 1.338,
+ "p95Ms": 1.338,
+ "maxMs": 1.338,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.592,
+ "p50Ms": 0.592,
+ "p95Ms": 0.592,
+ "maxMs": 0.592,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943488,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 481.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.43,
+ "avgMs": 19.428,
+ "p95Ms": 19.428,
+ "maxMs": 19.428
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.634,
+ "maxMs": 13.634
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.118,
+ "maxMs": 2.118
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.15,
+ "backgroundMs": 1.03,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.03,
+ "avgMs": 2.028,
+ "p50Ms": 2.028,
+ "p95Ms": 2.028,
+ "maxMs": 2.028,
+ "mainThreadMs": 2.03,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.12,
+ "avgMs": 2.118,
+ "p50Ms": 2.118,
+ "p95Ms": 2.118,
+ "maxMs": 2.118,
+ "mainThreadMs": 2.12,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.917,
+ "p50Ms": 0.917,
+ "p95Ms": 0.917,
+ "maxMs": 0.917,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.92,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943448,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 481.64,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.72,
+ "avgMs": 16.721,
+ "p95Ms": 16.721,
+ "maxMs": 16.721
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.708,
+ "maxMs": 16.708
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.683,
+ "maxMs": 1.683
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.36,
+ "backgroundMs": 1.79,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.619,
+ "p50Ms": 1.619,
+ "p95Ms": 1.619,
+ "maxMs": 1.619,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.683,
+ "p50Ms": 1.683,
+ "p95Ms": 1.683,
+ "maxMs": 1.683,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.269,
+ "p50Ms": 1.269,
+ "p95Ms": 1.269,
+ "maxMs": 1.269,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.27,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.186,
+ "p50Ms": 0.186,
+ "p95Ms": 0.186,
+ "maxMs": 0.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002140916999999992,
+ "allocatedBytes": 943464,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 481.23,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.51,
+ "avgMs": 18.514,
+ "p95Ms": 18.514,
+ "maxMs": 18.514
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.647,
+ "maxMs": 15.647
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.233,
+ "maxMs": 2.233
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.4,
+ "backgroundMs": 0.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.16,
+ "avgMs": 2.162,
+ "p50Ms": 2.162,
+ "p95Ms": 2.162,
+ "maxMs": 2.162,
+ "mainThreadMs": 2.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.23,
+ "avgMs": 2.233,
+ "p50Ms": 2.233,
+ "p95Ms": 2.233,
+ "maxMs": 2.233,
+ "mainThreadMs": 2.23,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.548,
+ "p50Ms": 0.548,
+ "p95Ms": 0.548,
+ "maxMs": 0.548,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.55,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943464,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 483.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.44,
+ "avgMs": 13.445,
+ "p95Ms": 13.445,
+ "maxMs": 13.445
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.23,
+ "maxMs": 2.23
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.206,
+ "maxMs": 1.206
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 2.57,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.17,
+ "avgMs": 1.172,
+ "p50Ms": 1.172,
+ "p95Ms": 1.172,
+ "maxMs": 1.172,
+ "mainThreadMs": 1.17,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.206,
+ "p50Ms": 1.206,
+ "p95Ms": 1.206,
+ "maxMs": 1.206,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.409,
+ "p50Ms": 0.409,
+ "p95Ms": 0.409,
+ "maxMs": 0.409,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.179,
+ "p50Ms": 0.179,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 945480,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 479.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.03,
+ "avgMs": 19.025,
+ "p95Ms": 19.025,
+ "maxMs": 19.025
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.359,
+ "maxMs": 14.359
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.886,
+ "maxMs": 1.886
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 10,
+ "mainThreadMs": 3.91,
+ "backgroundMs": 0.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.8,
+ "avgMs": 1.798,
+ "p50Ms": 1.798,
+ "p95Ms": 1.798,
+ "maxMs": 1.798,
+ "mainThreadMs": 1.8,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.89,
+ "avgMs": 1.886,
+ "p50Ms": 1.886,
+ "p95Ms": 1.886,
+ "maxMs": 1.886,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.53,
+ "p50Ms": 0.53,
+ "p95Ms": 0.53,
+ "maxMs": 0.53,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "marker.visualProps": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.004,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.205,
+ "p50Ms": 0.205,
+ "p95Ms": 0.205,
+ "maxMs": 0.205,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 945264,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 481.94,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.15,
+ "avgMs": 19.152,
+ "p95Ms": 19.152,
+ "maxMs": 19.152
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.823,
+ "maxMs": 14.823
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.698,
+ "maxMs": 1.698
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.38,
+ "backgroundMs": 0.72,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.675,
+ "p50Ms": 1.675,
+ "p95Ms": 1.675,
+ "maxMs": 1.675,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.7,
+ "avgMs": 1.698,
+ "p50Ms": 1.698,
+ "p95Ms": 1.698,
+ "maxMs": 1.698,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.557,
+ "p50Ms": 0.557,
+ "p95Ms": 0.557,
+ "maxMs": 0.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943688,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 466.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.08,
+ "avgMs": 9.082,
+ "p95Ms": 9.082,
+ "maxMs": 9.082
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.778,
+ "maxMs": 3.778
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.293,
+ "maxMs": 1.293
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.57,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.271,
+ "p50Ms": 1.271,
+ "p95Ms": 1.271,
+ "maxMs": 1.271,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.293,
+ "p50Ms": 1.293,
+ "p95Ms": 1.293,
+ "maxMs": 1.293,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.374,
+ "p50Ms": 0.374,
+ "p95Ms": 0.374,
+ "maxMs": 0.374,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00432933399999999,
+ "allocatedBytes": 943824,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 481.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.4,
+ "avgMs": 17.397,
+ "p95Ms": 17.397,
+ "maxMs": 17.397
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.767,
+ "maxMs": 16.767
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.388,
+ "maxMs": 1.388
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 2.84,
+ "backgroundMs": 0.49,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.34,
+ "p50Ms": 1.34,
+ "p95Ms": 1.34,
+ "maxMs": 1.34,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.39,
+ "avgMs": 1.388,
+ "p50Ms": 1.388,
+ "p95Ms": 1.388,
+ "maxMs": 1.388,
+ "mainThreadMs": 1.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.358,
+ "p50Ms": 0.358,
+ "p95Ms": 0.358,
+ "maxMs": 0.358,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.087,
+ "p50Ms": 0.087,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 945200,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 482.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.85,
+ "avgMs": 14.845,
+ "p95Ms": 14.845,
+ "maxMs": 14.845
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.812,
+ "maxMs": 16.812
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.711,
+ "maxMs": 3.711
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 14,
+ "mainThreadMs": 7.5,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.64,
+ "avgMs": 3.642,
+ "p50Ms": 3.642,
+ "p95Ms": 3.642,
+ "maxMs": 3.642,
+ "mainThreadMs": 3.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.71,
+ "avgMs": 3.711,
+ "p50Ms": 3.711,
+ "p95Ms": 3.711,
+ "maxMs": 3.711,
+ "mainThreadMs": 3.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.397,
+ "p50Ms": 0.397,
+ "p95Ms": 0.397,
+ "maxMs": 0.397,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.4,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 6,
+ "totalMs": 0.03,
+ "avgMs": 0.004,
+ "p50Ms": 0.003,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.122,
+ "p50Ms": 0.122,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 6
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1059016,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 481.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.12,
+ "avgMs": 18.12,
+ "p95Ms": 18.12,
+ "maxMs": 18.12
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.11,
+ "maxMs": 13.11
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.156,
+ "maxMs": 1.156
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 2.72,
+ "backgroundMs": 0.61,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.11,
+ "avgMs": 1.114,
+ "p50Ms": 1.114,
+ "p95Ms": 1.114,
+ "maxMs": 1.114,
+ "mainThreadMs": 1.11,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.156,
+ "p50Ms": 1.156,
+ "p95Ms": 1.156,
+ "maxMs": 1.156,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.366,
+ "p50Ms": 0.366,
+ "p95Ms": 0.366,
+ "maxMs": 0.366,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.042,
+ "p50Ms": 0.042,
+ "p95Ms": 0.042,
+ "maxMs": 0.042,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 8,
+ "totalMs": 0.07,
+ "avgMs": 0.009,
+ "p50Ms": 0.003,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.377,
+ "p50Ms": 0.377,
+ "p95Ms": 0.377,
+ "maxMs": 0.377,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 8
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003258209000000012,
+ "allocatedBytes": 1055176,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 483.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.45,
+ "avgMs": 17.446,
+ "p95Ms": 17.446,
+ "maxMs": 17.446
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.094,
+ "maxMs": 16.094
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.364,
+ "maxMs": 2.364
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 4.85,
+ "backgroundMs": 0.58,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.31,
+ "avgMs": 2.306,
+ "p50Ms": 2.306,
+ "p95Ms": 2.306,
+ "maxMs": 2.306,
+ "mainThreadMs": 2.31,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.364,
+ "p50Ms": 2.364,
+ "p95Ms": 2.364,
+ "maxMs": 2.364,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.395,
+ "p50Ms": 0.395,
+ "p95Ms": 0.395,
+ "maxMs": 0.395,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.39,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 5,
+ "totalMs": 0.03,
+ "avgMs": 0.007,
+ "p50Ms": 0.003,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.145,
+ "p50Ms": 0.145,
+ "p95Ms": 0.145,
+ "maxMs": 0.145,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1054688,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 482.17,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.96,
+ "avgMs": 16.958,
+ "p95Ms": 16.958,
+ "maxMs": 16.958
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.141,
+ "maxMs": 13.141
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.852,
+ "maxMs": 1.852
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 3.88,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.82,
+ "avgMs": 1.822,
+ "p50Ms": 1.822,
+ "p95Ms": 1.822,
+ "maxMs": 1.822,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.85,
+ "avgMs": 1.852,
+ "p50Ms": 1.852,
+ "p95Ms": 1.852,
+ "maxMs": 1.852,
+ "mainThreadMs": 1.85,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.314,
+ "p50Ms": 0.314,
+ "p95Ms": 0.314,
+ "maxMs": 0.314,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.061,
+ "p50Ms": 0.061,
+ "p95Ms": 0.061,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 7,
+ "totalMs": 0.04,
+ "avgMs": 0.005,
+ "p50Ms": 0.003,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.166,
+ "p50Ms": 0.166,
+ "p95Ms": 0.166,
+ "maxMs": 0.166,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1054920,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 480.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.28,
+ "avgMs": 18.278,
+ "p95Ms": 18.278,
+ "maxMs": 18.278
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.201,
+ "maxMs": 12.201
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.987,
+ "maxMs": 3.987
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 8.7,
+ "backgroundMs": 2.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.93,
+ "avgMs": 3.93,
+ "p50Ms": 3.93,
+ "p95Ms": 3.93,
+ "maxMs": 3.93,
+ "mainThreadMs": 3.93,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.99,
+ "avgMs": 3.987,
+ "p50Ms": 3.987,
+ "p95Ms": 3.987,
+ "maxMs": 3.987,
+ "mainThreadMs": 3.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.64,
+ "avgMs": 1.636,
+ "p50Ms": 1.636,
+ "p95Ms": 1.636,
+ "maxMs": 1.636,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.64,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.148,
+ "p50Ms": 0.148,
+ "p95Ms": 0.148,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.119,
+ "p50Ms": 0.119,
+ "p95Ms": 0.119,
+ "maxMs": 0.119,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.297,
+ "p50Ms": 0.297,
+ "p95Ms": 0.297,
+ "maxMs": 0.297,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 7,
+ "totalMs": 0.3,
+ "avgMs": 0.043,
+ "p50Ms": 0.003,
+ "p95Ms": 0.256,
+ "maxMs": 0.256,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.481,
+ "p50Ms": 0.481,
+ "p95Ms": 0.481,
+ "maxMs": 0.481,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1054904,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 483.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.13,
+ "avgMs": 12.129,
+ "p95Ms": 12.129,
+ "maxMs": 12.129
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 5.346,
+ "maxMs": 5.346
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.287,
+ "maxMs": 1.287
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 71,
+ "mainThreadMs": 4.23,
+ "backgroundMs": 0.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.249,
+ "p50Ms": 1.249,
+ "p95Ms": 1.249,
+ "maxMs": 1.249,
+ "mainThreadMs": 1.25,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.287,
+ "p50Ms": 1.287,
+ "p95Ms": 1.287,
+ "maxMs": 1.287,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.551,
+ "p50Ms": 0.551,
+ "p95Ms": 0.551,
+ "maxMs": 0.551,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.55,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 63
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.06,
+ "p50Ms": 0.06,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 63,
+ "totalMs": 0.29,
+ "avgMs": 0.005,
+ "p50Ms": 0.002,
+ "p95Ms": 0.007,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.404,
+ "p50Ms": 1.404,
+ "p95Ms": 1.404,
+ "maxMs": 1.404,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004249499999999989,
+ "allocatedBytes": 2223096,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 497.75,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.1,
+ "avgMs": 12.101,
+ "p95Ms": 12.101,
+ "maxMs": 12.101
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.428,
+ "maxMs": 3.428
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.994,
+ "maxMs": 0.994
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 2.86,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.965,
+ "p50Ms": 0.965,
+ "p95Ms": 0.965,
+ "maxMs": 0.965,
+ "mainThreadMs": 0.97,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.994,
+ "p50Ms": 0.994,
+ "p95Ms": 0.994,
+ "maxMs": 0.994,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.386,
+ "p50Ms": 0.386,
+ "p95Ms": 0.386,
+ "maxMs": 0.386,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.39,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.2,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.052,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.703,
+ "p50Ms": 0.703,
+ "p95Ms": 0.703,
+ "maxMs": 0.703,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2207064,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 498.24,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.06,
+ "avgMs": 12.058,
+ "p95Ms": 12.058,
+ "maxMs": 12.058
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.1,
+ "maxMs": 14.1
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.296,
+ "maxMs": 1.296
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 3.04,
+ "backgroundMs": 0.41,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.215,
+ "p50Ms": 1.215,
+ "p95Ms": 1.215,
+ "maxMs": 1.215,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.3,
+ "avgMs": 1.296,
+ "p50Ms": 1.296,
+ "p95Ms": 1.296,
+ "maxMs": 1.296,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 83
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.14,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.388,
+ "p50Ms": 0.388,
+ "p95Ms": 0.388,
+ "maxMs": 0.388,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0054079579999999905,
+ "allocatedBytes": 2215744,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 497.95,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.95,
+ "avgMs": 14.95,
+ "p95Ms": 14.95,
+ "maxMs": 14.95
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.505,
+ "maxMs": 17.505
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.623,
+ "maxMs": 1.623
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 3.87,
+ "backgroundMs": 0.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.577,
+ "p50Ms": 1.577,
+ "p95Ms": 1.577,
+ "maxMs": 1.577,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.623,
+ "p50Ms": 1.623,
+ "p95Ms": 1.623,
+ "maxMs": 1.623,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.557,
+ "p50Ms": 0.557,
+ "p95Ms": 0.557,
+ "maxMs": 0.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 83
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.18,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.492,
+ "p50Ms": 0.492,
+ "p95Ms": 0.492,
+ "maxMs": 0.492,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.003950915999999999,
+ "allocatedBytes": 2207600,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 494.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.68,
+ "avgMs": 11.684,
+ "p95Ms": 11.684,
+ "maxMs": 11.684
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.15,
+ "maxMs": 18.15
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.909,
+ "maxMs": 0.909
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 71,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 0.48,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.876,
+ "p50Ms": 0.876,
+ "p95Ms": 0.876,
+ "maxMs": 0.876,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.91,
+ "avgMs": 0.909,
+ "p50Ms": 0.909,
+ "p95Ms": 0.909,
+ "maxMs": 0.909,
+ "mainThreadMs": 0.91,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.365,
+ "p50Ms": 0.365,
+ "p95Ms": 0.365,
+ "maxMs": 0.365,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 84
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 63
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 84
+ },
+ "marker.visualProps": {
+ "count": 63,
+ "totalMs": 0.19,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.532,
+ "p50Ms": 0.532,
+ "p95Ms": 0.532,
+ "maxMs": 0.532,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2207080,
+ "heapSizeAfterBytes": 50331648
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-1k-children.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-1k-children.json
new file mode 100644
index 0000000..83b47b3
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-1k-children.json
@@ -0,0 +1,7371 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-1k-children",
+ "name": "Marker update cost at 1k (children)",
+ "group": "mutations",
+ "tags": [
+ "baseline"
+ ],
+ "description": "With 1000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:29:14.106Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 19521,
+ "load": {
+ "commitMs": 5.67,
+ "readyMs": 812,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 1.91,
+ "backgroundMs": 4.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.49,
+ "avgMs": 0.243,
+ "p50Ms": 0,
+ "p95Ms": 0.487,
+ "maxMs": 0.487,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.72,
+ "avgMs": 0.72,
+ "p50Ms": 0.72,
+ "p95Ms": 0.72,
+ "maxMs": 0.72,
+ "mainThreadMs": 0.72,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 4.54,
+ "avgMs": 4.539,
+ "p50Ms": 4.539,
+ "p95Ms": 4.539,
+ "maxMs": 4.539,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.54,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.066,
+ "p50Ms": 0.02,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.004,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.009,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.19,
+ "avgMs": 0.093,
+ "p50Ms": 0.034,
+ "p95Ms": 0.151,
+ "maxMs": 0.151,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.16,
+ "avgMs": 0.039,
+ "p50Ms": 0.006,
+ "p95Ms": 0.134,
+ "maxMs": 0.134,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.274,
+ "p50Ms": 0.007,
+ "p95Ms": 0.542,
+ "maxMs": 0.542,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002217582999999995,
+ "allocatedBytes": 887352,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ "frames": {
+ "frames": 1120,
+ "durationMs": 18671.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1120,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 83.01,
+ "p50": 83.01,
+ "p95": 83.01,
+ "p99": 83.01,
+ "worst": 83.01
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0.4,
+ "inputHandling": 0,
+ "animation": 2.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1,
+ "swapBuffers": 96.2,
+ "gpu": 95.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 3.5,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.6,
+ "swapBuffers": 159.6,
+ "gpu": 158.9,
+ "total": 166
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 2070,
+ "p50": 0.15,
+ "p95": 0.37,
+ "p99": 1.6,
+ "max": 18.87
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 18.1,
+ "max": 41.59
+ },
+ "lateFrames": 1,
+ "busyMs": 439.7,
+ "busyRatio": 0.0235,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 18672.8,
+ "commits": {
+ "count": 40,
+ "totalMs": 195.32,
+ "avgMs": 4.883,
+ "p95Ms": 8.478,
+ "maxMs": 9.762
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 9.236,
+ "maxMs": 13.666
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 0.309,
+ "maxMs": 0.754
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 474,
+ "mainThreadMs": 25.86,
+ "backgroundMs": 16.45,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 41,
+ "totalMs": 10.63,
+ "avgMs": 0.259,
+ "p50Ms": 0.223,
+ "p95Ms": 0.615,
+ "maxMs": 0.692,
+ "mainThreadMs": 10.63,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "markers.set": {
+ "count": 41,
+ "totalMs": 12.51,
+ "avgMs": 0.305,
+ "p50Ms": 0.274,
+ "p95Ms": 0.695,
+ "maxMs": 0.754,
+ "mainThreadMs": 12.51,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "polylines.set": {
+ "count": 41,
+ "totalMs": 0.73,
+ "avgMs": 0.018,
+ "p50Ms": 0.014,
+ "p95Ms": 0.035,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 41,
+ "totalMs": 0.06,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.005,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 41,
+ "totalMs": 0.05,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 13.79,
+ "avgMs": 0.345,
+ "p50Ms": 0.297,
+ "p95Ms": 0.621,
+ "maxMs": 0.743,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.79,
+ "items": 40025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 0.7,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.034,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 40025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.23,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.011,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 360
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 0.3,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.01,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 162
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 1.43,
+ "avgMs": 0.036,
+ "p50Ms": 0.035,
+ "p95Ms": 0.054,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.43,
+ "items": 360
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 1.58,
+ "avgMs": 0.04,
+ "p50Ms": 0.004,
+ "p95Ms": 0.203,
+ "maxMs": 0.302,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 29
+ },
+ "marker.visualProps": {
+ "count": 29,
+ "totalMs": 0.3,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.034,
+ "maxMs": 0.064,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 309.6,
+ "afterLoadMB": 374.1,
+ "afterInteractionMB": 333.9,
+ "afterCleanupMB": 329.8,
+ "peakMB": 374.1,
+ "loadDeltaMB": 64.5,
+ "interactionDeltaMB": -40.2,
+ "retainedAfterCleanupMB": 20.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 309.6,
+ "residentMB": 456.6,
+ "javaHeapMB": 75.7,
+ "nativeHeapMB": 140.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 374.1,
+ "residentMB": 520.9,
+ "javaHeapMB": 78,
+ "nativeHeapMB": 202.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 333.9,
+ "residentMB": 480.5,
+ "javaHeapMB": 82.5,
+ "nativeHeapMB": 149.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 329.8,
+ "residentMB": 476.7,
+ "javaHeapMB": 82.6,
+ "nativeHeapMB": 144.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 30116984,
+ "gcCount": 7,
+ "gcTimeMs": 0.03067129199999999,
+ "heapSizeAfterMB": 56
+ },
+ "android": {
+ "javaBytesAllocated": 28604464,
+ "gcCount": 1,
+ "gcTimeMs": 93,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -56114560
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1272,
+ "wallMs": 18681,
+ "percent": 6.8,
+ "threadsBefore": 100,
+ "threadsAfter": 98,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 41,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 41025,
+ "coordinates": 41025,
+ "estimatedBytes": 2937158
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1005,
+ "coordinates": 1005,
+ "estimatedBytes": 71954
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 470.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.68,
+ "avgMs": 2.678,
+ "p95Ms": 2.678,
+ "maxMs": 2.678
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.863,
+ "maxMs": 0.863
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.217,
+ "maxMs": 0.217
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 0.69,
+ "backgroundMs": 0.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.32,
+ "avgMs": 0.161,
+ "p50Ms": 0.114,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 2001
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.35,
+ "avgMs": 0.177,
+ "p50Ms": 0.136,
+ "p95Ms": 0.217,
+ "maxMs": 0.217,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 2001
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.003,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.293,
+ "p50Ms": 0.293,
+ "p95Ms": 0.293,
+ "maxMs": 0.293,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.29,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718520,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 1
+ },
+ "wallMs": 465.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.97,
+ "avgMs": 7.968,
+ "p95Ms": 7.968,
+ "maxMs": 7.968
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 5.801,
+ "maxMs": 5.801
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.327,
+ "maxMs": 0.327
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.42,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.223,
+ "p50Ms": 0.223,
+ "p95Ms": 0.223,
+ "maxMs": 0.223,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.327,
+ "p50Ms": 0.327,
+ "p95Ms": 0.327,
+ "maxMs": 0.327,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.297,
+ "p50Ms": 0.297,
+ "p95Ms": 0.297,
+ "maxMs": 0.297,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.034,
+ "p50Ms": 0.034,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718008,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 2
+ },
+ "wallMs": 464.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.82,
+ "avgMs": 6.82,
+ "p95Ms": 6.82,
+ "maxMs": 6.82
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.644,
+ "maxMs": 7.644
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.261,
+ "maxMs": 0.261
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.217,
+ "p50Ms": 0.217,
+ "p95Ms": 0.217,
+ "maxMs": 0.217,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.261,
+ "p50Ms": 0.261,
+ "p95Ms": 0.261,
+ "maxMs": 0.261,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.346,
+ "p50Ms": 0.346,
+ "p95Ms": 0.346,
+ "maxMs": 0.346,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.35,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 719520,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 3
+ },
+ "wallMs": 465.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.67,
+ "avgMs": 5.668,
+ "p95Ms": 5.668,
+ "maxMs": 5.668
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.417,
+ "maxMs": 9.417
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.243,
+ "maxMs": 0.243
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0.53,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.199,
+ "p50Ms": 0.199,
+ "p95Ms": 0.199,
+ "maxMs": 0.199,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.243,
+ "p50Ms": 0.243,
+ "p95Ms": 0.243,
+ "maxMs": 0.243,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.439,
+ "p50Ms": 0.439,
+ "p95Ms": 0.439,
+ "maxMs": 0.439,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718256,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 4
+ },
+ "wallMs": 466.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.76,
+ "avgMs": 9.762,
+ "p95Ms": 9.762,
+ "maxMs": 9.762
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 4.681,
+ "maxMs": 4.681
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.242,
+ "maxMs": 0.242
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.198,
+ "p50Ms": 0.198,
+ "p95Ms": 0.198,
+ "maxMs": 0.198,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.242,
+ "p50Ms": 0.242,
+ "p95Ms": 0.242,
+ "maxMs": 0.242,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.235,
+ "p50Ms": 0.235,
+ "p95Ms": 0.235,
+ "maxMs": 0.235,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.034,
+ "p50Ms": 0.034,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005094541000000008,
+ "allocatedBytes": 720760,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1005,
+ "repeat": 0
+ },
+ "wallMs": 463.48,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.39,
+ "avgMs": 4.39,
+ "p95Ms": 4.39,
+ "maxMs": 4.39
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.116,
+ "maxMs": 10.116
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.374,
+ "maxMs": 0.374
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0.35,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.295,
+ "p50Ms": 0.295,
+ "p95Ms": 0.295,
+ "maxMs": 0.295,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.374,
+ "p50Ms": 0.374,
+ "p95Ms": 0.374,
+ "maxMs": 0.374,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.274,
+ "p50Ms": 0.274,
+ "p95Ms": 0.274,
+ "maxMs": 0.274,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 714696,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 1
+ },
+ "wallMs": 463.27,
+ "commits": {
+ "count": 1,
+ "totalMs": 4,
+ "avgMs": 3.998,
+ "p95Ms": 3.998,
+ "maxMs": 3.998
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.39,
+ "maxMs": 9.39
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.18,
+ "maxMs": 0.18
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0.32,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.144,
+ "p50Ms": 0.144,
+ "p95Ms": 0.144,
+ "maxMs": 0.144,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.18,
+ "p50Ms": 0.18,
+ "p95Ms": 0.18,
+ "maxMs": 0.18,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.25,
+ "p50Ms": 0.25,
+ "p95Ms": 0.25,
+ "maxMs": 0.25,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712768,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 2
+ },
+ "wallMs": 467.38,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.84,
+ "avgMs": 2.838,
+ "p95Ms": 2.838,
+ "maxMs": 2.838
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.223,
+ "maxMs": 13.223
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.266,
+ "maxMs": 0.266
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.225,
+ "p50Ms": 0.225,
+ "p95Ms": 0.225,
+ "maxMs": 0.225,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.266,
+ "p50Ms": 0.266,
+ "p95Ms": 0.266,
+ "maxMs": 0.266,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.415,
+ "p50Ms": 0.415,
+ "p95Ms": 0.415,
+ "maxMs": 0.415,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712136,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 3
+ },
+ "wallMs": 463.99,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.59,
+ "avgMs": 4.594,
+ "p95Ms": 4.594,
+ "maxMs": 4.594
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.943,
+ "maxMs": 9.943
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.274,
+ "maxMs": 0.274
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0.23,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.226,
+ "p50Ms": 0.226,
+ "p95Ms": 0.226,
+ "maxMs": 0.226,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.274,
+ "p50Ms": 0.274,
+ "p95Ms": 0.274,
+ "maxMs": 0.274,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.135,
+ "p50Ms": 0.135,
+ "p95Ms": 0.135,
+ "maxMs": 0.135,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711408,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 4
+ },
+ "wallMs": 465.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.81,
+ "avgMs": 2.815,
+ "p95Ms": 2.815,
+ "maxMs": 2.815
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.606,
+ "maxMs": 12.606
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.131,
+ "maxMs": 0.131
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.196,
+ "p50Ms": 0.196,
+ "p95Ms": 0.196,
+ "maxMs": 0.196,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 714528,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.12,
+ "avgMs": 6.12,
+ "p95Ms": 6.12,
+ "maxMs": 6.12
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.264,
+ "maxMs": 9.264
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.082,
+ "maxMs": 0.082
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0.28,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.244,
+ "p50Ms": 0.244,
+ "p95Ms": 0.244,
+ "maxMs": 0.244,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003888499999999989,
+ "allocatedBytes": 710616,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 462.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.44,
+ "avgMs": 4.444,
+ "p95Ms": 4.444,
+ "maxMs": 4.444
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.368,
+ "maxMs": 9.368
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.695,
+ "maxMs": 0.695
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0.32,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.615,
+ "p50Ms": 0.615,
+ "p95Ms": 0.615,
+ "maxMs": 0.615,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.695,
+ "p50Ms": 0.695,
+ "p95Ms": 0.695,
+ "maxMs": 0.695,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.227,
+ "p50Ms": 0.227,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712816,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 467.2,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.87,
+ "avgMs": 2.866,
+ "p95Ms": 2.866,
+ "maxMs": 2.866
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.368,
+ "maxMs": 13.368
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.336,
+ "maxMs": 0.336
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.67,
+ "backgroundMs": 0.33,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.311,
+ "p50Ms": 0.311,
+ "p95Ms": 0.311,
+ "maxMs": 0.311,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.336,
+ "p50Ms": 0.336,
+ "p95Ms": 0.336,
+ "maxMs": 0.336,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.267,
+ "p50Ms": 0.267,
+ "p95Ms": 0.267,
+ "maxMs": 0.267,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 710720,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.33,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.86,
+ "avgMs": 6.856,
+ "p95Ms": 6.856,
+ "maxMs": 6.856
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.307,
+ "maxMs": 9.307
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.493,
+ "maxMs": 0.493
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.94,
+ "backgroundMs": 0.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.43,
+ "avgMs": 0.429,
+ "p50Ms": 0.429,
+ "p95Ms": 0.429,
+ "maxMs": 0.429,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.493,
+ "p50Ms": 0.493,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.61,
+ "p50Ms": 0.61,
+ "p95Ms": 0.61,
+ "maxMs": 0.61,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.61,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 710784,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.91,
+ "avgMs": 3.911,
+ "p95Ms": 3.911,
+ "maxMs": 3.911
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.418,
+ "maxMs": 10.418
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.177,
+ "maxMs": 0.177
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0.53,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.145,
+ "p50Ms": 0.145,
+ "p95Ms": 0.145,
+ "maxMs": 0.145,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.177,
+ "p50Ms": 0.177,
+ "p95Ms": 0.177,
+ "maxMs": 0.177,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.476,
+ "p50Ms": 0.476,
+ "p95Ms": 0.476,
+ "maxMs": 0.476,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.48,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 710656,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.15,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.48,
+ "avgMs": 8.478,
+ "p95Ms": 8.478,
+ "maxMs": 8.478
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.387,
+ "maxMs": 6.387
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.19,
+ "maxMs": 0.19
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.19,
+ "p50Ms": 0.19,
+ "p95Ms": 0.19,
+ "maxMs": 0.19,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004374041999999995,
+ "allocatedBytes": 711704,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 463.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.3,
+ "avgMs": 5.304,
+ "p95Ms": 5.304,
+ "maxMs": 5.304
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.344,
+ "maxMs": 8.344
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.515,
+ "maxMs": 0.515
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.9,
+ "backgroundMs": 0.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.361,
+ "p50Ms": 0.361,
+ "p95Ms": 0.361,
+ "maxMs": 0.361,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.515,
+ "p50Ms": 0.515,
+ "p95Ms": 0.515,
+ "maxMs": 0.515,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.318,
+ "p50Ms": 0.318,
+ "p95Ms": 0.318,
+ "maxMs": 0.318,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711936,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 468.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.12,
+ "avgMs": 4.125,
+ "p95Ms": 4.125,
+ "maxMs": 4.125
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.556,
+ "maxMs": 11.556
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.359,
+ "maxMs": 0.359
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.69,
+ "backgroundMs": 0.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.359,
+ "p50Ms": 0.359,
+ "p95Ms": 0.359,
+ "maxMs": 0.359,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.313,
+ "p50Ms": 0.313,
+ "p95Ms": 0.313,
+ "maxMs": 0.313,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711864,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 462.98,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.95,
+ "avgMs": 4.954,
+ "p95Ms": 4.954,
+ "maxMs": 4.954
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.454,
+ "maxMs": 7.454
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.187,
+ "maxMs": 0.187
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0.2,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.165,
+ "p50Ms": 0.165,
+ "p95Ms": 0.165,
+ "maxMs": 0.165,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.187,
+ "p50Ms": 0.187,
+ "p95Ms": 0.187,
+ "maxMs": 0.187,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 719944,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.76,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.3,
+ "avgMs": 5.302,
+ "p95Ms": 5.302,
+ "maxMs": 5.302
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.725,
+ "maxMs": 9.725
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.171,
+ "maxMs": 0.171
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.151,
+ "p50Ms": 0.151,
+ "p95Ms": 0.151,
+ "maxMs": 0.151,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.171,
+ "p50Ms": 0.171,
+ "p95Ms": 0.171,
+ "maxMs": 0.171,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711656,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 468.69,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.96,
+ "avgMs": 1.964,
+ "p95Ms": 1.964,
+ "maxMs": 1.964
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.666,
+ "maxMs": 13.666
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.298,
+ "maxMs": 0.298
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.276,
+ "p50Ms": 0.276,
+ "p95Ms": 0.276,
+ "maxMs": 0.276,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.298,
+ "p50Ms": 0.298,
+ "p95Ms": 0.298,
+ "maxMs": 0.298,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.223,
+ "p50Ms": 0.223,
+ "p95Ms": 0.223,
+ "maxMs": 0.223,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.16,
+ "p50Ms": 0.16,
+ "p95Ms": 0.16,
+ "maxMs": 0.16,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723800,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 463.1,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.94,
+ "avgMs": 8.943,
+ "p95Ms": 8.943,
+ "maxMs": 8.943
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.274,
+ "maxMs": 3.274
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.275,
+ "maxMs": 0.275
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.19,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.248,
+ "p50Ms": 0.248,
+ "p95Ms": 0.248,
+ "maxMs": 0.248,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.275,
+ "p50Ms": 0.275,
+ "p95Ms": 0.275,
+ "maxMs": 0.275,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.154,
+ "p50Ms": 0.154,
+ "p95Ms": 0.154,
+ "maxMs": 0.154,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005491250000000003,
+ "allocatedBytes": 723664,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.57,
+ "avgMs": 3.57,
+ "p95Ms": 3.57,
+ "maxMs": 3.57
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.314,
+ "maxMs": 11.314
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.3,
+ "maxMs": 0.3
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.245,
+ "p50Ms": 0.245,
+ "p95Ms": 0.245,
+ "maxMs": 0.245,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.3,
+ "p50Ms": 0.3,
+ "p95Ms": 0.3,
+ "maxMs": 0.3,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.133,
+ "p50Ms": 0.133,
+ "p95Ms": 0.133,
+ "maxMs": 0.133,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 728240,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.07,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.02,
+ "avgMs": 5.023,
+ "p95Ms": 5.023,
+ "maxMs": 5.023
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.125,
+ "maxMs": 9.125
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.277,
+ "maxMs": 0.277
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.234,
+ "p50Ms": 0.234,
+ "p95Ms": 0.234,
+ "maxMs": 0.234,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.277,
+ "p50Ms": 0.277,
+ "p95Ms": 0.277,
+ "maxMs": 0.277,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.46,
+ "avgMs": 0.458,
+ "p50Ms": 0.458,
+ "p95Ms": 0.458,
+ "maxMs": 0.458,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 724136,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.69,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.5,
+ "avgMs": 4.496,
+ "p95Ms": 4.496,
+ "maxMs": 4.496
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.697,
+ "maxMs": 9.697
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.306,
+ "maxMs": 0.306
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0.18,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.215,
+ "p50Ms": 0.215,
+ "p95Ms": 0.215,
+ "maxMs": 0.215,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.306,
+ "p50Ms": 0.306,
+ "p95Ms": 0.306,
+ "maxMs": 0.306,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.122,
+ "p50Ms": 0.122,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723824,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 464.17,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.03,
+ "avgMs": 5.029,
+ "p95Ms": 5.029,
+ "maxMs": 5.029
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.336,
+ "maxMs": 10.336
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.642,
+ "maxMs": 0.642
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.577,
+ "p50Ms": 0.577,
+ "p95Ms": 0.577,
+ "maxMs": 0.577,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p50Ms": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.621,
+ "p50Ms": 0.621,
+ "p95Ms": 0.621,
+ "maxMs": 0.621,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711968,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.65,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.34,
+ "avgMs": 3.341,
+ "p95Ms": 3.341,
+ "maxMs": 3.341
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.968,
+ "maxMs": 11.968
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.195,
+ "maxMs": 0.195
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0.54,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.161,
+ "p50Ms": 0.161,
+ "p95Ms": 0.161,
+ "maxMs": 0.161,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.195,
+ "p50Ms": 0.195,
+ "p95Ms": 0.195,
+ "maxMs": 0.195,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.486,
+ "p50Ms": 0.486,
+ "p95Ms": 0.486,
+ "maxMs": 0.486,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712240,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.79,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.52,
+ "avgMs": 7.524,
+ "p95Ms": 7.524,
+ "maxMs": 7.524
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.01,
+ "maxMs": 8.01
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.401,
+ "maxMs": 0.401
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.78,
+ "backgroundMs": 0.54,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.355,
+ "p50Ms": 0.355,
+ "p95Ms": 0.355,
+ "maxMs": 0.355,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.401,
+ "p50Ms": 0.401,
+ "p95Ms": 0.401,
+ "maxMs": 0.401,
+ "mainThreadMs": 0.4,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.488,
+ "p50Ms": 0.488,
+ "p95Ms": 0.488,
+ "maxMs": 0.488,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003923584000000008,
+ "allocatedBytes": 712288,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.57,
+ "avgMs": 4.571,
+ "p95Ms": 4.571,
+ "maxMs": 4.571
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.17,
+ "maxMs": 11.17
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.732,
+ "maxMs": 0.732
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.44,
+ "backgroundMs": 0.33,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.69,
+ "avgMs": 0.692,
+ "p50Ms": 0.692,
+ "p95Ms": 0.692,
+ "maxMs": 0.692,
+ "mainThreadMs": 0.69,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.73,
+ "avgMs": 0.732,
+ "p50Ms": 0.732,
+ "p95Ms": 0.732,
+ "maxMs": 0.732,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.243,
+ "p50Ms": 0.243,
+ "p95Ms": 0.243,
+ "maxMs": 0.243,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712208,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.15,
+ "avgMs": 5.155,
+ "p95Ms": 5.155,
+ "maxMs": 5.155
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.135,
+ "maxMs": 10.135
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.227,
+ "maxMs": 0.227
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.44,
+ "backgroundMs": 0.55,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.193,
+ "p50Ms": 0.193,
+ "p95Ms": 0.193,
+ "maxMs": 0.193,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.227,
+ "p50Ms": 0.227,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.5,
+ "avgMs": 0.495,
+ "p50Ms": 0.495,
+ "p95Ms": 0.495,
+ "maxMs": 0.495,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.5,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712128,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 464.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.32,
+ "avgMs": 4.315,
+ "p95Ms": 4.315,
+ "maxMs": 4.315
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.047,
+ "maxMs": 10.047
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.376,
+ "maxMs": 0.376
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.33,
+ "p50Ms": 0.33,
+ "p95Ms": 0.33,
+ "maxMs": 0.33,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.376,
+ "p50Ms": 0.376,
+ "p95Ms": 0.376,
+ "maxMs": 0.376,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.15,
+ "p50Ms": 0.15,
+ "p95Ms": 0.15,
+ "maxMs": 0.15,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.048,
+ "p50Ms": 0.048,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.175,
+ "p50Ms": 0.175,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 724136,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.98,
+ "avgMs": 4.98,
+ "p95Ms": 4.98,
+ "maxMs": 4.98
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.104,
+ "maxMs": 12.104
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.162,
+ "maxMs": 0.162
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0.61,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.118,
+ "p50Ms": 0.118,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.162,
+ "p50Ms": 0.162,
+ "p95Ms": 0.162,
+ "maxMs": 0.162,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.534,
+ "p50Ms": 0.534,
+ "p95Ms": 0.534,
+ "maxMs": 0.534,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723184,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.74,
+ "avgMs": 7.737,
+ "p95Ms": 7.737,
+ "maxMs": 7.737
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.411,
+ "maxMs": 7.411
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.164,
+ "maxMs": 0.164
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.143,
+ "p50Ms": 0.143,
+ "p95Ms": 0.143,
+ "maxMs": 0.143,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.47,
+ "avgMs": 0.467,
+ "p50Ms": 0.467,
+ "p95Ms": 0.467,
+ "maxMs": 0.467,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.048,
+ "p50Ms": 0.048,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004186791999999995,
+ "allocatedBytes": 724176,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.27,
+ "avgMs": 5.268,
+ "p95Ms": 5.268,
+ "maxMs": 5.268
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.274,
+ "maxMs": 9.274
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.754,
+ "maxMs": 0.754
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.47,
+ "backgroundMs": 0.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.653,
+ "p50Ms": 0.653,
+ "p95Ms": 0.653,
+ "maxMs": 0.653,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.75,
+ "avgMs": 0.754,
+ "p50Ms": 0.754,
+ "p95Ms": 0.754,
+ "maxMs": 0.754,
+ "mainThreadMs": 0.75,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.6,
+ "avgMs": 0.599,
+ "p50Ms": 0.599,
+ "p95Ms": 0.599,
+ "maxMs": 0.599,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.6,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.059,
+ "p50Ms": 0.059,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723128,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 463.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.06,
+ "avgMs": 4.059,
+ "p95Ms": 4.059,
+ "maxMs": 4.059
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.774,
+ "maxMs": 9.774
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.248,
+ "maxMs": 0.248
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.81,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.213,
+ "p50Ms": 0.213,
+ "p95Ms": 0.213,
+ "maxMs": 0.213,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.248,
+ "p50Ms": 0.248,
+ "p95Ms": 0.248,
+ "maxMs": 0.248,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.74,
+ "avgMs": 0.743,
+ "p50Ms": 0.743,
+ "p95Ms": 0.743,
+ "maxMs": 0.743,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.74,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 722968,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.63,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.15,
+ "avgMs": 2.145,
+ "p95Ms": 2.145,
+ "maxMs": 2.145
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.085,
+ "maxMs": 11.085
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.131,
+ "maxMs": 0.131
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0.4,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.363,
+ "p50Ms": 0.363,
+ "p95Ms": 0.363,
+ "maxMs": 0.363,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.07,
+ "avgMs": 0.017,
+ "p50Ms": 0.002,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.203,
+ "p50Ms": 0.203,
+ "p95Ms": 0.203,
+ "maxMs": 0.203,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 832888,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 463.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.49,
+ "avgMs": 3.488,
+ "p95Ms": 3.488,
+ "maxMs": 3.488
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.995,
+ "maxMs": 6.995
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.281,
+ "maxMs": 0.281
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.261,
+ "p50Ms": 0.261,
+ "p95Ms": 0.261,
+ "maxMs": 0.261,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.281,
+ "p50Ms": 0.281,
+ "p95Ms": 0.281,
+ "maxMs": 0.281,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.412,
+ "p50Ms": 0.412,
+ "p95Ms": 0.412,
+ "maxMs": 0.412,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.02,
+ "avgMs": 0.005,
+ "p50Ms": 0.002,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.068,
+ "p50Ms": 0.068,
+ "p95Ms": 0.068,
+ "maxMs": 0.068,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 849232,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 464.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.22,
+ "avgMs": 4.221,
+ "p95Ms": 4.221,
+ "maxMs": 4.221
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.827,
+ "maxMs": 8.827
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.309,
+ "maxMs": 0.309
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0.25,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.309,
+ "p50Ms": 0.309,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.176,
+ "p50Ms": 0.176,
+ "p95Ms": 0.176,
+ "maxMs": 0.176,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.02,
+ "avgMs": 0.005,
+ "p50Ms": 0.002,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 832856,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.27,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.73,
+ "avgMs": 1.73,
+ "p95Ms": 1.73,
+ "maxMs": 1.73
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.006,
+ "maxMs": 7.006
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.315,
+ "maxMs": 0.315
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 0.86,
+ "backgroundMs": 0.4,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.293,
+ "p50Ms": 0.293,
+ "p95Ms": 0.293,
+ "maxMs": 0.293,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.315,
+ "p50Ms": 0.315,
+ "p95Ms": 0.315,
+ "maxMs": 0.315,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.363,
+ "p50Ms": 0.363,
+ "p95Ms": 0.363,
+ "maxMs": 0.363,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 5,
+ "totalMs": 0.04,
+ "avgMs": 0.007,
+ "p50Ms": 0.002,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.209,
+ "p50Ms": 0.209,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0037125829999999915,
+ "allocatedBytes": 833424,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 464.22,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.87,
+ "avgMs": 3.868,
+ "p95Ms": 3.868,
+ "maxMs": 3.868
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.325,
+ "maxMs": 9.325
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.259,
+ "maxMs": 0.259
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0.83,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.174,
+ "p50Ms": 0.174,
+ "p95Ms": 0.174,
+ "maxMs": 0.174,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.259,
+ "p50Ms": 0.259,
+ "p95Ms": 0.259,
+ "maxMs": 0.259,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.72,
+ "avgMs": 0.723,
+ "p50Ms": 0.723,
+ "p95Ms": 0.723,
+ "maxMs": 0.723,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.72,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 5,
+ "totalMs": 0.05,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.302,
+ "p50Ms": 0.302,
+ "p95Ms": 0.302,
+ "maxMs": 0.302,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 833304,
+ "heapSizeAfterBytes": 58720256
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-continuous-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-continuous-10k.json
new file mode 100644
index 0000000..ae233b9
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-continuous-10k.json
@@ -0,0 +1,685 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-continuous-10k",
+ "name": "Continuous updates: 100 of 10k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:29:33.958Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6638,
+ "load": {
+ "commitMs": 14.33,
+ "readyMs": 762,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.98,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.93,
+ "avgMs": 0.463,
+ "p50Ms": 0,
+ "p95Ms": 0.926,
+ "maxMs": 0.926,
+ "mainThreadMs": 0.93,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.074,
+ "p50Ms": 0.074,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.21,
+ "p50Ms": 0.21,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.016,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.022,
+ "p50Ms": 0.017,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.064,
+ "p50Ms": 0.049,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.63,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.015,
+ "maxMs": 0.13,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.35,
+ "avgMs": 0.675,
+ "p50Ms": 0.003,
+ "p95Ms": 1.347,
+ "maxMs": 1.347,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0023047499999999943,
+ "allocatedBytes": 2720408,
+ "heapSizeAfterBytes": 62914560
+ }
+ },
+ "frames": {
+ "frames": 347,
+ "durationMs": 5787.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 347,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.29,
+ "p50": 17.29,
+ "p95": 17.29,
+ "p99": 17.29,
+ "worst": 17.29
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.1,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.3,
+ "commandIssue": 6.6,
+ "swapBuffers": 45.4,
+ "gpu": 85.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 2.3,
+ "swapBuffers": 15.7,
+ "gpu": 29.7,
+ "total": 34.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 651,
+ "p50": 0.09,
+ "p95": 8.04,
+ "p99": 13.27,
+ "max": 14.62
+ },
+ "frameGapMs": {
+ "p50": 16.71,
+ "p95": 19.79,
+ "max": 33.92
+ },
+ "lateFrames": 2,
+ "busyMs": 571.9,
+ "busyRatio": 0.0988,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5788.7,
+ "commits": {
+ "count": 50,
+ "totalMs": 615.49,
+ "avgMs": 12.31,
+ "p95Ms": 15.637,
+ "maxMs": 16.551
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 7.069,
+ "maxMs": 19.773
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.913,
+ "maxMs": 1.262
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 89.97,
+ "backgroundMs": 20.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 44.13,
+ "avgMs": 0.883,
+ "p50Ms": 0.875,
+ "p95Ms": 1.149,
+ "maxMs": 1.235,
+ "mainThreadMs": 44.13,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 45.65,
+ "avgMs": 0.913,
+ "p50Ms": 0.907,
+ "p95Ms": 1.185,
+ "maxMs": 1.262,
+ "mainThreadMs": 45.65,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 16.13,
+ "avgMs": 0.323,
+ "p50Ms": 0.275,
+ "p95Ms": 0.54,
+ "maxMs": 1.195,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.13,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.7,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.018,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.62,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.02,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.93,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.031,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 3200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.32,
+ "avgMs": 0.046,
+ "p50Ms": 0.044,
+ "p95Ms": 0.069,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.32,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.19,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 329.3,
+ "afterLoadMB": 396.3,
+ "afterInteractionMB": 327.8,
+ "afterCleanupMB": 323.8,
+ "peakMB": 396.3,
+ "loadDeltaMB": 67,
+ "interactionDeltaMB": -68.5,
+ "retainedAfterCleanupMB": -5.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 329.3,
+ "residentMB": 476.2,
+ "javaHeapMB": 76,
+ "nativeHeapMB": 149.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 396.3,
+ "residentMB": 543,
+ "javaHeapMB": 81.4,
+ "nativeHeapMB": 211.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 327.8,
+ "residentMB": 474.6,
+ "javaHeapMB": 65.3,
+ "nativeHeapMB": 154.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 323.8,
+ "residentMB": 470.7,
+ "javaHeapMB": 65.6,
+ "nativeHeapMB": 149.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 46610720,
+ "gcCount": 12,
+ "gcTimeMs": 0.018941790999999958,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 169746528,
+ "gcCount": 7,
+ "gcTimeMs": 366,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -60237520
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1347,
+ "wallMs": 5794,
+ "percent": 23.2,
+ "threadsBefore": 102,
+ "threadsAfter": 102,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 510000,
+ "coordinates": 510000,
+ "estimatedBytes": 36525893
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717815
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5784.9,
+ "commits": {
+ "count": 50,
+ "totalMs": 615.49,
+ "avgMs": 12.31,
+ "p95Ms": 15.637,
+ "maxMs": 16.551
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 7.069,
+ "maxMs": 19.773
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.913,
+ "maxMs": 1.262
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 89.97,
+ "backgroundMs": 20.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 44.13,
+ "avgMs": 0.883,
+ "p50Ms": 0.875,
+ "p95Ms": 1.149,
+ "maxMs": 1.235,
+ "mainThreadMs": 44.13,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 45.65,
+ "avgMs": 0.913,
+ "p50Ms": 0.907,
+ "p95Ms": 1.185,
+ "maxMs": 1.262,
+ "mainThreadMs": 45.65,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 16.13,
+ "avgMs": 0.323,
+ "p50Ms": 0.275,
+ "p95Ms": 0.54,
+ "maxMs": 1.195,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.13,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.7,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.018,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.62,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.02,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.93,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.031,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 3200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.32,
+ "avgMs": 0.046,
+ "p50Ms": 0.044,
+ "p95Ms": 0.069,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.32,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.19,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 12,
+ "gcTimeMs": 0.018941790999999958,
+ "allocatedBytes": 46422728,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-continuous-1k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-continuous-1k.json
new file mode 100644
index 0000000..0b9f183
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/mutations-continuous-1k.json
@@ -0,0 +1,707 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-continuous-1k",
+ "name": "Continuous updates: 100 of 1k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:29:24.063Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6688,
+ "load": {
+ "commitMs": 1.58,
+ "readyMs": 807,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 2.06,
+ "backgroundMs": 10.09,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.59,
+ "avgMs": 0.294,
+ "p50Ms": 0,
+ "p95Ms": 0.587,
+ "maxMs": 0.587,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.172,
+ "p50Ms": 0.172,
+ "p95Ms": 0.172,
+ "maxMs": 0.172,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 9.76,
+ "avgMs": 9.76,
+ "p50Ms": 9.76,
+ "p95Ms": 9.76,
+ "maxMs": 9.76,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.76,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.14,
+ "avgMs": 0.069,
+ "p50Ms": 0.04,
+ "p95Ms": 0.098,
+ "maxMs": 0.098,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.004,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.006,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.17,
+ "avgMs": 0.086,
+ "p50Ms": 0.052,
+ "p95Ms": 0.12,
+ "maxMs": 0.12,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.36,
+ "avgMs": 0.091,
+ "p50Ms": 0.005,
+ "p95Ms": 0.347,
+ "maxMs": 0.347,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.94,
+ "avgMs": 0.468,
+ "p50Ms": 0.004,
+ "p95Ms": 0.932,
+ "maxMs": 0.932,
+ "mainThreadMs": 0.94,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 316544,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ "frames": {
+ "frames": 349,
+ "durationMs": 5833.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 349,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 45.2,
+ "p50": 45.2,
+ "p95": 45.2,
+ "p99": 45.2,
+ "worst": 45.2
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 94.1,
+ "gpu": 93.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 2.8,
+ "layoutMeasure": 0.1,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 1.3,
+ "swapBuffers": 85,
+ "gpu": 84.8,
+ "total": 90.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 665,
+ "p50": 0.1,
+ "p95": 0.39,
+ "p99": 2.44,
+ "max": 10.71
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 18.07,
+ "max": 27.24
+ },
+ "lateFrames": 1,
+ "busyMs": 141.3,
+ "busyRatio": 0.0242,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5834.5,
+ "commits": {
+ "count": 50,
+ "totalMs": 128.97,
+ "avgMs": 2.579,
+ "p95Ms": 4.509,
+ "maxMs": 11.525
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 13.749,
+ "maxMs": 15.919
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.294,
+ "maxMs": 0.779
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 450,
+ "mainThreadMs": 31.72,
+ "backgroundMs": 19.77,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 12.58,
+ "avgMs": 0.252,
+ "p50Ms": 0.205,
+ "p95Ms": 0.516,
+ "maxMs": 0.723,
+ "mainThreadMs": 12.58,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 14.71,
+ "avgMs": 0.294,
+ "p50Ms": 0.244,
+ "p95Ms": 0.57,
+ "maxMs": 0.779,
+ "mainThreadMs": 14.71,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 15.9,
+ "avgMs": 0.318,
+ "p50Ms": 0.243,
+ "p95Ms": 0.717,
+ "maxMs": 0.95,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.9,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.96,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.037,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.38,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.019,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 450
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.49,
+ "avgMs": 0.01,
+ "p50Ms": 0.009,
+ "p95Ms": 0.019,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.04,
+ "p95Ms": 0.067,
+ "maxMs": 0.073,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.04,
+ "items": 450
+ },
+ "marker.visualProps": {
+ "count": 50,
+ "totalMs": 0.83,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.026,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 3.59,
+ "avgMs": 0.072,
+ "p50Ms": 0.063,
+ "p95Ms": 0.122,
+ "maxMs": 0.245,
+ "mainThreadMs": 3.59,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 329,
+ "afterLoadMB": 317.3,
+ "afterInteractionMB": 333.2,
+ "afterCleanupMB": 329.2,
+ "peakMB": 333.2,
+ "loadDeltaMB": -11.7,
+ "interactionDeltaMB": 15.9,
+ "retainedAfterCleanupMB": 0.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 329,
+ "residentMB": 475.8,
+ "javaHeapMB": 82.8,
+ "nativeHeapMB": 144.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 317.3,
+ "residentMB": 464.2,
+ "javaHeapMB": 63.3,
+ "nativeHeapMB": 152,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 333.2,
+ "residentMB": 480,
+ "javaHeapMB": 75.8,
+ "nativeHeapMB": 154.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 329.2,
+ "residentMB": 476.1,
+ "javaHeapMB": 75.9,
+ "nativeHeapMB": 149.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 7025624,
+ "gcCount": 2,
+ "gcTimeMs": 0.01725233300000001,
+ "heapSizeAfterMB": 60
+ },
+ "android": {
+ "javaBytesAllocated": 38838912,
+ "gcCount": 1,
+ "gcTimeMs": 94,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 2132560
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 721,
+ "wallMs": 5838,
+ "percent": 12.4,
+ "threadsBefore": 101,
+ "threadsAfter": 100,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 51000,
+ "coordinates": 51000,
+ "estimatedBytes": 3653136
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5828.9,
+ "commits": {
+ "count": 50,
+ "totalMs": 128.97,
+ "avgMs": 2.579,
+ "p95Ms": 4.509,
+ "maxMs": 11.525
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 13.749,
+ "maxMs": 15.919
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.294,
+ "maxMs": 0.779
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 450,
+ "mainThreadMs": 31.72,
+ "backgroundMs": 19.77,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 12.58,
+ "avgMs": 0.252,
+ "p50Ms": 0.205,
+ "p95Ms": 0.516,
+ "maxMs": 0.723,
+ "mainThreadMs": 12.58,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 14.71,
+ "avgMs": 0.294,
+ "p50Ms": 0.244,
+ "p95Ms": 0.57,
+ "maxMs": 0.779,
+ "mainThreadMs": 14.71,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 15.9,
+ "avgMs": 0.318,
+ "p50Ms": 0.243,
+ "p95Ms": 0.717,
+ "maxMs": 0.95,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.9,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.96,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.037,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.38,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.019,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 450
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.49,
+ "avgMs": 0.01,
+ "p50Ms": 0.009,
+ "p95Ms": 0.019,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.04,
+ "p95Ms": 0.067,
+ "maxMs": 0.073,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.04,
+ "items": 450
+ },
+ "marker.visualProps": {
+ "count": 50,
+ "totalMs": 0.83,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.026,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 3.59,
+ "avgMs": 0.072,
+ "p50Ms": 0.063,
+ "p95Ms": 0.122,
+ "maxMs": 0.245,
+ "mainThreadMs": 3.59,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.01725233300000001,
+ "allocatedBytes": 6838368,
+ "heapSizeAfterBytes": 62914560
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-100.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-100.json
new file mode 100644
index 0000000..fef41c4
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-100.json
@@ -0,0 +1,687 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygon-100",
+ "name": "Polygon, 100 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:16.986Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4977,
+ "load": {
+ "commitMs": 0.84,
+ "readyMs": 765,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 56048,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ "frames": {
+ "frames": 246,
+ "durationMs": 4114.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 246,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 9.81,
+ "p50": 9.81,
+ "p95": 9.81,
+ "p99": 9.81,
+ "worst": 9.81
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.3,
+ "inputHandling": 0,
+ "animation": 5.8,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.3,
+ "commandIssue": 7.9,
+ "swapBuffers": 80.3,
+ "gpu": 79.6
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.5,
+ "swapBuffers": 15.8,
+ "gpu": 15.6,
+ "total": 19.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 480,
+ "p50": 0.08,
+ "p95": 0.32,
+ "p99": 0.88,
+ "max": 2.8
+ },
+ "frameGapMs": {
+ "p50": 16.64,
+ "p95": 17.75,
+ "max": 22.43
+ },
+ "lateFrames": 0,
+ "busyMs": 61.7,
+ "busyRatio": 0.015,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4115.9,
+ "commits": {
+ "count": 5,
+ "totalMs": 3.66,
+ "avgMs": 0.731,
+ "p95Ms": 1.029,
+ "maxMs": 1.029
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 13.344,
+ "maxMs": 14.973
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 0.657,
+ "maxMs": 1.023
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 3.9,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 3.28,
+ "avgMs": 0.657,
+ "p50Ms": 0.833,
+ "p95Ms": 1.023,
+ "maxMs": 1.023,
+ "mainThreadMs": 3.28,
+ "backgroundMs": 0,
+ "items": 500
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.62,
+ "avgMs": 0.154,
+ "p50Ms": 0.099,
+ "p95Ms": 0.254,
+ "maxMs": 0.254,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 417.9,
+ "afterLoadMB": 365.7,
+ "afterInteractionMB": 414.8,
+ "afterCleanupMB": 410.8,
+ "peakMB": 417.9,
+ "loadDeltaMB": -52.2,
+ "interactionDeltaMB": 49.1,
+ "retainedAfterCleanupMB": -7.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 417.9,
+ "residentMB": 565.1,
+ "javaHeapMB": 90.1,
+ "nativeHeapMB": 210.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 365.7,
+ "residentMB": 513.3,
+ "javaHeapMB": 77.5,
+ "nativeHeapMB": 171,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 414.8,
+ "residentMB": 562.1,
+ "javaHeapMB": 82.4,
+ "nativeHeapMB": 216.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 410.8,
+ "residentMB": 558.2,
+ "javaHeapMB": 82.5,
+ "nativeHeapMB": 211.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 394856,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 72
+ },
+ "android": {
+ "javaBytesAllocated": 5185472,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 47697680
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 462,
+ "wallMs": 4119,
+ "percent": 11.2,
+ "threadsBefore": 111,
+ "threadsAfter": 110,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 600,
+ "estimatedBytes": 27462
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4577
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 312.59,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.264,
+ "p95Ms": 0.264,
+ "maxMs": 0.264
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.844,
+ "maxMs": 11.844
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.251,
+ "maxMs": 0.251
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.251,
+ "p50Ms": 0.251,
+ "p95Ms": 0.251,
+ "maxMs": 0.251,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37888,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 317.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.029,
+ "p95Ms": 1.029,
+ "maxMs": 1.029
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.973,
+ "maxMs": 14.973
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.833,
+ "maxMs": 0.833
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.83,
+ "avgMs": 0.833,
+ "p50Ms": 0.833,
+ "p95Ms": 0.833,
+ "maxMs": 0.833,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37240,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 316.12,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.816,
+ "p95Ms": 0.816,
+ "maxMs": 0.816
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.756,
+ "maxMs": 12.756
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.86,
+ "maxMs": 0.86
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.86,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.86,
+ "avgMs": 0.86,
+ "p50Ms": 0.86,
+ "p95Ms": 0.86,
+ "maxMs": 0.86,
+ "mainThreadMs": 0.86,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36512,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 313.09,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.76,
+ "p95Ms": 0.76,
+ "maxMs": 0.76
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.282,
+ "maxMs": 12.282
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.316,
+ "maxMs": 0.316
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37384,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 316.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.79,
+ "avgMs": 0.789,
+ "p95Ms": 0.789,
+ "maxMs": 0.789
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.864,
+ "maxMs": 14.864
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.023,
+ "maxMs": 1.023
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.02,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.02,
+ "avgMs": 1.023,
+ "p50Ms": 1.023,
+ "p95Ms": 1.023,
+ "maxMs": 1.023,
+ "mainThreadMs": 1.02,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36312,
+ "heapSizeAfterBytes": 75497472
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-10k.json
new file mode 100644
index 0000000..b7d52d5
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-10k.json
@@ -0,0 +1,687 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygon-10k",
+ "name": "Polygon, 10k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:32.456Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4996,
+ "load": {
+ "commitMs": 1.83,
+ "readyMs": 764,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.338,
+ "p50Ms": 0.338,
+ "p95Ms": 0.338,
+ "maxMs": 0.338,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005067333000000007,
+ "allocatedBytes": 1922904,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ "frames": {
+ "frames": 248,
+ "durationMs": 4145.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 248,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.51,
+ "p50": 17.51,
+ "p95": 17.51,
+ "p99": 17.51,
+ "worst": 17.51
+ },
+ "phaseSharePct": {
+ "unknownDelay": 5.4,
+ "inputHandling": 0,
+ "animation": 2.1,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 2.9,
+ "swapBuffers": 23.5,
+ "gpu": 88.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.9,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1,
+ "swapBuffers": 8.2,
+ "gpu": 31.1,
+ "total": 35
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 477,
+ "p50": 0.07,
+ "p95": 0.38,
+ "p99": 2.23,
+ "max": 11.29
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 18.13,
+ "max": 21.61
+ },
+ "lateFrames": 0,
+ "busyMs": 85.3,
+ "busyRatio": 0.0206,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4146.8,
+ "commits": {
+ "count": 5,
+ "totalMs": 6.94,
+ "avgMs": 1.388,
+ "p95Ms": 1.949,
+ "maxMs": 1.949
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 7.804,
+ "maxMs": 15.783
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 3.785,
+ "maxMs": 5.002
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 19.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 18.92,
+ "avgMs": 3.785,
+ "p50Ms": 3.487,
+ "p95Ms": 5.002,
+ "maxMs": 5.002,
+ "mainThreadMs": 18.92,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.48,
+ "avgMs": 0.12,
+ "p50Ms": 0.09,
+ "p95Ms": 0.167,
+ "maxMs": 0.167,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 416.4,
+ "afterLoadMB": 375.7,
+ "afterInteractionMB": 442.4,
+ "afterCleanupMB": 438.3,
+ "peakMB": 442.4,
+ "loadDeltaMB": -40.7,
+ "interactionDeltaMB": 66.7,
+ "retainedAfterCleanupMB": 21.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 416.4,
+ "residentMB": 563.9,
+ "javaHeapMB": 84.8,
+ "nativeHeapMB": 215.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 375.7,
+ "residentMB": 523.3,
+ "javaHeapMB": 79.8,
+ "nativeHeapMB": 178.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 442.4,
+ "residentMB": 589.7,
+ "javaHeapMB": 101.4,
+ "nativeHeapMB": 224.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 438.3,
+ "residentMB": 585.9,
+ "javaHeapMB": 101.5,
+ "nativeHeapMB": 220.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 6362080,
+ "gcCount": 2,
+ "gcTimeMs": 0.0018145829999999807,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 22704384,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 48985728
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 487,
+ "wallMs": 4150,
+ "percent": 11.7,
+ "threadsBefore": 113,
+ "threadsAfter": 113,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 60000,
+ "estimatedBytes": 2687472
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447912
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 327.19,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.159,
+ "p95Ms": 1.159,
+ "maxMs": 1.159
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.783,
+ "maxMs": 15.783
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 4.505,
+ "maxMs": 4.505
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 4.51,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 4.51,
+ "avgMs": 4.505,
+ "p50Ms": 4.505,
+ "p95Ms": 4.505,
+ "maxMs": 4.505,
+ "mainThreadMs": 4.51,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1062088,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 314.05,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.02,
+ "avgMs": 1.017,
+ "p95Ms": 1.017,
+ "maxMs": 1.017
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.636,
+ "maxMs": 7.636
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.176,
+ "maxMs": 3.176
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.18,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.18,
+ "avgMs": 3.176,
+ "p50Ms": 3.176,
+ "p95Ms": 3.176,
+ "maxMs": 3.176,
+ "mainThreadMs": 3.18,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061744,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 329.71,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.89,
+ "avgMs": 1.893,
+ "p95Ms": 1.893,
+ "maxMs": 1.893
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.572,
+ "maxMs": 2.572
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.002,
+ "maxMs": 5.002
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 5,
+ "avgMs": 5.002,
+ "p50Ms": 5.002,
+ "p95Ms": 5.002,
+ "maxMs": 5.002,
+ "mainThreadMs": 5,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061456,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 314.73,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.922,
+ "p95Ms": 0.922,
+ "maxMs": 0.922
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.548,
+ "maxMs": 6.548
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.754,
+ "maxMs": 2.754
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.75,
+ "avgMs": 2.754,
+ "p50Ms": 2.754,
+ "p95Ms": 2.754,
+ "maxMs": 2.754,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0005431249999999777,
+ "allocatedBytes": 1062176,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 317.59,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.95,
+ "avgMs": 1.949,
+ "p95Ms": 1.949,
+ "maxMs": 1.949
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.48,
+ "maxMs": 6.48
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.487,
+ "maxMs": 3.487
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.49,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.49,
+ "avgMs": 3.487,
+ "p50Ms": 3.487,
+ "p95Ms": 3.487,
+ "maxMs": 3.487,
+ "mainThreadMs": 3.49,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061384,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-1k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-1k.json
new file mode 100644
index 0000000..0694810
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygon-1k.json
@@ -0,0 +1,688 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygon-1k",
+ "name": "Polygon, 1k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:24.706Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4966,
+ "load": {
+ "commitMs": 0.97,
+ "readyMs": 765,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.112,
+ "p50Ms": 0.112,
+ "p95Ms": 0.112,
+ "maxMs": 0.112,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 260840,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ "frames": {
+ "frames": 246,
+ "durationMs": 4115,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 246,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 11.68,
+ "p50": 11.68,
+ "p95": 11.68,
+ "p99": 11.68,
+ "worst": 11.68
+ },
+ "phaseSharePct": {
+ "unknownDelay": 8.6,
+ "inputHandling": 0,
+ "animation": 13.9,
+ "layoutMeasure": 0.4,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 6.3,
+ "swapBuffers": 68.7,
+ "gpu": 68.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2,
+ "inputHandling": 0,
+ "animation": 3.2,
+ "layoutMeasure": 0.1,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 1.5,
+ "swapBuffers": 16,
+ "gpu": 15.9,
+ "total": 23.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 479,
+ "p50": 0.08,
+ "p95": 0.26,
+ "p99": 1,
+ "max": 2.53
+ },
+ "frameGapMs": {
+ "p50": 16.64,
+ "p95": 17.9,
+ "max": 20.57
+ },
+ "lateFrames": 0,
+ "busyMs": 57.4,
+ "busyRatio": 0.0139,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4117,
+ "commits": {
+ "count": 5,
+ "totalMs": 4.1,
+ "avgMs": 0.82,
+ "p95Ms": 1.351,
+ "maxMs": 1.351
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 13.209,
+ "maxMs": 14.351
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 1.151,
+ "maxMs": 1.837
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 6.39,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 5.75,
+ "avgMs": 1.151,
+ "p50Ms": 1.048,
+ "p95Ms": 1.837,
+ "maxMs": 1.837,
+ "mainThreadMs": 5.75,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.63,
+ "avgMs": 0.158,
+ "p50Ms": 0.118,
+ "p95Ms": 0.299,
+ "maxMs": 0.299,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 411,
+ "afterLoadMB": 369.7,
+ "afterInteractionMB": 420.3,
+ "afterCleanupMB": 416.3,
+ "peakMB": 420.3,
+ "loadDeltaMB": -41.3,
+ "interactionDeltaMB": 50.6,
+ "retainedAfterCleanupMB": 5.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 411,
+ "residentMB": 558.3,
+ "javaHeapMB": 82.6,
+ "nativeHeapMB": 212,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 369.7,
+ "residentMB": 517,
+ "javaHeapMB": 78.4,
+ "nativeHeapMB": 174.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 420.3,
+ "residentMB": 567.7,
+ "javaHeapMB": 84.5,
+ "nativeHeapMB": 220.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 416.3,
+ "residentMB": 563.8,
+ "javaHeapMB": 84.6,
+ "nativeHeapMB": 215.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1131496,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 72
+ },
+ "android": {
+ "javaBytesAllocated": 6436304,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 47789680
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 450,
+ "wallMs": 4120,
+ "percent": 10.9,
+ "threadsBefore": 112,
+ "threadsAfter": 111,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 6000,
+ "estimatedBytes": 269292
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44882
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 313.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.35,
+ "p95Ms": 0.35,
+ "maxMs": 0.35
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.603,
+ "maxMs": 13.603
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.708,
+ "maxMs": 0.708
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.71,
+ "avgMs": 0.708,
+ "p50Ms": 0.708,
+ "p95Ms": 0.708,
+ "maxMs": 0.708,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170632,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 320.56,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.962,
+ "p95Ms": 0.962,
+ "maxMs": 0.962
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.204,
+ "maxMs": 14.204
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.048,
+ "maxMs": 1.048
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.05,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.05,
+ "avgMs": 1.048,
+ "p50Ms": 1.048,
+ "p95Ms": 1.048,
+ "maxMs": 1.048,
+ "mainThreadMs": 1.05,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170600,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 311.86,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.35,
+ "avgMs": 1.351,
+ "p95Ms": 1.351,
+ "maxMs": 1.351
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.378,
+ "maxMs": 10.378
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.837,
+ "maxMs": 1.837
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.84,
+ "avgMs": 1.837,
+ "p50Ms": 1.837,
+ "p95Ms": 1.837,
+ "maxMs": 1.837,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170112,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 315.64,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.509,
+ "maxMs": 13.509
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.88,
+ "maxMs": 0.88
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.88,
+ "p50Ms": 0.88,
+ "p95Ms": 0.88,
+ "maxMs": 0.88,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 171096,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 315.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.8,
+ "avgMs": 0.795,
+ "p95Ms": 0.795,
+ "maxMs": 0.795
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.351,
+ "maxMs": 14.351
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.281,
+ "maxMs": 1.281
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.28,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.28,
+ "avgMs": 1.281,
+ "p50Ms": 1.281,
+ "p95Ms": 1.281,
+ "maxMs": 1.281,
+ "mainThreadMs": 1.28,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170176,
+ "heapSizeAfterBytes": 75497472
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygons-200x20.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygons-200x20.json
new file mode 100644
index 0000000..b0add27
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polygons-200x20.json
@@ -0,0 +1,577 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygons-200x20",
+ "name": "200 polygons of 20 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polygons: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:30:46.700Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4348,
+ "load": {
+ "commitMs": 1.54,
+ "readyMs": 794,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718448,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 209,
+ "durationMs": 3486.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.87,
+ "p50": 16.87,
+ "p95": 16.87,
+ "p99": 16.87,
+ "worst": 16.87
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.9,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.3,
+ "commandIssue": 3.3,
+ "swapBuffers": 33.6,
+ "gpu": 87.9
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.3,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.1,
+ "swapBuffers": 11.4,
+ "gpu": 29.6,
+ "total": 33.7
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 413,
+ "p50": 0.07,
+ "p95": 0.27,
+ "p99": 2.05,
+ "max": 3.98
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 18.02,
+ "max": 23.17
+ },
+ "lateFrames": 0,
+ "busyMs": 54.6,
+ "busyRatio": 0.0157,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3487.8,
+ "commits": {
+ "count": 3,
+ "totalMs": 3.55,
+ "avgMs": 1.184,
+ "p95Ms": 1.423,
+ "maxMs": 1.423
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 13.497,
+ "maxMs": 14.043
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 5.766,
+ "maxMs": 6.323
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 17.78,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 17.3,
+ "avgMs": 5.766,
+ "p50Ms": 5.655,
+ "p95Ms": 6.323,
+ "maxMs": 6.323,
+ "mainThreadMs": 17.3,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.48,
+ "avgMs": 0.12,
+ "p50Ms": 0.088,
+ "p95Ms": 0.207,
+ "maxMs": 0.207,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 425.7,
+ "afterLoadMB": 398.7,
+ "afterInteractionMB": 390.1,
+ "afterCleanupMB": 386.1,
+ "peakMB": 425.7,
+ "loadDeltaMB": -27,
+ "interactionDeltaMB": -8.6,
+ "retainedAfterCleanupMB": -39.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 425.7,
+ "residentMB": 573,
+ "javaHeapMB": 87.4,
+ "nativeHeapMB": 215.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 398.7,
+ "residentMB": 546.1,
+ "javaHeapMB": 84,
+ "nativeHeapMB": 192.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 390.1,
+ "residentMB": 537.6,
+ "javaHeapMB": 87.4,
+ "nativeHeapMB": 181.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 386.1,
+ "residentMB": 533.6,
+ "javaHeapMB": 87.6,
+ "nativeHeapMB": 176.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1362928,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 53962272,
+ "gcCount": 2,
+ "gcTimeMs": 151,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -12321472
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1305,
+ "wallMs": 3491,
+ "percent": 37.4,
+ "threadsBefore": 126,
+ "threadsAfter": 125,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 0
+ },
+ "wallMs": 317,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.032,
+ "p95Ms": 1.032,
+ "maxMs": 1.032
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.043,
+ "maxMs": 14.043
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.655,
+ "maxMs": 5.655
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5.66,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 5.66,
+ "avgMs": 5.655,
+ "p50Ms": 5.655,
+ "p95Ms": 5.655,
+ "maxMs": 5.655,
+ "mainThreadMs": 5.66,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 238808,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 1
+ },
+ "wallMs": 314.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.42,
+ "avgMs": 1.423,
+ "p95Ms": 1.423,
+ "maxMs": 1.423
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.691,
+ "maxMs": 12.691
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 6.323,
+ "maxMs": 6.323
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 6.32,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 6.32,
+ "avgMs": 6.323,
+ "p50Ms": 6.323,
+ "p95Ms": 6.323,
+ "maxMs": 6.323,
+ "mainThreadMs": 6.32,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 238672,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 2
+ },
+ "wallMs": 316.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.1,
+ "avgMs": 1.098,
+ "p95Ms": 1.098,
+ "maxMs": 1.098
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.757,
+ "maxMs": 13.757
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.32,
+ "maxMs": 5.32
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5.32,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 5.32,
+ "avgMs": 5.32,
+ "p50Ms": 5.32,
+ "p95Ms": 5.32,
+ "maxMs": 5.32,
+ "mainThreadMs": 5.32,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 238216,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-100.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-100.json
new file mode 100644
index 0000000..ee2882f
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-100.json
@@ -0,0 +1,852 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-100",
+ "name": "Polyline, 100 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:29:42.598Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5914,
+ "load": {
+ "commitMs": 1.05,
+ "readyMs": 743,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58064,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 303,
+ "durationMs": 5054.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.01,
+ "p50": 17.01,
+ "p95": 17.01,
+ "p99": 17.01,
+ "worst": 17.01
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.2,
+ "inputHandling": 0,
+ "animation": 6.5,
+ "layoutMeasure": 0.4,
+ "draw": 1,
+ "sync": 0.3,
+ "commandIssue": 6.2,
+ "swapBuffers": 65.3,
+ "gpu": 83
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.8,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.1,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 2.1,
+ "swapBuffers": 22.2,
+ "gpu": 28.2,
+ "total": 34
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 580,
+ "p50": 0.1,
+ "p95": 0.3,
+ "p99": 0.47,
+ "max": 1.12
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.59,
+ "max": 21.43
+ },
+ "lateFrames": 0,
+ "busyMs": 74.5,
+ "busyRatio": 0.0147,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5056.3,
+ "commits": {
+ "count": 8,
+ "totalMs": 5.3,
+ "avgMs": 0.663,
+ "p95Ms": 1.157,
+ "maxMs": 1.157
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 12.536,
+ "maxMs": 15.516
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 0.485,
+ "maxMs": 0.772
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 4.72,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 3.88,
+ "avgMs": 0.485,
+ "p50Ms": 0.406,
+ "p95Ms": 0.772,
+ "maxMs": 0.772,
+ "mainThreadMs": 3.88,
+ "backgroundMs": 0,
+ "items": 800
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.84,
+ "avgMs": 0.21,
+ "p50Ms": 0.17,
+ "p95Ms": 0.356,
+ "maxMs": 0.356,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 323.9,
+ "afterLoadMB": 386,
+ "afterInteractionMB": 340.2,
+ "afterCleanupMB": 336.2,
+ "peakMB": 386,
+ "loadDeltaMB": 62.1,
+ "interactionDeltaMB": -45.8,
+ "retainedAfterCleanupMB": 12.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 323.9,
+ "residentMB": 470.7,
+ "javaHeapMB": 65.7,
+ "nativeHeapMB": 149.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 386,
+ "residentMB": 532.8,
+ "javaHeapMB": 67.5,
+ "nativeHeapMB": 211.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 340.2,
+ "residentMB": 487.1,
+ "javaHeapMB": 67.1,
+ "nativeHeapMB": 165.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 336.2,
+ "residentMB": 483.1,
+ "javaHeapMB": 67.2,
+ "nativeHeapMB": 160.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 565944,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 5272928,
+ "gcCount": 1,
+ "gcTimeMs": 58,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -48520080
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 601,
+ "wallMs": 5060,
+ "percent": 11.9,
+ "threadsBefore": 104,
+ "threadsAfter": 104,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900,
+ "estimatedBytes": 40852
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4543
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 303.73,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.407,
+ "p95Ms": 0.407,
+ "maxMs": 0.407
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.377,
+ "maxMs": 3.377
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.461,
+ "maxMs": 0.461
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.46,
+ "avgMs": 0.461,
+ "p50Ms": 0.461,
+ "p95Ms": 0.461,
+ "maxMs": 0.461,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 38168,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 317.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.44,
+ "p95Ms": 0.44,
+ "maxMs": 0.44
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.516,
+ "maxMs": 15.516
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.357,
+ "maxMs": 0.357
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.357,
+ "p50Ms": 0.357,
+ "p95Ms": 0.357,
+ "maxMs": 0.357,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37160,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 314.2,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.55,
+ "p95Ms": 0.55,
+ "maxMs": 0.55
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.275,
+ "maxMs": 13.275
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.626,
+ "maxMs": 0.626
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.626,
+ "p50Ms": 0.626,
+ "p95Ms": 0.626,
+ "maxMs": 0.626,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36496,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 312.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.157,
+ "p95Ms": 1.157,
+ "maxMs": 1.157
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.204,
+ "maxMs": 13.204
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.647,
+ "maxMs": 0.647
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.647,
+ "p50Ms": 0.647,
+ "p95Ms": 0.647,
+ "maxMs": 0.647,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37360,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 317.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.696,
+ "p95Ms": 0.696,
+ "maxMs": 0.696
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.677,
+ "maxMs": 14.677
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.217,
+ "maxMs": 0.217
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.217,
+ "p50Ms": 0.217,
+ "p95Ms": 0.217,
+ "maxMs": 0.217,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36392,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 314.39,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.817,
+ "p95Ms": 0.817,
+ "maxMs": 0.817
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.532,
+ "maxMs": 12.532
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.772,
+ "maxMs": 0.772
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.772,
+ "p50Ms": 0.772,
+ "p95Ms": 0.772,
+ "maxMs": 0.772,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37352,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 314.76,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.613,
+ "p95Ms": 0.613,
+ "maxMs": 0.613
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.202,
+ "maxMs": 15.202
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.406,
+ "maxMs": 0.406
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.406,
+ "p50Ms": 0.406,
+ "p95Ms": 0.406,
+ "maxMs": 0.406,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 39312,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 314.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.622,
+ "p95Ms": 0.622,
+ "maxMs": 0.622
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.508,
+ "maxMs": 12.508
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.394,
+ "maxMs": 0.394
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.394,
+ "p50Ms": 0.394,
+ "p95Ms": 0.394,
+ "maxMs": 0.394,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37280,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-100k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-100k.json
new file mode 100644
index 0000000..5286cf4
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-100k.json
@@ -0,0 +1,853 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-100k",
+ "name": "Polyline, 100k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "One 100000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:09.276Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6478,
+ "load": {
+ "commitMs": 6.17,
+ "readyMs": 763,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.101,
+ "p50Ms": 0.101,
+ "p95Ms": 0.101,
+ "maxMs": 0.101,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.007243916000000017,
+ "allocatedBytes": 18680160,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 330,
+ "durationMs": 5640.6,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.6,
+ "p50": 58,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 17.07,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 322,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 8,
+ "jankRatio": 0.0242,
+ "droppedFrames": 8,
+ "longFrames": 0,
+ "overBudgetFrames": 8,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.9,
+ "p50": 16.9,
+ "p95": 16.9,
+ "p99": 16.9,
+ "worst": 16.9
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.5,
+ "inputHandling": 0,
+ "animation": 1.9,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 4,
+ "swapBuffers": 66.6,
+ "gpu": 91.5
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.6,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.3,
+ "swapBuffers": 22.5,
+ "gpu": 30.9,
+ "total": 33.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 657,
+ "p50": 0.07,
+ "p95": 40.96,
+ "p99": 69.15,
+ "max": 109.71
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 30.59,
+ "max": 73.21
+ },
+ "lateFrames": 17,
+ "busyMs": 2819.6,
+ "busyRatio": 0.4998,
+ "longTasks": {
+ "count": 9,
+ "totalMs": 573.1,
+ "maxMs": 72.1,
+ "source": "performance-observer"
+ },
+ "durationMs": 5641.6,
+ "commits": {
+ "count": 8,
+ "totalMs": 48.2,
+ "avgMs": 6.025,
+ "p95Ms": 6.234,
+ "maxMs": 6.234
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 13.771,
+ "maxMs": 20.331
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 15.01,
+ "maxMs": 16.343
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 120.51,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 120.08,
+ "avgMs": 15.01,
+ "p50Ms": 14.659,
+ "p95Ms": 16.343,
+ "maxMs": 16.343,
+ "mainThreadMs": 120.08,
+ "backgroundMs": 0,
+ "items": 800000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.42,
+ "avgMs": 0.106,
+ "p50Ms": 0.085,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0.42,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 364.9,
+ "afterLoadMB": 352.4,
+ "afterInteractionMB": 421.7,
+ "afterCleanupMB": 417.7,
+ "peakMB": 421.7,
+ "loadDeltaMB": -12.5,
+ "interactionDeltaMB": 69.3,
+ "retainedAfterCleanupMB": 52.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 364.9,
+ "residentMB": 512.1,
+ "javaHeapMB": 70.2,
+ "nativeHeapMB": 186.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 352.4,
+ "residentMB": 499.7,
+ "javaHeapMB": 75.4,
+ "nativeHeapMB": 169.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 421.7,
+ "residentMB": 568.9,
+ "javaHeapMB": 89.9,
+ "nativeHeapMB": 215.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 417.7,
+ "residentMB": 565,
+ "javaHeapMB": 90,
+ "nativeHeapMB": 210.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 95259304,
+ "gcCount": 26,
+ "gcTimeMs": 0.013053210999999953,
+ "heapSizeAfterMB": 72
+ },
+ "android": {
+ "javaBytesAllocated": 144762272,
+ "gcCount": 4,
+ "gcTimeMs": 209,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 47548384
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1620,
+ "wallMs": 5645,
+ "percent": 28.7,
+ "threadsBefore": 110,
+ "threadsAfter": 109,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900000,
+ "estimatedBytes": 40300927
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100000,
+ "estimatedBytes": 4477935
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 360.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.52,
+ "avgMs": 5.522,
+ "p95Ms": 5.522,
+ "maxMs": 5.522
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.557,
+ "maxMs": 8.557
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 16.343,
+ "maxMs": 16.343
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 16.34,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 16.34,
+ "avgMs": 16.343,
+ "p50Ms": 16.343,
+ "p95Ms": 16.343,
+ "maxMs": 16.343,
+ "mainThreadMs": 16.34,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0005801249999999869,
+ "allocatedBytes": 10424856,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 382.28,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.06,
+ "avgMs": 6.063,
+ "p95Ms": 6.063,
+ "maxMs": 6.063
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 20.331,
+ "maxMs": 20.331
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.477,
+ "maxMs": 14.477
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.48,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.48,
+ "avgMs": 14.477,
+ "p50Ms": 14.477,
+ "p95Ms": 14.477,
+ "maxMs": 14.477,
+ "mainThreadMs": 14.48,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.000586958999999998,
+ "allocatedBytes": 10422704,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 382.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.23,
+ "avgMs": 6.234,
+ "p95Ms": 6.234,
+ "maxMs": 6.234
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.967,
+ "maxMs": 16.967
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 15.359,
+ "maxMs": 15.359
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 15.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 15.36,
+ "avgMs": 15.359,
+ "p50Ms": 15.359,
+ "p95Ms": 15.359,
+ "maxMs": 15.359,
+ "mainThreadMs": 15.36,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0006605829999999924,
+ "allocatedBytes": 10422120,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 3
+ },
+ "wallMs": 382.47,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.12,
+ "avgMs": 6.121,
+ "p95Ms": 6.121,
+ "maxMs": 6.121
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.044,
+ "maxMs": 16.044
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.659,
+ "maxMs": 14.659
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.66,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.66,
+ "avgMs": 14.659,
+ "p50Ms": 14.659,
+ "p95Ms": 14.659,
+ "maxMs": 14.659,
+ "mainThreadMs": 14.66,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0006086249999999738,
+ "allocatedBytes": 10423008,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 4
+ },
+ "wallMs": 383.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.2,
+ "avgMs": 6.201,
+ "p95Ms": 6.201,
+ "maxMs": 6.201
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.666,
+ "maxMs": 15.666
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 15.44,
+ "maxMs": 15.44
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 15.44,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 15.44,
+ "avgMs": 15.44,
+ "p50Ms": 15.44,
+ "p95Ms": 15.44,
+ "maxMs": 15.44,
+ "mainThreadMs": 15.44,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0005733340000000364,
+ "allocatedBytes": 10422184,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 381.24,
+ "commits": {
+ "count": 1,
+ "totalMs": 6,
+ "avgMs": 5.998,
+ "p95Ms": 5.998,
+ "maxMs": 5.998
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.387,
+ "maxMs": 7.387
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.368,
+ "maxMs": 14.368
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.37,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.37,
+ "avgMs": 14.368,
+ "p50Ms": 14.368,
+ "p95Ms": 14.368,
+ "maxMs": 14.368,
+ "mainThreadMs": 14.37,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0014992090000000013,
+ "allocatedBytes": 11541872,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 382.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.99,
+ "avgMs": 5.995,
+ "p95Ms": 5.995,
+ "maxMs": 5.995
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.418,
+ "maxMs": 13.418
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.917,
+ "maxMs": 14.917
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.92,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.92,
+ "avgMs": 14.917,
+ "p50Ms": 14.917,
+ "p95Ms": 14.917,
+ "maxMs": 14.917,
+ "mainThreadMs": 14.92,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0012355419999999784,
+ "allocatedBytes": 11543968,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 382.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.06,
+ "avgMs": 6.064,
+ "p95Ms": 6.064,
+ "maxMs": 6.064
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.799,
+ "maxMs": 11.799
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.521,
+ "maxMs": 14.521
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.52,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.52,
+ "avgMs": 14.521,
+ "p50Ms": 14.521,
+ "p95Ms": 14.521,
+ "maxMs": 14.521,
+ "mainThreadMs": 14.52,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0013609169999999615,
+ "allocatedBytes": 11541896,
+ "heapSizeAfterBytes": 75497472
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-10k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-10k.json
new file mode 100644
index 0000000..192c813
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-10k.json
@@ -0,0 +1,852 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-10k",
+ "name": "Polyline, 10k points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:29:59.941Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5965,
+ "load": {
+ "commitMs": 1.67,
+ "readyMs": 744,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.072,
+ "p50Ms": 0.072,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1922568,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 305,
+ "durationMs": 5097.6,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 305,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.89,
+ "p50": 16.89,
+ "p95": 16.89,
+ "p99": 16.89,
+ "worst": 16.89
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.5,
+ "inputHandling": 0,
+ "animation": 2.3,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.2,
+ "commandIssue": 2.4,
+ "swapBuffers": 25.2,
+ "gpu": 92.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.8,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 0.8,
+ "swapBuffers": 8.5,
+ "gpu": 31.3,
+ "total": 33.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 590,
+ "p50": 0.09,
+ "p95": 0.28,
+ "p99": 5.15,
+ "max": 9.64
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 18.09,
+ "max": 24.48
+ },
+ "lateFrames": 0,
+ "busyMs": 118.2,
+ "busyRatio": 0.0232,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5098.3,
+ "commits": {
+ "count": 8,
+ "totalMs": 13.28,
+ "avgMs": 1.661,
+ "p95Ms": 2.608,
+ "maxMs": 2.608
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 8.607,
+ "maxMs": 18.361
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 3.299,
+ "maxMs": 6.556
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 26.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 26.39,
+ "avgMs": 3.299,
+ "p50Ms": 2.959,
+ "p95Ms": 6.556,
+ "maxMs": 6.556,
+ "mainThreadMs": 26.39,
+ "backgroundMs": 0,
+ "items": 80000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.57,
+ "avgMs": 0.141,
+ "p50Ms": 0.112,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 330.3,
+ "afterLoadMB": 395.1,
+ "afterInteractionMB": 370.6,
+ "afterCleanupMB": 366.6,
+ "peakMB": 395.1,
+ "loadDeltaMB": 64.8,
+ "interactionDeltaMB": -24.5,
+ "retainedAfterCleanupMB": 36.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 330.3,
+ "residentMB": 477.4,
+ "javaHeapMB": 68,
+ "nativeHeapMB": 154.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 395.1,
+ "residentMB": 542.3,
+ "javaHeapMB": 71.5,
+ "nativeHeapMB": 217.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 370.6,
+ "residentMB": 517.8,
+ "javaHeapMB": 70,
+ "nativeHeapMB": 191.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 366.6,
+ "residentMB": 513.8,
+ "javaHeapMB": 70.1,
+ "nativeHeapMB": 186.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 9941448,
+ "gcCount": 5,
+ "gcTimeMs": 0.0052175420000000194,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 21457296,
+ "gcCount": 1,
+ "gcTimeMs": 59,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -27342112
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 671,
+ "wallMs": 5102,
+ "percent": 13.2,
+ "threadsBefore": 107,
+ "threadsAfter": 107,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 90000,
+ "estimatedBytes": 4030707
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 324.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.155,
+ "p95Ms": 1.155,
+ "maxMs": 1.155
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.624,
+ "maxMs": 15.624
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.34,
+ "maxMs": 2.34
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.34,
+ "avgMs": 2.34,
+ "p50Ms": 2.34,
+ "p95Ms": 2.34,
+ "maxMs": 2.34,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1062128,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 329.31,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.61,
+ "avgMs": 2.608,
+ "p95Ms": 2.608,
+ "maxMs": 2.608
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.361,
+ "maxMs": 18.361
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.395,
+ "maxMs": 3.395
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.4,
+ "avgMs": 3.395,
+ "p50Ms": 3.395,
+ "p95Ms": 3.395,
+ "maxMs": 3.395,
+ "mainThreadMs": 3.4,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013150000000000106,
+ "allocatedBytes": 1062008,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 315.85,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.37,
+ "avgMs": 1.371,
+ "p95Ms": 1.371,
+ "maxMs": 1.371
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.613,
+ "maxMs": 9.613
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 6.556,
+ "maxMs": 6.556
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 6.56,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 6.56,
+ "avgMs": 6.556,
+ "p50Ms": 6.556,
+ "p95Ms": 6.556,
+ "maxMs": 6.556,
+ "mainThreadMs": 6.56,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061320,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 318.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.51,
+ "avgMs": 1.509,
+ "p95Ms": 1.509,
+ "maxMs": 1.509
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.002,
+ "maxMs": 9.002
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.996,
+ "maxMs": 2.996
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3,
+ "avgMs": 2.996,
+ "p50Ms": 2.996,
+ "p95Ms": 2.996,
+ "maxMs": 2.996,
+ "mainThreadMs": 3,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1062320,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 313.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.235,
+ "p95Ms": 1.235,
+ "maxMs": 1.235
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 5.002,
+ "maxMs": 5.002
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.959,
+ "maxMs": 2.959
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.96,
+ "avgMs": 2.959,
+ "p50Ms": 2.959,
+ "p95Ms": 2.959,
+ "maxMs": 2.959,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001157458,
+ "allocatedBytes": 1061336,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 315.33,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.683,
+ "p95Ms": 1.683,
+ "maxMs": 1.683
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 4.69,
+ "maxMs": 4.69
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.747,
+ "maxMs": 2.747
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.75,
+ "avgMs": 2.747,
+ "p50Ms": 2.747,
+ "p95Ms": 2.747,
+ "maxMs": 2.747,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1173240,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 317.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.76,
+ "avgMs": 1.761,
+ "p95Ms": 1.761,
+ "maxMs": 1.761
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.745,
+ "maxMs": 3.745
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.437,
+ "maxMs": 2.437
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.44,
+ "avgMs": 2.437,
+ "p50Ms": 2.437,
+ "p95Ms": 2.437,
+ "maxMs": 2.437,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0008984169999999847,
+ "allocatedBytes": 1175352,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 314.12,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.96,
+ "avgMs": 1.961,
+ "p95Ms": 1.961,
+ "maxMs": 1.961
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.815,
+ "maxMs": 2.815
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.963,
+ "maxMs": 2.963
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.96,
+ "avgMs": 2.963,
+ "p50Ms": 2.963,
+ "p95Ms": 2.963,
+ "maxMs": 2.963,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1173304,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-1k.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-1k.json
new file mode 100644
index 0000000..c159d49
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polyline-1k.json
@@ -0,0 +1,853 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-1k",
+ "name": "Polyline, 1k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:29:51.247Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5925,
+ "load": {
+ "commitMs": 1.38,
+ "readyMs": 750,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 260520,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 303,
+ "durationMs": 5064.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 0,
+ "renderTotalMs": {
+ "average": 0,
+ "p50": 0,
+ "p95": 0,
+ "p99": 0,
+ "worst": 0
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0,
+ "total": 0
+ },
+ "missedDeadline": 0
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 580,
+ "p50": 0.09,
+ "p95": 0.35,
+ "p99": 1.01,
+ "max": 3.88
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 18.25,
+ "max": 20.65
+ },
+ "lateFrames": 0,
+ "busyMs": 85.2,
+ "busyRatio": 0.0168,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5067.6,
+ "commits": {
+ "count": 8,
+ "totalMs": 8.17,
+ "avgMs": 1.022,
+ "p95Ms": 1.483,
+ "maxMs": 1.483
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 11.326,
+ "maxMs": 13.247
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 0.739,
+ "maxMs": 1.151
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 6.84,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 5.91,
+ "avgMs": 0.739,
+ "p50Ms": 0.645,
+ "p95Ms": 1.151,
+ "maxMs": 1.151,
+ "mainThreadMs": 5.91,
+ "backgroundMs": 0,
+ "items": 8000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.93,
+ "avgMs": 0.232,
+ "p50Ms": 0.27,
+ "p95Ms": 0.311,
+ "maxMs": 0.311,
+ "mainThreadMs": 0.93,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 336.3,
+ "afterLoadMB": 398.5,
+ "afterInteractionMB": 334.2,
+ "afterCleanupMB": 330.2,
+ "peakMB": 398.5,
+ "loadDeltaMB": 62.2,
+ "interactionDeltaMB": -64.3,
+ "retainedAfterCleanupMB": -6.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 336.3,
+ "residentMB": 483.1,
+ "javaHeapMB": 67.4,
+ "nativeHeapMB": 161,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 398.5,
+ "residentMB": 545.4,
+ "javaHeapMB": 69.2,
+ "nativeHeapMB": 223.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 334.2,
+ "residentMB": 481.3,
+ "javaHeapMB": 67.7,
+ "nativeHeapMB": 158.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 330.2,
+ "residentMB": 477.2,
+ "javaHeapMB": 67.8,
+ "nativeHeapMB": 154.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1737448,
+ "gcCount": 1,
+ "gcTimeMs": 0.008637457999999987,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 6555456,
+ "gcCount": 1,
+ "gcTimeMs": 79,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -67451200
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 643,
+ "wallMs": 5072,
+ "percent": 12.7,
+ "threadsBefore": 106,
+ "threadsAfter": 105,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 9000,
+ "estimatedBytes": 403674
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44865
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 316.3,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.438,
+ "p95Ms": 0.438,
+ "maxMs": 0.438
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.145,
+ "maxMs": 12.145
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.607,
+ "maxMs": 0.607
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.607,
+ "p50Ms": 0.607,
+ "p95Ms": 0.607,
+ "maxMs": 0.607,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170808,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 312.65,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.18,
+ "avgMs": 1.18,
+ "p95Ms": 1.18,
+ "maxMs": 1.18
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.41,
+ "maxMs": 11.41
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.642,
+ "maxMs": 0.642
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p50Ms": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170576,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 317.14,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.483,
+ "p95Ms": 1.483,
+ "maxMs": 1.483
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.247,
+ "maxMs": 13.247
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.151,
+ "maxMs": 1.151
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.15,
+ "avgMs": 1.151,
+ "p50Ms": 1.151,
+ "p95Ms": 1.151,
+ "maxMs": 1.151,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170200,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 315.12,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.558,
+ "p95Ms": 0.558,
+ "maxMs": 0.558
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 4.859,
+ "maxMs": 4.859
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.571,
+ "maxMs": 0.571
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.57,
+ "avgMs": 0.571,
+ "p50Ms": 0.571,
+ "p95Ms": 0.571,
+ "maxMs": 0.571,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.008637457999999987,
+ "allocatedBytes": 171104,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 315.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.97,
+ "p95Ms": 0.97,
+ "maxMs": 0.97
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.976,
+ "maxMs": 12.976
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.645,
+ "maxMs": 0.645
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.645,
+ "p50Ms": 0.645,
+ "p95Ms": 0.645,
+ "maxMs": 0.645,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170232,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 316.27,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.08,
+ "avgMs": 1.082,
+ "p95Ms": 1.082,
+ "maxMs": 1.082
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.746,
+ "maxMs": 12.746
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.65,
+ "maxMs": 0.65
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.65,
+ "p50Ms": 0.65,
+ "p95Ms": 0.65,
+ "maxMs": 0.65,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 181288,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 314.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.985,
+ "p95Ms": 0.985,
+ "maxMs": 0.985
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.348,
+ "maxMs": 12.348
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.728,
+ "maxMs": 0.728
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.73,
+ "avgMs": 0.728,
+ "p50Ms": 0.728,
+ "p95Ms": 0.728,
+ "maxMs": 0.728,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 183392,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 314.96,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.477,
+ "p95Ms": 1.477,
+ "maxMs": 1.477
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.874,
+ "maxMs": 10.874
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.916,
+ "maxMs": 0.916
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.916,
+ "p50Ms": 0.916,
+ "p95Ms": 0.916,
+ "maxMs": 0.916,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 181304,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polylines-200x50.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polylines-200x50.json
new file mode 100644
index 0000000..8aa10d0
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/polylines-200x50.json
@@ -0,0 +1,577 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polylines-200x50",
+ "name": "200 polylines of 50 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polylines: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:30:39.573Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4353,
+ "load": {
+ "commitMs": 1.52,
+ "readyMs": 773,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0005332920000000185,
+ "allocatedBytes": 1438120,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 209,
+ "durationMs": 3485.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.93,
+ "p50": 16.93,
+ "p95": 16.93,
+ "p99": 16.93,
+ "worst": 16.93
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.5,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.3,
+ "draw": 0.4,
+ "sync": 0.2,
+ "commandIssue": 5.1,
+ "swapBuffers": 38.7,
+ "gpu": 89.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.7,
+ "swapBuffers": 13.1,
+ "gpu": 30.2,
+ "total": 33.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 408,
+ "p50": 0.07,
+ "p95": 0.21,
+ "p99": 0.47,
+ "max": 2.58
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.88,
+ "max": 30.37
+ },
+ "lateFrames": 2,
+ "busyMs": 40.2,
+ "busyRatio": 0.0115,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3486.4,
+ "commits": {
+ "count": 3,
+ "totalMs": 5.87,
+ "avgMs": 1.958,
+ "p95Ms": 2.505,
+ "maxMs": 2.505
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 8.359,
+ "maxMs": 10.938
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 12.313,
+ "maxMs": 13.517
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 37.42,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 36.94,
+ "avgMs": 12.313,
+ "p50Ms": 12.165,
+ "p95Ms": 13.517,
+ "maxMs": 13.517,
+ "mainThreadMs": 36.94,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.48,
+ "avgMs": 0.119,
+ "p50Ms": 0.115,
+ "p95Ms": 0.15,
+ "maxMs": 0.15,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 438.7,
+ "afterLoadMB": 430.1,
+ "afterInteractionMB": 428.1,
+ "afterCleanupMB": 425.6,
+ "peakMB": 438.7,
+ "loadDeltaMB": -8.6,
+ "interactionDeltaMB": -2,
+ "retainedAfterCleanupMB": -13.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 438.7,
+ "residentMB": 586.1,
+ "javaHeapMB": 101.9,
+ "nativeHeapMB": 220.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 430.1,
+ "residentMB": 577.3,
+ "javaHeapMB": 81.6,
+ "nativeHeapMB": 229.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 428.1,
+ "residentMB": 575.3,
+ "javaHeapMB": 87.1,
+ "nativeHeapMB": 221.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 425.6,
+ "residentMB": 572.9,
+ "javaHeapMB": 87.2,
+ "nativeHeapMB": 215.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 2696896,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 32031056,
+ "gcCount": 1,
+ "gcTimeMs": 65,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -9300416
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 830,
+ "wallMs": 3490,
+ "percent": 23.8,
+ "threadsBefore": 124,
+ "threadsAfter": 124,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 800,
+ "coordinates": 40000,
+ "estimatedBytes": 1850384
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 200,
+ "coordinates": 10000,
+ "estimatedBytes": 462596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 0
+ },
+ "wallMs": 312.41,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.269,
+ "p95Ms": 1.269,
+ "maxMs": 1.269
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.701,
+ "maxMs": 6.701
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 13.517,
+ "maxMs": 13.517
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 13.52,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 13.52,
+ "avgMs": 13.517,
+ "p50Ms": 13.517,
+ "p95Ms": 13.517,
+ "maxMs": 13.517,
+ "mainThreadMs": 13.52,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 537408,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 1
+ },
+ "wallMs": 313.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.5,
+ "avgMs": 2.505,
+ "p95Ms": 2.505,
+ "maxMs": 2.505
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.439,
+ "maxMs": 7.439
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 11.258,
+ "maxMs": 11.258
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 11.26,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 11.26,
+ "avgMs": 11.258,
+ "p50Ms": 11.258,
+ "p95Ms": 11.258,
+ "maxMs": 11.258,
+ "mainThreadMs": 11.26,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 537232,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 2
+ },
+ "wallMs": 316.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.1,
+ "avgMs": 2.101,
+ "p95Ms": 2.101,
+ "maxMs": 2.101
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.938,
+ "maxMs": 10.938
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 12.165,
+ "maxMs": 12.165
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 12.17,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 12.17,
+ "avgMs": 12.165,
+ "p50Ms": 12.165,
+ "p95Ms": 12.165,
+ "maxMs": 12.165,
+ "mainThreadMs": 12.17,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 536760,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/run.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/run.json
new file mode 100644
index 0000000..e3328b1
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/run.json
@@ -0,0 +1,39606 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "suite": "baseline",
+ "startedAt": "2026-09-10T14:25:47.462Z",
+ "finishedAt": "2026-09-10T14:37:43.810Z",
+ "platform": "android",
+ "provider": "google",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "scenarios": [
+ "markers-100",
+ "markers-1k",
+ "markers-10k",
+ "markers-50k",
+ "markers-children-1k",
+ "markers-10k-rich",
+ "camera-fast-pan-0",
+ "camera-fast-pan-1k",
+ "camera-idle-10k",
+ "camera-slow-pan-10k",
+ "camera-fast-pan-10k",
+ "camera-continuous-pan-10k",
+ "camera-zoom-in-10k",
+ "camera-zoom-out-10k",
+ "camera-rapid-zoom-10k",
+ "camera-rotate-10k",
+ "camera-pitch-10k",
+ "camera-rapid-10k",
+ "camera-fast-pan-50k",
+ "mutations-10k",
+ "mutations-1k-children",
+ "mutations-continuous-1k",
+ "mutations-continuous-10k",
+ "polyline-100",
+ "polyline-1k",
+ "polyline-10k",
+ "polyline-100k",
+ "polygon-100",
+ "polygon-1k",
+ "polygon-10k",
+ "polylines-200x50",
+ "polygons-200x20",
+ "cluster-1k",
+ "cluster-10k",
+ "cluster-50k",
+ "combined-10k-camera",
+ "combined-10k-cluster-camera",
+ "combined-10k-updates",
+ "combined-10k-polyline",
+ "combined-10k-polygon",
+ "combined-all",
+ "stability-5m"
+ ],
+ "results": [
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-100",
+ "name": "100 markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 100 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:25:54.075Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3808,
+ "load": {
+ "commitMs": 0.89,
+ "readyMs": 841,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 112,
+ "mainThreadMs": 13.85,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.21,
+ "avgMs": 0.104,
+ "p50Ms": 0.007,
+ "p95Ms": 0.201,
+ "maxMs": 0.201,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.004,
+ "p50Ms": 0,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.018,
+ "p50Ms": 0,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.004,
+ "p50Ms": 0,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "marker.visualProps": {
+ "count": 100,
+ "totalMs": 3.22,
+ "avgMs": 0.032,
+ "p50Ms": 0.021,
+ "p95Ms": 0.056,
+ "maxMs": 0.599,
+ "mainThreadMs": 3.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applySync": {
+ "count": 1,
+ "totalMs": 10.02,
+ "avgMs": 10.018,
+ "p50Ms": 10.018,
+ "p95Ms": 10.018,
+ "maxMs": 10.018,
+ "mainThreadMs": 10.02,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.361,
+ "p50Ms": 0.361,
+ "p95Ms": 0.361,
+ "maxMs": 0.361,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 152264,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 176,
+ "durationMs": 2940.4,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.17,
+ "p50": 17.17,
+ "p95": 17.17,
+ "p99": 17.17,
+ "worst": 17.17
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.5,
+ "inputHandling": 0,
+ "animation": 6.5,
+ "layoutMeasure": 0.5,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 8.2,
+ "swapBuffers": 36.7,
+ "gpu": 80.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.1,
+ "commandIssue": 2.8,
+ "swapBuffers": 12.6,
+ "gpu": 27.6,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 346,
+ "p50": 0.07,
+ "p95": 0.2,
+ "p99": 0.65,
+ "max": 4.31
+ },
+ "frameGapMs": {
+ "p50": 16.63,
+ "p95": 17.69,
+ "max": 20.52
+ },
+ "lateFrames": 0,
+ "busyMs": 38.5,
+ "busyRatio": 0.0131,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2942.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 4,
+ "mainThreadMs": 1.54,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.54,
+ "avgMs": 0.385,
+ "p50Ms": 0.335,
+ "p95Ms": 0.539,
+ "maxMs": 0.539,
+ "mainThreadMs": 1.54,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 146.7,
+ "afterLoadMB": 159.7,
+ "afterInteractionMB": 177.5,
+ "afterCleanupMB": 173.6,
+ "peakMB": 177.5,
+ "loadDeltaMB": 13,
+ "interactionDeltaMB": 17.8,
+ "retainedAfterCleanupMB": 26.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 146.7,
+ "residentMB": 268.3,
+ "javaHeapMB": 12.1,
+ "nativeHeapMB": 94,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 159.7,
+ "residentMB": 302.5,
+ "javaHeapMB": 8.4,
+ "nativeHeapMB": 101.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 177.5,
+ "residentMB": 321.1,
+ "javaHeapMB": 11.5,
+ "nativeHeapMB": 107.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 173.6,
+ "residentMB": 317.3,
+ "javaHeapMB": 11.6,
+ "nativeHeapMB": 103,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 148464,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": {
+ "javaBytesAllocated": 7104192,
+ "gcCount": 1,
+ "gcTimeMs": 12,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 6602784
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 531,
+ "wallMs": 2948,
+ "percent": 18,
+ "threadsBefore": 56,
+ "threadsAfter": 56,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-1k",
+ "name": "1k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 1000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:26:00.594Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3801,
+ "load": {
+ "commitMs": 2.85,
+ "readyMs": 762,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 1.86,
+ "backgroundMs": 1.15,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.67,
+ "avgMs": 0.333,
+ "p50Ms": 0.007,
+ "p95Ms": 0.658,
+ "maxMs": 0.658,
+ "mainThreadMs": 0.67,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.114,
+ "p50Ms": 0.114,
+ "p95Ms": 0.114,
+ "maxMs": 0.114,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.47,
+ "avgMs": 0.469,
+ "p50Ms": 0.469,
+ "p95Ms": 0.469,
+ "maxMs": 0.469,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.19,
+ "avgMs": 0.095,
+ "p50Ms": 0.094,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.031,
+ "p50Ms": 0.016,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.04,
+ "p50Ms": 0.021,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.35,
+ "avgMs": 0.175,
+ "p50Ms": 0.138,
+ "p95Ms": 0.212,
+ "maxMs": 0.212,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.35,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.3,
+ "avgMs": 0.075,
+ "p50Ms": 0.026,
+ "p95Ms": 0.18,
+ "maxMs": 0.18,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.77,
+ "avgMs": 0.385,
+ "p50Ms": 0.007,
+ "p95Ms": 0.763,
+ "maxMs": 0.763,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 314856,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 175,
+ "durationMs": 2930.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.58,
+ "p50": 16.58,
+ "p95": 16.58,
+ "p99": 16.58,
+ "worst": 16.58
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.2,
+ "inputHandling": 0,
+ "animation": 8.4,
+ "layoutMeasure": 1.8,
+ "draw": 1,
+ "sync": 2.3,
+ "commandIssue": 14.8,
+ "swapBuffers": 66.4,
+ "gpu": 65.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 2.8,
+ "layoutMeasure": 0.6,
+ "draw": 0.3,
+ "sync": 0.8,
+ "commandIssue": 4.9,
+ "swapBuffers": 22,
+ "gpu": 21.8,
+ "total": 33.2
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 346,
+ "p50": 0.08,
+ "p95": 0.24,
+ "p99": 0.59,
+ "max": 5.09
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.97,
+ "max": 24.21
+ },
+ "lateFrames": 0,
+ "busyMs": 42.5,
+ "busyRatio": 0.0145,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 90,
+ "mainThreadMs": 3.67,
+ "backgroundMs": 4.16,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.01,
+ "avgMs": 0.253,
+ "p50Ms": 0.168,
+ "p95Ms": 0.44,
+ "maxMs": 0.44,
+ "mainThreadMs": 1.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.58,
+ "avgMs": 0.036,
+ "p50Ms": 0.028,
+ "p95Ms": 0.088,
+ "maxMs": 0.088,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 16000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.81,
+ "avgMs": 0.051,
+ "p50Ms": 0.021,
+ "p95Ms": 0.429,
+ "maxMs": 0.429,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.81,
+ "items": 252
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.61,
+ "avgMs": 0.038,
+ "p50Ms": 0.014,
+ "p95Ms": 0.346,
+ "maxMs": 0.346,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.61,
+ "items": 105
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 2.16,
+ "avgMs": 0.135,
+ "p50Ms": 0.086,
+ "p95Ms": 0.562,
+ "maxMs": 0.562,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.16,
+ "items": 252
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 2.01,
+ "avgMs": 0.125,
+ "p50Ms": 0.012,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 2.01,
+ "backgroundMs": 0,
+ "items": 10
+ },
+ "marker.visualProps": {
+ "count": 6,
+ "totalMs": 0.65,
+ "avgMs": 0.108,
+ "p50Ms": 0.05,
+ "p95Ms": 0.245,
+ "maxMs": 0.245,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 174.4,
+ "afterLoadMB": 185,
+ "afterInteractionMB": 179.9,
+ "afterCleanupMB": 176.1,
+ "peakMB": 185,
+ "loadDeltaMB": 10.6,
+ "interactionDeltaMB": -5.1,
+ "retainedAfterCleanupMB": 1.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 174.4,
+ "residentMB": 318.1,
+ "javaHeapMB": 11.7,
+ "nativeHeapMB": 103.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 185,
+ "residentMB": 329.2,
+ "javaHeapMB": 10.2,
+ "nativeHeapMB": 124.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 179.9,
+ "residentMB": 324.5,
+ "javaHeapMB": 11.9,
+ "nativeHeapMB": 117.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 176.1,
+ "residentMB": 321.3,
+ "javaHeapMB": 12,
+ "nativeHeapMB": 113.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 160880,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": {
+ "javaBytesAllocated": 4390896,
+ "gcCount": 1,
+ "gcTimeMs": 15,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -6976832
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 578,
+ "wallMs": 2935,
+ "percent": 19.7,
+ "threadsBefore": 59,
+ "threadsAfter": 58,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-10k",
+ "name": "10k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 10000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:26:08.127Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3781,
+ "load": {
+ "commitMs": 11.96,
+ "readyMs": 763,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 6.14,
+ "backgroundMs": 3.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 2.63,
+ "avgMs": 1.315,
+ "p50Ms": 0.001,
+ "p95Ms": 2.63,
+ "maxMs": 2.63,
+ "mainThreadMs": 2.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.45,
+ "avgMs": 0.446,
+ "p50Ms": 0.446,
+ "p95Ms": 0.446,
+ "maxMs": 0.446,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 3.14,
+ "avgMs": 3.139,
+ "p50Ms": 3.139,
+ "p95Ms": 3.139,
+ "maxMs": 3.139,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.14,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.12,
+ "avgMs": 0.058,
+ "p50Ms": 0.02,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.053,
+ "p50Ms": 0.048,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.023,
+ "p50Ms": 0.016,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.28,
+ "avgMs": 0.139,
+ "p50Ms": 0.105,
+ "p95Ms": 0.174,
+ "maxMs": 0.174,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.28,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 1.12,
+ "avgMs": 0.018,
+ "p50Ms": 0.006,
+ "p95Ms": 0.015,
+ "maxMs": 0.563,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.94,
+ "avgMs": 0.969,
+ "p50Ms": 0.005,
+ "p95Ms": 1.932,
+ "maxMs": 1.932,
+ "mainThreadMs": 1.94,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0051092080000000005,
+ "allocatedBytes": 2718864,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 175,
+ "durationMs": 2927.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 30.71,
+ "p50": 30.71,
+ "p95": 30.71,
+ "p99": 30.71,
+ "worst": 30.71
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 3.3,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1,
+ "swapBuffers": 93.2,
+ "gpu": 92.4
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 2,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 0.6,
+ "swapBuffers": 57.2,
+ "gpu": 56.8,
+ "total": 61.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 344,
+ "p50": 0.08,
+ "p95": 0.21,
+ "p99": 0.45,
+ "max": 3.79
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.3,
+ "max": 20.88
+ },
+ "lateFrames": 0,
+ "busyMs": 39.8,
+ "busyRatio": 0.0136,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2928.6,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 154,
+ "mainThreadMs": 7.62,
+ "backgroundMs": 6.41,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.73,
+ "avgMs": 0.183,
+ "p50Ms": 0.156,
+ "p95Ms": 0.249,
+ "maxMs": 0.249,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.67,
+ "avgMs": 0.042,
+ "p50Ms": 0.032,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.67,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 1.83,
+ "avgMs": 0.114,
+ "p50Ms": 0.092,
+ "p95Ms": 0.341,
+ "maxMs": 0.341,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.83,
+ "items": 2237
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.59,
+ "avgMs": 0.037,
+ "p50Ms": 0.032,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 1328
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 3.32,
+ "avgMs": 0.207,
+ "p50Ms": 0.176,
+ "p95Ms": 0.433,
+ "maxMs": 0.433,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.32,
+ "items": 2237
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 5.57,
+ "avgMs": 0.348,
+ "p50Ms": 0.187,
+ "p95Ms": 2.202,
+ "maxMs": 2.202,
+ "mainThreadMs": 5.57,
+ "backgroundMs": 0,
+ "items": 119
+ },
+ "marker.visualProps": {
+ "count": 70,
+ "totalMs": 1.32,
+ "avgMs": 0.019,
+ "p50Ms": 0.01,
+ "p95Ms": 0.088,
+ "maxMs": 0.111,
+ "mainThreadMs": 1.32,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 176.3,
+ "afterLoadMB": 201.5,
+ "afterInteractionMB": 199.5,
+ "afterCleanupMB": 195.7,
+ "peakMB": 201.5,
+ "loadDeltaMB": 25.2,
+ "interactionDeltaMB": -2,
+ "retainedAfterCleanupMB": 19.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 176.3,
+ "residentMB": 321.4,
+ "javaHeapMB": 12.1,
+ "nativeHeapMB": 113.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 201.5,
+ "residentMB": 346.8,
+ "javaHeapMB": 12.6,
+ "nativeHeapMB": 136.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 199.5,
+ "residentMB": 345.1,
+ "javaHeapMB": 15.1,
+ "nativeHeapMB": 132.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 195.7,
+ "residentMB": 341.4,
+ "javaHeapMB": 15.3,
+ "nativeHeapMB": 128,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 178328,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": {
+ "javaBytesAllocated": 6536688,
+ "gcCount": 1,
+ "gcTimeMs": 34,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -4379376
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 653,
+ "wallMs": 2938,
+ "percent": 22.2,
+ "threadsBefore": 61,
+ "threadsAfter": 61,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-50k",
+ "name": "50k markers",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 50000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:26:17.354Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3797,
+ "load": {
+ "commitMs": 44.06,
+ "readyMs": 832,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 335,
+ "mainThreadMs": 20.95,
+ "backgroundMs": 5.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 10.17,
+ "avgMs": 5.086,
+ "p50Ms": 0.001,
+ "p95Ms": 10.172,
+ "maxMs": 10.172,
+ "mainThreadMs": 10.17,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.227,
+ "p50Ms": 0.227,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 3.16,
+ "avgMs": 3.16,
+ "p50Ms": 3.16,
+ "p95Ms": 3.16,
+ "maxMs": 3.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.16,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.053,
+ "p50Ms": 0.019,
+ "p95Ms": 0.086,
+ "maxMs": 0.086,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 100000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.77,
+ "avgMs": 0.385,
+ "p50Ms": 0.185,
+ "p95Ms": 0.585,
+ "maxMs": 0.585,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.77,
+ "items": 826
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.14,
+ "avgMs": 0.071,
+ "p50Ms": 0.068,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 626
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 1.04,
+ "avgMs": 0.518,
+ "p50Ms": 0.281,
+ "p95Ms": 0.755,
+ "maxMs": 0.755,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.04,
+ "items": 826
+ },
+ "marker.visualProps": {
+ "count": 313,
+ "totalMs": 2.44,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.301,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 8.1,
+ "avgMs": 4.051,
+ "p50Ms": 0.005,
+ "p95Ms": 8.097,
+ "maxMs": 8.097,
+ "mainThreadMs": 8.1,
+ "backgroundMs": 0,
+ "items": 313
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.008974793000000002,
+ "allocatedBytes": 13886000,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 173,
+ "durationMs": 2932.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.3,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.86,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 50,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 172,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0058,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 103.66,
+ "p50": 103.66,
+ "p95": 103.66,
+ "p99": 103.66,
+ "worst": 103.66
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0.8,
+ "inputHandling": 0,
+ "animation": 4.2,
+ "layoutMeasure": 0.8,
+ "draw": 1.1,
+ "sync": 1.4,
+ "commandIssue": 4.6,
+ "swapBuffers": 86.6,
+ "gpu": 86.4
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 8.6,
+ "layoutMeasure": 1.6,
+ "draw": 2.3,
+ "sync": 2.9,
+ "commandIssue": 9.4,
+ "swapBuffers": 179.5,
+ "gpu": 179.2,
+ "total": 207.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 345,
+ "p50": 0.08,
+ "p95": 0.23,
+ "p99": 0.36,
+ "max": 2.02
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 18,
+ "max": 48.71
+ },
+ "lateFrames": 1,
+ "busyMs": 36.8,
+ "busyRatio": 0.0125,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2934.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 504,
+ "mainThreadMs": 28.77,
+ "backgroundMs": 33.27,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 4.96,
+ "avgMs": 1.24,
+ "p50Ms": 0.137,
+ "p95Ms": 4.564,
+ "maxMs": 4.564,
+ "mainThreadMs": 4.96,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.78,
+ "avgMs": 0.049,
+ "p50Ms": 0.033,
+ "p95Ms": 0.224,
+ "maxMs": 0.224,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 800000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 13.49,
+ "avgMs": 0.843,
+ "p50Ms": 0.316,
+ "p95Ms": 4.897,
+ "maxMs": 4.897,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.49,
+ "items": 11219
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 2.24,
+ "avgMs": 0.14,
+ "p50Ms": 0.122,
+ "p95Ms": 0.411,
+ "maxMs": 0.411,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.24,
+ "items": 6678
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 16.75,
+ "avgMs": 1.047,
+ "p50Ms": 0.501,
+ "p95Ms": 5.362,
+ "maxMs": 5.362,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.75,
+ "items": 11219
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 20.58,
+ "avgMs": 1.286,
+ "p50Ms": 0.555,
+ "p95Ms": 8.717,
+ "maxMs": 8.717,
+ "mainThreadMs": 20.58,
+ "backgroundMs": 0,
+ "items": 723
+ },
+ "marker.visualProps": {
+ "count": 420,
+ "totalMs": 3.23,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.019,
+ "maxMs": 0.107,
+ "mainThreadMs": 3.23,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 195.9,
+ "afterLoadMB": 259.3,
+ "afterInteractionMB": 252.5,
+ "afterCleanupMB": 248.7,
+ "peakMB": 259.3,
+ "loadDeltaMB": 63.4,
+ "interactionDeltaMB": -6.8,
+ "retainedAfterCleanupMB": 52.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 195.9,
+ "residentMB": 341.6,
+ "javaHeapMB": 15.4,
+ "nativeHeapMB": 128.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 259.3,
+ "residentMB": 404.9,
+ "javaHeapMB": 21.6,
+ "nativeHeapMB": 177.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 252.5,
+ "residentMB": 398.4,
+ "javaHeapMB": 27.5,
+ "nativeHeapMB": 164.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 248.7,
+ "residentMB": 394.7,
+ "javaHeapMB": 27.6,
+ "nativeHeapMB": 160,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 254872,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 15391920,
+ "gcCount": 2,
+ "gcTimeMs": 83,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -13411728
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1156,
+ "wallMs": 2977,
+ "percent": 38.8,
+ "threadsBefore": 64,
+ "threadsAfter": 64,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-children-1k",
+ "name": "1k children",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 1000 markers as children (collected from React children on every render), then a short pan.",
+ "recordedAt": "2026-09-10T14:26:24.402Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3792,
+ "load": {
+ "commitMs": 3.52,
+ "readyMs": 791,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 4.71,
+ "backgroundMs": 6.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.33,
+ "avgMs": 0.164,
+ "p50Ms": 0.001,
+ "p95Ms": 0.328,
+ "maxMs": 0.328,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.07,
+ "avgMs": 0.033,
+ "p50Ms": 0,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.117,
+ "p50Ms": 0.117,
+ "p95Ms": 0.117,
+ "maxMs": 0.117,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 2,
+ "avgMs": 2.001,
+ "p50Ms": 2.001,
+ "p95Ms": 2.001,
+ "maxMs": 2.001,
+ "mainThreadMs": 2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.048,
+ "p50Ms": 0.039,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 2.99,
+ "avgMs": 1.493,
+ "p50Ms": 0.021,
+ "p95Ms": 2.966,
+ "maxMs": 2.966,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.99,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.019,
+ "p50Ms": 0.006,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 3.16,
+ "avgMs": 1.578,
+ "p50Ms": 0.078,
+ "p95Ms": 3.077,
+ "maxMs": 3.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.16,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.61,
+ "avgMs": 0.154,
+ "p50Ms": 0.013,
+ "p95Ms": 0.574,
+ "maxMs": 0.574,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.7,
+ "avgMs": 0.85,
+ "p50Ms": 0.004,
+ "p95Ms": 1.696,
+ "maxMs": 1.696,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 884264,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 175,
+ "durationMs": 2929.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 175,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 56.6,
+ "p50": 56.6,
+ "p95": 56.6,
+ "p99": 56.6,
+ "worst": 56.6
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 9.4,
+ "layoutMeasure": 1.6,
+ "draw": 2.3,
+ "sync": 0.3,
+ "commandIssue": 2.4,
+ "swapBuffers": 55.9,
+ "gpu": 82.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.9,
+ "inputHandling": 0,
+ "animation": 10.6,
+ "layoutMeasure": 1.8,
+ "draw": 2.6,
+ "sync": 0.4,
+ "commandIssue": 2.8,
+ "swapBuffers": 63.3,
+ "gpu": 93,
+ "total": 113.2
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 348,
+ "p50": 0.08,
+ "p95": 0.27,
+ "p99": 1.43,
+ "max": 1.68
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.7,
+ "max": 21.37
+ },
+ "lateFrames": 0,
+ "busyMs": 44.2,
+ "busyRatio": 0.0151,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 100,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 3.68,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.64,
+ "avgMs": 0.16,
+ "p50Ms": 0.165,
+ "p95Ms": 0.19,
+ "maxMs": 0.19,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 17,
+ "totalMs": 0.51,
+ "avgMs": 0.03,
+ "p50Ms": 0.024,
+ "p95Ms": 0.075,
+ "maxMs": 0.075,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 17000
+ },
+ "markers.viewportFilter": {
+ "count": 17,
+ "totalMs": 0.45,
+ "avgMs": 0.026,
+ "p50Ms": 0.023,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 272
+ },
+ "markers.diff": {
+ "count": 17,
+ "totalMs": 0.84,
+ "avgMs": 0.05,
+ "p50Ms": 0.008,
+ "p95Ms": 0.665,
+ "maxMs": 0.665,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.84,
+ "items": 113
+ },
+ "markers.viewportCompute": {
+ "count": 17,
+ "totalMs": 1.88,
+ "avgMs": 0.11,
+ "p50Ms": 0.059,
+ "p95Ms": 0.723,
+ "maxMs": 0.723,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.88,
+ "items": 272
+ },
+ "markers.applyDiff": {
+ "count": 17,
+ "totalMs": 1.29,
+ "avgMs": 0.076,
+ "p50Ms": 0.004,
+ "p95Ms": 0.529,
+ "maxMs": 0.529,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.35,
+ "p50Ms": 0.35,
+ "p95Ms": 0.35,
+ "maxMs": 0.35,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.36,
+ "p50Ms": 0.36,
+ "p95Ms": 0.36,
+ "maxMs": 0.36,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.111,
+ "p50Ms": 0.111,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "marker.visualProps": {
+ "count": 6,
+ "totalMs": 0.21,
+ "avgMs": 0.035,
+ "p50Ms": 0.023,
+ "p95Ms": 0.094,
+ "maxMs": 0.094,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 248.8,
+ "afterLoadMB": 276.1,
+ "afterInteractionMB": 240.4,
+ "afterCleanupMB": 236.4,
+ "peakMB": 276.1,
+ "loadDeltaMB": 27.3,
+ "interactionDeltaMB": -35.7,
+ "retainedAfterCleanupMB": -12.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 248.8,
+ "residentMB": 394.7,
+ "javaHeapMB": 27.8,
+ "nativeHeapMB": 160.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 276.1,
+ "residentMB": 422.1,
+ "javaHeapMB": 20.8,
+ "nativeHeapMB": 194.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 240.4,
+ "residentMB": 386.4,
+ "javaHeapMB": 22.1,
+ "nativeHeapMB": 157.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 236.4,
+ "residentMB": 382.4,
+ "javaHeapMB": 22.3,
+ "nativeHeapMB": 153,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 160632,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 4669792,
+ "gcCount": 1,
+ "gcTimeMs": 85,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -38770880
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 735,
+ "wallMs": 2938,
+ "percent": 25,
+ "threadsBefore": 67,
+ "threadsAfter": 67,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 1,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "markers-10k-rich",
+ "name": "10k markers with titles and visual props",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Same as markers-10k but every descriptor carries title, subtitle, rotation, opacity, anchor and flat, to measure optional-field conversion cost.",
+ "recordedAt": "2026-09-10T14:26:31.996Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3796,
+ "load": {
+ "commitMs": 11.4,
+ "readyMs": 773,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 92,
+ "mainThreadMs": 5.68,
+ "backgroundMs": 1.11,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 3.28,
+ "avgMs": 1.642,
+ "p50Ms": 0,
+ "p95Ms": 3.284,
+ "maxMs": 3.284,
+ "mainThreadMs": 3.28,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.136,
+ "p50Ms": 0.136,
+ "p95Ms": 0.136,
+ "maxMs": 0.136,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.586,
+ "p50Ms": 0.586,
+ "p95Ms": 0.586,
+ "maxMs": 0.586,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.04,
+ "p50Ms": 0.02,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.05,
+ "p95Ms": 0.08,
+ "maxMs": 0.08,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 170
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.016,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 140
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.27,
+ "avgMs": 0.134,
+ "p50Ms": 0.089,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 170
+ },
+ "marker.visualProps": {
+ "count": 70,
+ "totalMs": 0.57,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.013,
+ "maxMs": 0.15,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.69,
+ "avgMs": 0.845,
+ "p50Ms": 0.003,
+ "p95Ms": 1.686,
+ "maxMs": 1.686,
+ "mainThreadMs": 1.69,
+ "backgroundMs": 0,
+ "items": 70
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.027060249999999997,
+ "allocatedBytes": 5468072,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 176,
+ "durationMs": 2938.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 176,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.15,
+ "p50": 17.15,
+ "p95": 17.15,
+ "p99": 17.15,
+ "worst": 17.15
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3,
+ "inputHandling": 0,
+ "animation": 7.3,
+ "layoutMeasure": 0.4,
+ "draw": 0.6,
+ "sync": 0.4,
+ "commandIssue": 2.7,
+ "swapBuffers": 40.9,
+ "gpu": 85.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 2.5,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 0.9,
+ "swapBuffers": 14,
+ "gpu": 29.2,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 349,
+ "p50": 0.07,
+ "p95": 0.18,
+ "p99": 0.3,
+ "max": 0.44
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 17.5,
+ "max": 17.91
+ },
+ "lateFrames": 0,
+ "busyMs": 30.6,
+ "busyRatio": 0.0104,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2940.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 166,
+ "mainThreadMs": 4.21,
+ "backgroundMs": 6,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.72,
+ "avgMs": 0.181,
+ "p50Ms": 0.198,
+ "p95Ms": 0.213,
+ "maxMs": 0.213,
+ "mainThreadMs": 0.72,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.37,
+ "avgMs": 0.023,
+ "p50Ms": 0.021,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 2.15,
+ "avgMs": 0.134,
+ "p50Ms": 0.089,
+ "p95Ms": 0.769,
+ "maxMs": 0.769,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.15,
+ "items": 2477
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.45,
+ "avgMs": 0.028,
+ "p50Ms": 0.023,
+ "p95Ms": 0.114,
+ "maxMs": 0.114,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 1426
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 3.03,
+ "avgMs": 0.189,
+ "p50Ms": 0.139,
+ "p95Ms": 0.818,
+ "maxMs": 0.818,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.03,
+ "items": 2477
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 2.68,
+ "avgMs": 0.168,
+ "p50Ms": 0.134,
+ "p95Ms": 0.566,
+ "maxMs": 0.566,
+ "mainThreadMs": 2.68,
+ "backgroundMs": 0,
+ "items": 145
+ },
+ "marker.visualProps": {
+ "count": 82,
+ "totalMs": 0.8,
+ "avgMs": 0.01,
+ "p50Ms": 0.006,
+ "p95Ms": 0.021,
+ "maxMs": 0.055,
+ "mainThreadMs": 0.8,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 236.6,
+ "afterLoadMB": 199.8,
+ "afterInteractionMB": 253.4,
+ "afterCleanupMB": 249.4,
+ "peakMB": 253.4,
+ "loadDeltaMB": -36.8,
+ "interactionDeltaMB": 53.6,
+ "retainedAfterCleanupMB": 12.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 236.6,
+ "residentMB": 382.5,
+ "javaHeapMB": 22.4,
+ "nativeHeapMB": 153.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 199.8,
+ "residentMB": 345.8,
+ "javaHeapMB": 23.8,
+ "nativeHeapMB": 111,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 253.4,
+ "residentMB": 399.5,
+ "javaHeapMB": 29.7,
+ "nativeHeapMB": 159.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 249.4,
+ "residentMB": 395.6,
+ "javaHeapMB": 29.8,
+ "nativeHeapMB": 155,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 180056,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 6123184,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 50977808
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 419,
+ "wallMs": 2945,
+ "percent": 14.2,
+ "threadsBefore": 71,
+ "threadsAfter": 71,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-0",
+ "name": "Camera fast-pan, 0 markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 0 markers.",
+ "recordedAt": "2026-09-10T14:26:39.011Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4565,
+ "load": {
+ "commitMs": 1.73,
+ "readyMs": 782,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 30976,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 223,
+ "durationMs": 3727.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 223,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 10.97,
+ "p50": 10.97,
+ "p95": 10.97,
+ "p99": 10.97,
+ "worst": 10.97
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.2,
+ "inputHandling": 0,
+ "animation": 8,
+ "layoutMeasure": 2.6,
+ "draw": 2.9,
+ "sync": 2.5,
+ "commandIssue": 14.4,
+ "swapBuffers": 64.8,
+ "gpu": 64.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 1.8,
+ "layoutMeasure": 0.6,
+ "draw": 0.6,
+ "sync": 0.5,
+ "commandIssue": 3.2,
+ "swapBuffers": 14.2,
+ "gpu": 14.1,
+ "total": 21.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 441,
+ "p50": 0.07,
+ "p95": 0.21,
+ "p99": 0.53,
+ "max": 2.12
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 17.68,
+ "max": 18.49
+ },
+ "lateFrames": 0,
+ "busyMs": 42.9,
+ "busyRatio": 0.0115,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3728.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 0.88,
+ "avgMs": 0.126,
+ "p50Ms": 0.12,
+ "p95Ms": 0.188,
+ "maxMs": 0.188,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 249.8,
+ "afterLoadMB": 233.7,
+ "afterInteractionMB": 267.1,
+ "afterCleanupMB": 268.7,
+ "peakMB": 268.7,
+ "loadDeltaMB": -16.1,
+ "interactionDeltaMB": 33.4,
+ "retainedAfterCleanupMB": 18.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 249.8,
+ "residentMB": 396,
+ "javaHeapMB": 29.9,
+ "nativeHeapMB": 155.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 233.7,
+ "residentMB": 379.6,
+ "javaHeapMB": 24.1,
+ "nativeHeapMB": 145,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 267.1,
+ "residentMB": 413.3,
+ "javaHeapMB": 33.6,
+ "nativeHeapMB": 169.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 268.7,
+ "residentMB": 414.9,
+ "javaHeapMB": 39.3,
+ "nativeHeapMB": 164.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 171160,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 14046704,
+ "gcCount": 1,
+ "gcTimeMs": 32,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 25697488
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 625,
+ "wallMs": 3732,
+ "percent": 16.7,
+ "threadsBefore": 73,
+ "threadsAfter": 75,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "region": 1
+ },
+ "payload": {},
+ "largestUpdate": {},
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-1k",
+ "name": "Camera fast-pan, 1k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 1000 markers.",
+ "recordedAt": "2026-09-10T14:26:46.033Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4584,
+ "load": {
+ "commitMs": 2.37,
+ "readyMs": 761,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0.31,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.042,
+ "p50Ms": 0,
+ "p95Ms": 0.083,
+ "maxMs": 0.083,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.016,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.012,
+ "p50Ms": 0.009,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.008,
+ "p50Ms": 0.007,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.09,
+ "avgMs": 0.047,
+ "p50Ms": 0.032,
+ "p95Ms": 0.061,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.14,
+ "avgMs": 0.034,
+ "p50Ms": 0.005,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.47,
+ "avgMs": 0.233,
+ "p50Ms": 0.003,
+ "p95Ms": 0.464,
+ "maxMs": 0.464,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 316624,
+ "heapSizeAfterBytes": 20971520
+ }
+ },
+ "frames": {
+ "frames": 222,
+ "durationMs": 3724.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.7,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.74,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 221,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0045,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.74,
+ "p50": 17.74,
+ "p95": 17.74,
+ "p99": 17.74,
+ "worst": 17.74
+ },
+ "phaseSharePct": {
+ "unknownDelay": 7.5,
+ "inputHandling": 0,
+ "animation": 5.6,
+ "layoutMeasure": 0.3,
+ "draw": 0.7,
+ "sync": 0.5,
+ "commandIssue": 3.8,
+ "swapBuffers": 26,
+ "gpu": 81.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.7,
+ "inputHandling": 0,
+ "animation": 2,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.3,
+ "swapBuffers": 9.2,
+ "gpu": 28.8,
+ "total": 35.5
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 441,
+ "p50": 0.07,
+ "p95": 0.23,
+ "p99": 0.72,
+ "max": 5.99
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.48,
+ "max": 45.45
+ },
+ "lateFrames": 2,
+ "busyMs": 48.9,
+ "busyRatio": 0.0131,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3726.1,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 148,
+ "mainThreadMs": 3.36,
+ "backgroundMs": 2.39,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 1.12,
+ "avgMs": 0.159,
+ "p50Ms": 0.157,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 23,
+ "totalMs": 0.52,
+ "avgMs": 0.023,
+ "p50Ms": 0.019,
+ "p95Ms": 0.041,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 23000
+ },
+ "markers.viewportFilter": {
+ "count": 23,
+ "totalMs": 0.42,
+ "avgMs": 0.018,
+ "p50Ms": 0.017,
+ "p95Ms": 0.027,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.42,
+ "items": 358
+ },
+ "markers.diff": {
+ "count": 23,
+ "totalMs": 0.22,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.016,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 188
+ },
+ "markers.viewportCompute": {
+ "count": 23,
+ "totalMs": 1.23,
+ "avgMs": 0.054,
+ "p50Ms": 0.049,
+ "p95Ms": 0.083,
+ "maxMs": 0.115,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 358
+ },
+ "markers.applyDiff": {
+ "count": 22,
+ "totalMs": 1.86,
+ "avgMs": 0.085,
+ "p50Ms": 0.098,
+ "p95Ms": 0.247,
+ "maxMs": 0.251,
+ "mainThreadMs": 1.86,
+ "backgroundMs": 0,
+ "items": 52
+ },
+ "marker.visualProps": {
+ "count": 27,
+ "totalMs": 0.39,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.028,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 268.9,
+ "afterLoadMB": 255.1,
+ "afterInteractionMB": 291.1,
+ "afterCleanupMB": 287.5,
+ "peakMB": 291.1,
+ "loadDeltaMB": -13.8,
+ "interactionDeltaMB": 36,
+ "retainedAfterCleanupMB": 18.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 268.9,
+ "residentMB": 415.1,
+ "javaHeapMB": 39.5,
+ "nativeHeapMB": 165,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 255.1,
+ "residentMB": 401.1,
+ "javaHeapMB": 26.8,
+ "nativeHeapMB": 163.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 291.1,
+ "residentMB": 437.4,
+ "javaHeapMB": 31.7,
+ "nativeHeapMB": 195.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 287.5,
+ "residentMB": 434,
+ "javaHeapMB": 31.9,
+ "nativeHeapMB": 191,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 211064,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 20
+ },
+ "android": {
+ "javaBytesAllocated": 11858112,
+ "gcCount": 1,
+ "gcTimeMs": 30,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 32925520
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 712,
+ "wallMs": 3730,
+ "percent": 19.1,
+ "threadsBefore": 77,
+ "threadsAfter": 77,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-idle-10k",
+ "name": "Camera idle, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "No camera movement for 5 s; measures the resting cost of the scene. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:26:55.631Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5850,
+ "load": {
+ "commitMs": 11.75,
+ "readyMs": 760,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.68,
+ "backgroundMs": 0.86,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.26,
+ "avgMs": 0.631,
+ "p50Ms": 0.001,
+ "p95Ms": 1.261,
+ "maxMs": 1.261,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.059,
+ "p50Ms": 0.059,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.5,
+ "avgMs": 0.505,
+ "p50Ms": 0.505,
+ "p95Ms": 0.505,
+ "maxMs": 0.505,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.5,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.018,
+ "p50Ms": 0.015,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.051,
+ "p50Ms": 0.031,
+ "p95Ms": 0.071,
+ "maxMs": 0.071,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.019,
+ "p50Ms": 0.015,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.18,
+ "avgMs": 0.09,
+ "p50Ms": 0.078,
+ "p95Ms": 0.103,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.79,
+ "avgMs": 0.012,
+ "p50Ms": 0.005,
+ "p95Ms": 0.022,
+ "maxMs": 0.254,
+ "mainThreadMs": 0.79,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.57,
+ "avgMs": 0.783,
+ "p50Ms": 0.004,
+ "p95Ms": 1.561,
+ "maxMs": 1.561,
+ "mainThreadMs": 1.57,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.006446832999999999,
+ "allocatedBytes": 2720392,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 300,
+ "durationMs": 5007.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 300,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.03,
+ "p50": 17.03,
+ "p95": 17.03,
+ "p99": 17.03,
+ "worst": 17.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.7,
+ "inputHandling": 0,
+ "animation": 2.6,
+ "layoutMeasure": 0.3,
+ "draw": 0.4,
+ "sync": 0.6,
+ "commandIssue": 3.5,
+ "swapBuffers": 41.3,
+ "gpu": 89.6
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 0.9,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.2,
+ "commandIssue": 1.2,
+ "swapBuffers": 14.1,
+ "gpu": 30.5,
+ "total": 34.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 554,
+ "p50": 0.16,
+ "p95": 0.55,
+ "p99": 0.96,
+ "max": 2.03
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 18.97,
+ "max": 22.7
+ },
+ "lateFrames": 0,
+ "busyMs": 113.7,
+ "busyRatio": 0.0227,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5008.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "byName": {}
+ },
+ "memory": {
+ "beforeMB": 287.7,
+ "afterLoadMB": 266.7,
+ "afterInteractionMB": 270.3,
+ "afterCleanupMB": 266.3,
+ "peakMB": 287.7,
+ "loadDeltaMB": -21,
+ "interactionDeltaMB": 3.6,
+ "retainedAfterCleanupMB": -21.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 287.7,
+ "residentMB": 434.1,
+ "javaHeapMB": 32,
+ "nativeHeapMB": 191.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 266.7,
+ "residentMB": 413,
+ "javaHeapMB": 30.3,
+ "nativeHeapMB": 169.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 270.3,
+ "residentMB": 416.5,
+ "javaHeapMB": 31.1,
+ "nativeHeapMB": 173.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 266.3,
+ "residentMB": 412.8,
+ "javaHeapMB": 31.2,
+ "nativeHeapMB": 168.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 214008,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": {
+ "javaBytesAllocated": 811104,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 3526592
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 267,
+ "wallMs": 5013,
+ "percent": 5.3,
+ "threadsBefore": 80,
+ "threadsAfter": 77,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-slow-pan-10k",
+ "name": "Camera slow-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four slow animated pan legs (1.2 s each, small steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:06.880Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7529,
+ "load": {
+ "commitMs": 13.29,
+ "readyMs": 735,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.72,
+ "backgroundMs": 0.8,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.99,
+ "avgMs": 0.495,
+ "p50Ms": 0,
+ "p95Ms": 0.99,
+ "maxMs": 0.99,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.098,
+ "p50Ms": 0.098,
+ "p95Ms": 0.098,
+ "maxMs": 0.098,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.323,
+ "p50Ms": 0.323,
+ "p95Ms": 0.323,
+ "maxMs": 0.323,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.051,
+ "p50Ms": 0.028,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.049,
+ "p50Ms": 0.026,
+ "p95Ms": 0.071,
+ "maxMs": 0.071,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.24,
+ "avgMs": 0.121,
+ "p50Ms": 0.071,
+ "p95Ms": 0.172,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.47,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.16,
+ "avgMs": 0.58,
+ "p50Ms": 0.003,
+ "p95Ms": 1.157,
+ "maxMs": 1.157,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002820749999999997,
+ "allocatedBytes": 2720032,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 400,
+ "durationMs": 6671.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 400,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 12.88,
+ "p50": 12.88,
+ "p95": 12.88,
+ "p99": 12.88,
+ "worst": 12.88
+ },
+ "phaseSharePct": {
+ "unknownDelay": 8.3,
+ "inputHandling": 0,
+ "animation": 4.8,
+ "layoutMeasure": 0.9,
+ "draw": 0.6,
+ "sync": 0.6,
+ "commandIssue": 5.2,
+ "swapBuffers": 78.7,
+ "gpu": 78.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.1,
+ "inputHandling": 0,
+ "animation": 1.2,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.3,
+ "swapBuffers": 20.3,
+ "gpu": 20.2,
+ "total": 25.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 791,
+ "p50": 0.07,
+ "p95": 0.19,
+ "p99": 0.41,
+ "max": 6.4
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.28,
+ "max": 23.04
+ },
+ "lateFrames": 0,
+ "busyMs": 78.6,
+ "busyRatio": 0.0118,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6672.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 255,
+ "mainThreadMs": 6.04,
+ "backgroundMs": 8.94,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.84,
+ "avgMs": 0.168,
+ "p50Ms": 0.122,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.96,
+ "avgMs": 0.027,
+ "p50Ms": 0.022,
+ "p95Ms": 0.062,
+ "maxMs": 0.133,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 350000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 2.61,
+ "avgMs": 0.075,
+ "p50Ms": 0.076,
+ "p95Ms": 0.107,
+ "maxMs": 0.136,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.61,
+ "items": 4921
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.84,
+ "avgMs": 0.024,
+ "p50Ms": 0.022,
+ "p95Ms": 0.037,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.84,
+ "items": 2900
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 4.52,
+ "avgMs": 0.129,
+ "p50Ms": 0.122,
+ "p95Ms": 0.214,
+ "maxMs": 0.256,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.52,
+ "items": 4921
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 4.42,
+ "avgMs": 0.126,
+ "p50Ms": 0.106,
+ "p95Ms": 0.466,
+ "maxMs": 0.873,
+ "mainThreadMs": 4.42,
+ "backgroundMs": 0,
+ "items": 129
+ },
+ "marker.visualProps": {
+ "count": 75,
+ "totalMs": 0.78,
+ "avgMs": 0.01,
+ "p50Ms": 0.007,
+ "p95Ms": 0.024,
+ "maxMs": 0.027,
+ "mainThreadMs": 0.78,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 266.5,
+ "afterLoadMB": 239.5,
+ "afterInteractionMB": 220.3,
+ "afterCleanupMB": 216.5,
+ "peakMB": 266.5,
+ "loadDeltaMB": -27,
+ "interactionDeltaMB": -19.2,
+ "retainedAfterCleanupMB": -50,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 266.5,
+ "residentMB": 413,
+ "javaHeapMB": 31.4,
+ "nativeHeapMB": 168.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 239.5,
+ "residentMB": 386,
+ "javaHeapMB": 30.5,
+ "nativeHeapMB": 140.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 220.3,
+ "residentMB": 366.9,
+ "javaHeapMB": 32.8,
+ "nativeHeapMB": 119.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 216.5,
+ "residentMB": 362.9,
+ "javaHeapMB": 32.9,
+ "nativeHeapMB": 114.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 357168,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": {
+ "javaBytesAllocated": 13132944,
+ "gcCount": 1,
+ "gcTimeMs": 48,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -22596064
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 946,
+ "wallMs": 6679,
+ "percent": 14.2,
+ "threadsBefore": 80,
+ "threadsAfter": 80,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-10k",
+ "name": "Camera fast-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:15.246Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4592,
+ "load": {
+ "commitMs": 13.95,
+ "readyMs": 782,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 5.4,
+ "backgroundMs": 1.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 2.25,
+ "avgMs": 1.126,
+ "p50Ms": 0,
+ "p95Ms": 2.252,
+ "maxMs": 2.252,
+ "mainThreadMs": 2.25,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.104,
+ "p50Ms": 0.104,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.42,
+ "avgMs": 0.42,
+ "p50Ms": 0.42,
+ "p95Ms": 0.42,
+ "maxMs": 0.42,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.42,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.014,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.21,
+ "avgMs": 0.105,
+ "p50Ms": 0.035,
+ "p95Ms": 0.174,
+ "maxMs": 0.174,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.37,
+ "avgMs": 0.187,
+ "p50Ms": 0.063,
+ "p95Ms": 0.312,
+ "maxMs": 0.312,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.68,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.016,
+ "maxMs": 0.16,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 2.36,
+ "avgMs": 1.18,
+ "p50Ms": 0.003,
+ "p95Ms": 2.357,
+ "maxMs": 2.357,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2720080,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 224,
+ "durationMs": 3735.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 224,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.15,
+ "p50": 17.15,
+ "p95": 17.15,
+ "p99": 17.15,
+ "worst": 17.15
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.8,
+ "inputHandling": 0,
+ "animation": 3,
+ "layoutMeasure": 0.5,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 3.8,
+ "swapBuffers": 73.7,
+ "gpu": 87.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 1,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.1,
+ "commandIssue": 1.3,
+ "swapBuffers": 25.3,
+ "gpu": 29.9,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 444,
+ "p50": 0.07,
+ "p95": 0.17,
+ "p99": 0.42,
+ "max": 2.68
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.47,
+ "max": 22.49
+ },
+ "lateFrames": 0,
+ "busyMs": 41.3,
+ "busyRatio": 0.0111,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3736.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 349,
+ "mainThreadMs": 9.23,
+ "backgroundMs": 5.07,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 0.88,
+ "avgMs": 0.126,
+ "p50Ms": 0.098,
+ "p95Ms": 0.233,
+ "maxMs": 0.233,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 0.53,
+ "avgMs": 0.025,
+ "p50Ms": 0.021,
+ "p95Ms": 0.045,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 210000
+ },
+ "markers.viewportFilter": {
+ "count": 21,
+ "totalMs": 1.52,
+ "avgMs": 0.072,
+ "p50Ms": 0.061,
+ "p95Ms": 0.13,
+ "maxMs": 0.138,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.52,
+ "items": 2984
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.45,
+ "avgMs": 0.021,
+ "p50Ms": 0.019,
+ "p95Ms": 0.027,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 1762
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 2.57,
+ "avgMs": 0.122,
+ "p50Ms": 0.106,
+ "p95Ms": 0.216,
+ "maxMs": 0.25,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.57,
+ "items": 2984
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 6.25,
+ "avgMs": 0.298,
+ "p50Ms": 0.246,
+ "p95Ms": 0.757,
+ "maxMs": 0.961,
+ "mainThreadMs": 6.25,
+ "backgroundMs": 0,
+ "items": 454
+ },
+ "marker.visualProps": {
+ "count": 237,
+ "totalMs": 2.1,
+ "avgMs": 0.009,
+ "p50Ms": 0.006,
+ "p95Ms": 0.021,
+ "maxMs": 0.154,
+ "mainThreadMs": 2.1,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 216.6,
+ "afterLoadMB": 285.8,
+ "afterInteractionMB": 269.3,
+ "afterCleanupMB": 265.7,
+ "peakMB": 285.8,
+ "loadDeltaMB": 69.2,
+ "interactionDeltaMB": -16.5,
+ "retainedAfterCleanupMB": 49.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 216.6,
+ "residentMB": 362.9,
+ "javaHeapMB": 33.1,
+ "nativeHeapMB": 114.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 285.8,
+ "residentMB": 432.2,
+ "javaHeapMB": 38.4,
+ "nativeHeapMB": 180.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 269.3,
+ "residentMB": 416,
+ "javaHeapMB": 34.3,
+ "nativeHeapMB": 166.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 265.7,
+ "residentMB": 412.1,
+ "javaHeapMB": 34.6,
+ "nativeHeapMB": 162.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 259800,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": {
+ "javaBytesAllocated": 10486864,
+ "gcCount": 2,
+ "gcTimeMs": 88,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -14035488
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 847,
+ "wallMs": 3743,
+ "percent": 22.6,
+ "threadsBefore": 82,
+ "threadsAfter": 82,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-continuous-pan-10k",
+ "name": "Camera continuous-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six seconds of back-to-back pan legs with no settle between them. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:26.126Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7100,
+ "load": {
+ "commitMs": 14.67,
+ "readyMs": 789,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 5.34,
+ "backgroundMs": 0.87,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 3.39,
+ "avgMs": 1.697,
+ "p50Ms": 0,
+ "p95Ms": 3.394,
+ "maxMs": 3.394,
+ "mainThreadMs": 3.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.08,
+ "p50Ms": 0.08,
+ "p95Ms": 0.08,
+ "maxMs": 0.08,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.557,
+ "p50Ms": 0.557,
+ "p95Ms": 0.557,
+ "maxMs": 0.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.026,
+ "p50Ms": 0.015,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.021,
+ "p50Ms": 0.018,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.16,
+ "avgMs": 0.08,
+ "p50Ms": 0.066,
+ "p95Ms": 0.095,
+ "maxMs": 0.095,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.52,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.146,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.35,
+ "avgMs": 0.673,
+ "p50Ms": 0.004,
+ "p95Ms": 1.343,
+ "maxMs": 1.343,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2720064,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 374,
+ "durationMs": 6245.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 374,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.55,
+ "p50": 17.55,
+ "p95": 17.55,
+ "p99": 17.55,
+ "worst": 17.55
+ },
+ "phaseSharePct": {
+ "unknownDelay": 5.2,
+ "inputHandling": 0,
+ "animation": 3,
+ "layoutMeasure": 0.3,
+ "draw": 4.4,
+ "sync": 0.6,
+ "commandIssue": 4.4,
+ "swapBuffers": 33.7,
+ "gpu": 80.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.8,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 1.5,
+ "sync": 0.2,
+ "commandIssue": 1.6,
+ "swapBuffers": 11.8,
+ "gpu": 28.3,
+ "total": 35.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 740,
+ "p50": 0.07,
+ "p95": 0.19,
+ "p99": 0.41,
+ "max": 5.14
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.72,
+ "max": 21.75
+ },
+ "lateFrames": 0,
+ "busyMs": 69.5,
+ "busyRatio": 0.0111,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6247.1,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 407,
+ "mainThreadMs": 12.67,
+ "backgroundMs": 9.07,
+ "byName": {
+ "camera.apply": {
+ "count": 15,
+ "totalMs": 1.71,
+ "avgMs": 0.114,
+ "p50Ms": 0.109,
+ "p95Ms": 0.304,
+ "maxMs": 0.304,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.97,
+ "avgMs": 0.028,
+ "p50Ms": 0.026,
+ "p95Ms": 0.054,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.97,
+ "items": 350000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 2.41,
+ "avgMs": 0.069,
+ "p50Ms": 0.065,
+ "p95Ms": 0.106,
+ "maxMs": 0.111,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.41,
+ "items": 5514
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 1.1,
+ "avgMs": 0.031,
+ "p50Ms": 0.025,
+ "p95Ms": 0.044,
+ "maxMs": 0.22,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.1,
+ "items": 2888
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 4.59,
+ "avgMs": 0.131,
+ "p50Ms": 0.122,
+ "p95Ms": 0.174,
+ "maxMs": 0.396,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.59,
+ "items": 5514
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 8.46,
+ "avgMs": 0.242,
+ "p50Ms": 0.192,
+ "p95Ms": 0.811,
+ "maxMs": 0.838,
+ "mainThreadMs": 8.46,
+ "backgroundMs": 0,
+ "items": 413
+ },
+ "marker.visualProps": {
+ "count": 217,
+ "totalMs": 2.5,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.026,
+ "maxMs": 0.229,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 254.5,
+ "afterLoadMB": 222.7,
+ "afterInteractionMB": 228.7,
+ "afterCleanupMB": 229,
+ "peakMB": 254.5,
+ "loadDeltaMB": -31.8,
+ "interactionDeltaMB": 6,
+ "retainedAfterCleanupMB": -25.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 254.5,
+ "residentMB": 401.1,
+ "javaHeapMB": 34.7,
+ "nativeHeapMB": 149.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 222.7,
+ "residentMB": 369.3,
+ "javaHeapMB": 34.3,
+ "nativeHeapMB": 118,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 228.7,
+ "residentMB": 375.6,
+ "javaHeapMB": 36.5,
+ "nativeHeapMB": 123,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 229,
+ "residentMB": 375.6,
+ "javaHeapMB": 36.7,
+ "nativeHeapMB": 121.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 398432,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": {
+ "javaBytesAllocated": 11866640,
+ "gcCount": 1,
+ "gcTimeMs": 50,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 5275440
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 740,
+ "wallMs": 6254,
+ "percent": 11.8,
+ "threadsBefore": 83,
+ "threadsAfter": 82,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-zoom-in-10k",
+ "name": "Camera zoom-in, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from country scale into street scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:35.416Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5531,
+ "load": {
+ "commitMs": 10.13,
+ "readyMs": 753,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 4.19,
+ "backgroundMs": 3.41,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.72,
+ "avgMs": 0.858,
+ "p50Ms": 0,
+ "p95Ms": 1.716,
+ "maxMs": 1.716,
+ "mainThreadMs": 1.72,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.042,
+ "p50Ms": 0.042,
+ "p95Ms": 0.042,
+ "maxMs": 0.042,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.301,
+ "p50Ms": 0.301,
+ "p95Ms": 0.301,
+ "maxMs": 0.301,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.027,
+ "p50Ms": 0.014,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 1.47,
+ "avgMs": 0.733,
+ "p50Ms": 0.033,
+ "p95Ms": 1.433,
+ "maxMs": 1.433,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.47,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 1.56,
+ "avgMs": 0.778,
+ "p50Ms": 0.064,
+ "p95Ms": 1.493,
+ "maxMs": 1.493,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.56,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.7,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.358,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.73,
+ "avgMs": 0.867,
+ "p50Ms": 0.004,
+ "p95Ms": 1.73,
+ "maxMs": 1.73,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.010434541000000006,
+ "allocatedBytes": 2720104,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 280,
+ "durationMs": 4670.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 280,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.18,
+ "p50": 17.18,
+ "p95": 17.18,
+ "p99": 17.18,
+ "worst": 17.18
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.2,
+ "inputHandling": 0,
+ "animation": 4.9,
+ "layoutMeasure": 0.5,
+ "draw": 0.7,
+ "sync": 0.9,
+ "commandIssue": 6.4,
+ "swapBuffers": 74.8,
+ "gpu": 82.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 1.7,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 2.2,
+ "swapBuffers": 25.7,
+ "gpu": 28.5,
+ "total": 34.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 557,
+ "p50": 0.07,
+ "p95": 0.2,
+ "p99": 0.46,
+ "max": 1.77
+ },
+ "frameGapMs": {
+ "p50": 16.64,
+ "p95": 17.7,
+ "max": 20.27
+ },
+ "lateFrames": 0,
+ "busyMs": 50.5,
+ "busyRatio": 0.0108,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4671.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2460,
+ "mainThreadMs": 51.16,
+ "backgroundMs": 18.27,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.67,
+ "avgMs": 0.135,
+ "p50Ms": 0.1,
+ "p95Ms": 0.279,
+ "maxMs": 0.279,
+ "mainThreadMs": 0.67,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 26,
+ "totalMs": 1.12,
+ "avgMs": 0.043,
+ "p50Ms": 0.033,
+ "p95Ms": 0.128,
+ "maxMs": 0.151,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.12,
+ "items": 260000
+ },
+ "markers.viewportFilter": {
+ "count": 26,
+ "totalMs": 7.06,
+ "avgMs": 0.271,
+ "p50Ms": 0.052,
+ "p95Ms": 0.938,
+ "maxMs": 1.601,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.06,
+ "items": 22782
+ },
+ "markers.diff": {
+ "count": 26,
+ "totalMs": 0.92,
+ "avgMs": 0.036,
+ "p50Ms": 0.03,
+ "p95Ms": 0.082,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.92,
+ "items": 3879
+ },
+ "markers.viewportCompute": {
+ "count": 26,
+ "totalMs": 9.17,
+ "avgMs": 0.353,
+ "p50Ms": 0.128,
+ "p95Ms": 1.151,
+ "maxMs": 1.798,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.17,
+ "items": 22782
+ },
+ "markers.applyDiff": {
+ "count": 26,
+ "totalMs": 36.24,
+ "avgMs": 1.394,
+ "p50Ms": 0.098,
+ "p95Ms": 4.317,
+ "maxMs": 4.628,
+ "mainThreadMs": 36.24,
+ "backgroundMs": 0,
+ "items": 4714
+ },
+ "marker.visualProps": {
+ "count": 2325,
+ "totalMs": 14.25,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.008,
+ "maxMs": 0.565,
+ "mainThreadMs": 14.25,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 229.1,
+ "afterLoadMB": 294.1,
+ "afterInteractionMB": 263.4,
+ "afterCleanupMB": 261,
+ "peakMB": 294.1,
+ "loadDeltaMB": 65,
+ "interactionDeltaMB": -30.7,
+ "retainedAfterCleanupMB": 31.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 229.1,
+ "residentMB": 375.6,
+ "javaHeapMB": 36.8,
+ "nativeHeapMB": 121.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 294.1,
+ "residentMB": 440.6,
+ "javaHeapMB": 42.2,
+ "nativeHeapMB": 181.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 263.4,
+ "residentMB": 410.3,
+ "javaHeapMB": 52.9,
+ "nativeHeapMB": 138.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 261,
+ "residentMB": 407.8,
+ "javaHeapMB": 53.2,
+ "nativeHeapMB": 135.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 590472,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": {
+ "javaBytesAllocated": 41814528,
+ "gcCount": 8,
+ "gcTimeMs": 248,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -44409872
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1159,
+ "wallMs": 4685,
+ "percent": 24.7,
+ "threadsBefore": 85,
+ "threadsAfter": 87,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-zoom-out-10k",
+ "name": "Camera zoom-out, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from street scale out to country scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:44.676Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5525,
+ "load": {
+ "commitMs": 10.79,
+ "readyMs": 751,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.01,
+ "backgroundMs": 1.35,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.22,
+ "avgMs": 0.608,
+ "p50Ms": 0,
+ "p95Ms": 1.216,
+ "maxMs": 1.216,
+ "mainThreadMs": 1.22,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.137,
+ "p50Ms": 0.137,
+ "p95Ms": 0.137,
+ "maxMs": 0.137,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.86,
+ "avgMs": 0.858,
+ "p50Ms": 0.858,
+ "p95Ms": 0.858,
+ "maxMs": 0.858,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.86,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.054,
+ "p50Ms": 0.02,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.051,
+ "p50Ms": 0.024,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.25,
+ "avgMs": 0.124,
+ "p50Ms": 0.059,
+ "p95Ms": 0.188,
+ "maxMs": 0.188,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.52,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.008,
+ "maxMs": 0.186,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.13,
+ "avgMs": 0.567,
+ "p50Ms": 0.003,
+ "p95Ms": 1.132,
+ "maxMs": 1.132,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003150374999999997,
+ "allocatedBytes": 2719872,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 280,
+ "durationMs": 4671.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 280,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.96,
+ "p50": 16.96,
+ "p95": 16.96,
+ "p99": 16.96,
+ "worst": 16.96
+ },
+ "phaseSharePct": {
+ "unknownDelay": 6.4,
+ "inputHandling": 0,
+ "animation": 4.8,
+ "layoutMeasure": 0.5,
+ "draw": 0.6,
+ "sync": 0.5,
+ "commandIssue": 4.3,
+ "swapBuffers": 39.6,
+ "gpu": 82.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.2,
+ "inputHandling": 0,
+ "animation": 1.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.4,
+ "swapBuffers": 13.4,
+ "gpu": 27.9,
+ "total": 33.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 555,
+ "p50": 0.07,
+ "p95": 0.18,
+ "p99": 0.39,
+ "max": 1.56
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.43,
+ "max": 21.58
+ },
+ "lateFrames": 0,
+ "busyMs": 50.2,
+ "busyRatio": 0.0107,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4672.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1580,
+ "mainThreadMs": 42.5,
+ "backgroundMs": 12.99,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.93,
+ "avgMs": 0.186,
+ "p50Ms": 0.196,
+ "p95Ms": 0.325,
+ "maxMs": 0.325,
+ "mainThreadMs": 0.93,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 26,
+ "totalMs": 0.94,
+ "avgMs": 0.036,
+ "p50Ms": 0.023,
+ "p95Ms": 0.07,
+ "maxMs": 0.122,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 260000
+ },
+ "markers.viewportFilter": {
+ "count": 26,
+ "totalMs": 4.8,
+ "avgMs": 0.185,
+ "p50Ms": 0.045,
+ "p95Ms": 0.725,
+ "maxMs": 1.287,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.8,
+ "items": 14111
+ },
+ "markers.diff": {
+ "count": 26,
+ "totalMs": 0.71,
+ "avgMs": 0.027,
+ "p50Ms": 0.018,
+ "p95Ms": 0.075,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.71,
+ "items": 2732
+ },
+ "markers.viewportCompute": {
+ "count": 26,
+ "totalMs": 6.54,
+ "avgMs": 0.251,
+ "p50Ms": 0.083,
+ "p95Ms": 0.903,
+ "maxMs": 1.417,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.54,
+ "items": 14111
+ },
+ "markers.applyDiff": {
+ "count": 26,
+ "totalMs": 30.39,
+ "avgMs": 1.169,
+ "p50Ms": 0.156,
+ "p95Ms": 5.432,
+ "maxMs": 8.608,
+ "mainThreadMs": 30.39,
+ "backgroundMs": 0,
+ "items": 2760
+ },
+ "marker.visualProps": {
+ "count": 1445,
+ "totalMs": 11.18,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.561,
+ "mainThreadMs": 11.18,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 260.3,
+ "afterLoadMB": 250.7,
+ "afterInteractionMB": 272.4,
+ "afterCleanupMB": 271.2,
+ "peakMB": 272.4,
+ "loadDeltaMB": -9.6,
+ "interactionDeltaMB": 21.7,
+ "retainedAfterCleanupMB": 10.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 260.3,
+ "residentMB": 406.9,
+ "javaHeapMB": 53.4,
+ "nativeHeapMB": 135.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 250.7,
+ "residentMB": 397.4,
+ "javaHeapMB": 42.4,
+ "nativeHeapMB": 133.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 272.4,
+ "residentMB": 420.5,
+ "javaHeapMB": 47.4,
+ "nativeHeapMB": 151.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 271.2,
+ "residentMB": 418.2,
+ "javaHeapMB": 48.3,
+ "nativeHeapMB": 147.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 444880,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": {
+ "javaBytesAllocated": 37898160,
+ "gcCount": 5,
+ "gcTimeMs": 192,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 18715296
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1177,
+ "wallMs": 4680,
+ "percent": 25.1,
+ "threadsBefore": 88,
+ "threadsAfter": 88,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-rapid-zoom-10k",
+ "name": "Camera rapid-zoom, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Ten alternating zoom jumps of 300 ms each across three octaves. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:27:52.962Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4529,
+ "load": {
+ "commitMs": 10.46,
+ "readyMs": 762,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 4.72,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.83,
+ "avgMs": 0.917,
+ "p50Ms": 0,
+ "p95Ms": 1.833,
+ "maxMs": 1.833,
+ "mainThreadMs": 1.83,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.201,
+ "p50Ms": 0.201,
+ "p95Ms": 0.201,
+ "maxMs": 0.201,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.018,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.018,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.12,
+ "avgMs": 0.059,
+ "p50Ms": 0.047,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 1.03,
+ "avgMs": 0.016,
+ "p50Ms": 0.004,
+ "p95Ms": 0.027,
+ "maxMs": 0.484,
+ "mainThreadMs": 1.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.79,
+ "avgMs": 0.896,
+ "p50Ms": 0.004,
+ "p95Ms": 1.789,
+ "maxMs": 1.789,
+ "mainThreadMs": 1.79,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.006687542000000005,
+ "allocatedBytes": 2719752,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 220,
+ "durationMs": 3672.4,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 220,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 36.63,
+ "p50": 36.63,
+ "p95": 36.63,
+ "p99": 36.63,
+ "worst": 36.63
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.3,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.9,
+ "swapBuffers": 60.7,
+ "gpu": 92
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.7,
+ "inputHandling": 0,
+ "animation": 2.3,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 44.5,
+ "gpu": 67.4,
+ "total": 73.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 438,
+ "p50": 0.06,
+ "p95": 0.19,
+ "p99": 1,
+ "max": 4.75
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.49,
+ "max": 23.22
+ },
+ "lateFrames": 0,
+ "busyMs": 44,
+ "busyRatio": 0.012,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3673.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1891,
+ "mainThreadMs": 42.87,
+ "backgroundMs": 5.37,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.06,
+ "avgMs": 0.106,
+ "p50Ms": 0.097,
+ "p95Ms": 0.178,
+ "maxMs": 0.178,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 19,
+ "totalMs": 0.49,
+ "avgMs": 0.026,
+ "p50Ms": 0.025,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 190000
+ },
+ "markers.viewportFilter": {
+ "count": 19,
+ "totalMs": 1.42,
+ "avgMs": 0.075,
+ "p50Ms": 0.029,
+ "p95Ms": 0.269,
+ "maxMs": 0.269,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.42,
+ "items": 6148
+ },
+ "markers.diff": {
+ "count": 19,
+ "totalMs": 0.75,
+ "avgMs": 0.039,
+ "p50Ms": 0.038,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.75,
+ "items": 2732
+ },
+ "markers.viewportCompute": {
+ "count": 19,
+ "totalMs": 2.71,
+ "avgMs": 0.143,
+ "p50Ms": 0.1,
+ "p95Ms": 0.348,
+ "maxMs": 0.348,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.71,
+ "items": 6148
+ },
+ "markers.applyDiff": {
+ "count": 19,
+ "totalMs": 30.14,
+ "avgMs": 1.587,
+ "p50Ms": 0.999,
+ "p95Ms": 4.934,
+ "maxMs": 4.934,
+ "mainThreadMs": 30.14,
+ "backgroundMs": 0,
+ "items": 3550
+ },
+ "marker.visualProps": {
+ "count": 1786,
+ "totalMs": 11.66,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.009,
+ "maxMs": 0.5,
+ "mainThreadMs": 11.66,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 270.9,
+ "afterLoadMB": 248.3,
+ "afterInteractionMB": 334.6,
+ "afterCleanupMB": 330.6,
+ "peakMB": 334.6,
+ "loadDeltaMB": -22.6,
+ "interactionDeltaMB": 86.3,
+ "retainedAfterCleanupMB": 59.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 270.9,
+ "residentMB": 417.6,
+ "javaHeapMB": 48.5,
+ "nativeHeapMB": 147.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 248.3,
+ "residentMB": 395.2,
+ "javaHeapMB": 45.4,
+ "nativeHeapMB": 126.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 334.6,
+ "residentMB": 481.5,
+ "javaHeapMB": 51.8,
+ "nativeHeapMB": 205.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 330.6,
+ "residentMB": 477.6,
+ "javaHeapMB": 52.1,
+ "nativeHeapMB": 201.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 437600,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": {
+ "javaBytesAllocated": 40816896,
+ "gcCount": 6,
+ "gcTimeMs": 222,
+ "blockingGcCount": 2,
+ "nativeHeapDeltaBytes": 83479552
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1252,
+ "wallMs": 3681,
+ "percent": 34,
+ "threadsBefore": 89,
+ "threadsAfter": 88,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-rotate-10k",
+ "name": "Camera rotate, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four heading changes of 90° at city zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:28:00.931Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4192,
+ "load": {
+ "commitMs": 9.93,
+ "readyMs": 776,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.4,
+ "backgroundMs": 0.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.71,
+ "avgMs": 0.355,
+ "p50Ms": 0,
+ "p95Ms": 0.711,
+ "maxMs": 0.711,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.282,
+ "p50Ms": 0.282,
+ "p95Ms": 0.282,
+ "maxMs": 0.282,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.28,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.014,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.021,
+ "p50Ms": 0.019,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.055,
+ "p50Ms": 0.048,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.51,
+ "avgMs": 0.008,
+ "p50Ms": 0.004,
+ "p95Ms": 0.007,
+ "maxMs": 0.215,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.13,
+ "avgMs": 0.564,
+ "p50Ms": 0.004,
+ "p95Ms": 1.125,
+ "maxMs": 1.125,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0023214160000000067,
+ "allocatedBytes": 2719736,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 199,
+ "durationMs": 3334.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 199,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 175,
+ "renderTotalMs": {
+ "average": 17.4,
+ "p50": 17.06,
+ "p95": 20.35,
+ "p99": 22.97,
+ "worst": 29.97
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.3,
+ "inputHandling": 0,
+ "animation": 1.2,
+ "layoutMeasure": 0.3,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 3.6,
+ "swapBuffers": 21.1,
+ "gpu": 88.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 200,
+ "inputHandling": 0.4,
+ "animation": 75.8,
+ "layoutMeasure": 17.9,
+ "draw": 16.6,
+ "sync": 19.3,
+ "commandIssue": 218.8,
+ "swapBuffers": 1287.6,
+ "gpu": 5402.7,
+ "total": 6090.7
+ },
+ "missedDeadline": 175
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 398,
+ "p50": 0.07,
+ "p95": 0.25,
+ "p99": 1.46,
+ "max": 4.5
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.5,
+ "max": 22.28
+ },
+ "lateFrames": 0,
+ "busyMs": 48,
+ "busyRatio": 0.0144,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3336.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 613,
+ "mainThreadMs": 45.29,
+ "backgroundMs": 3.94,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.65,
+ "avgMs": 0.161,
+ "p50Ms": 0.104,
+ "p95Ms": 0.334,
+ "maxMs": 0.334,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.58,
+ "avgMs": 0.036,
+ "p50Ms": 0.024,
+ "p95Ms": 0.215,
+ "maxMs": 0.215,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.66,
+ "avgMs": 0.041,
+ "p50Ms": 0.039,
+ "p95Ms": 0.073,
+ "maxMs": 0.073,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.66,
+ "items": 4056
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.69,
+ "avgMs": 0.043,
+ "p50Ms": 0.035,
+ "p95Ms": 0.206,
+ "maxMs": 0.206,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.69,
+ "items": 2186
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 2,
+ "avgMs": 0.125,
+ "p50Ms": 0.101,
+ "p95Ms": 0.279,
+ "maxMs": 0.279,
+ "mainThreadMs": 0,
+ "backgroundMs": 2,
+ "items": 4056
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 29.86,
+ "avgMs": 1.866,
+ "p50Ms": 0.405,
+ "p95Ms": 15.206,
+ "maxMs": 15.206,
+ "mainThreadMs": 29.86,
+ "backgroundMs": 0,
+ "items": 999
+ },
+ "marker.visualProps": {
+ "count": 529,
+ "totalMs": 14.78,
+ "avgMs": 0.028,
+ "p50Ms": 0.006,
+ "p95Ms": 0.034,
+ "maxMs": 4.255,
+ "mainThreadMs": 14.78,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 330.1,
+ "afterLoadMB": 294.7,
+ "afterInteractionMB": 257.1,
+ "afterCleanupMB": 253.3,
+ "peakMB": 330.1,
+ "loadDeltaMB": -35.4,
+ "interactionDeltaMB": -37.6,
+ "retainedAfterCleanupMB": -76.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 330.1,
+ "residentMB": 477.1,
+ "javaHeapMB": 52.2,
+ "nativeHeapMB": 201.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 294.7,
+ "residentMB": 441.6,
+ "javaHeapMB": 49.5,
+ "nativeHeapMB": 166.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 257.1,
+ "residentMB": 404,
+ "javaHeapMB": 50.6,
+ "nativeHeapMB": 127.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 253.3,
+ "residentMB": 400.1,
+ "javaHeapMB": 50.8,
+ "nativeHeapMB": 123.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 308000,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": {
+ "javaBytesAllocated": 10701648,
+ "gcCount": 2,
+ "gcTimeMs": 149,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -40778160
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1084,
+ "wallMs": 3342,
+ "percent": 32.4,
+ "threadsBefore": 91,
+ "threadsAfter": 91,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-pitch-10k",
+ "name": "Camera pitch, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Pitch to 45°, 60°, back to 0° at street zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:28:07.997Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3345,
+ "load": {
+ "commitMs": 13.98,
+ "readyMs": 748,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.49,
+ "backgroundMs": 0.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.99,
+ "avgMs": 0.495,
+ "p50Ms": 0.001,
+ "p95Ms": 0.989,
+ "maxMs": 0.989,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.241,
+ "p50Ms": 0.241,
+ "p95Ms": 0.241,
+ "maxMs": 0.241,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.022,
+ "p50Ms": 0.016,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.016,
+ "p50Ms": 0.015,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.12,
+ "avgMs": 0.058,
+ "p50Ms": 0.052,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.45,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.007,
+ "maxMs": 0.142,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.01,
+ "avgMs": 0.504,
+ "p50Ms": 0.004,
+ "p95Ms": 1.004,
+ "maxMs": 1.004,
+ "mainThreadMs": 1.01,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004443374999999999,
+ "allocatedBytes": 2719528,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 150,
+ "durationMs": 2502.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 150,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 79,
+ "renderTotalMs": {
+ "average": 17.81,
+ "p50": 17.08,
+ "p95": 17.7,
+ "p99": 69.61,
+ "worst": 69.61
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.1,
+ "inputHandling": 0,
+ "animation": 0.8,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 2.8,
+ "swapBuffers": 12.7,
+ "gpu": 92.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 87.8,
+ "inputHandling": 0.1,
+ "animation": 23.9,
+ "layoutMeasure": 6.3,
+ "draw": 6.3,
+ "sync": 5.7,
+ "commandIssue": 78,
+ "swapBuffers": 356.8,
+ "gpu": 2593.2,
+ "total": 2813.9
+ },
+ "missedDeadline": 79
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 298,
+ "p50": 0.06,
+ "p95": 0.21,
+ "p99": 0.96,
+ "max": 2.96
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.08,
+ "max": 18.84
+ },
+ "lateFrames": 0,
+ "busyMs": 29.5,
+ "busyRatio": 0.0118,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2504.6,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 68,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 4.03,
+ "byName": {
+ "camera.apply": {
+ "count": 3,
+ "totalMs": 1.12,
+ "avgMs": 0.373,
+ "p50Ms": 0.217,
+ "p95Ms": 0.821,
+ "maxMs": 0.821,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 13,
+ "totalMs": 1.14,
+ "avgMs": 0.087,
+ "p50Ms": 0.014,
+ "p95Ms": 0.837,
+ "maxMs": 0.837,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 130000
+ },
+ "markers.viewportFilter": {
+ "count": 13,
+ "totalMs": 0.33,
+ "avgMs": 0.026,
+ "p50Ms": 0.014,
+ "p95Ms": 0.101,
+ "maxMs": 0.101,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.33,
+ "items": 703
+ },
+ "markers.diff": {
+ "count": 13,
+ "totalMs": 0.44,
+ "avgMs": 0.034,
+ "p50Ms": 0.01,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 270
+ },
+ "markers.viewportCompute": {
+ "count": 13,
+ "totalMs": 2.11,
+ "avgMs": 0.163,
+ "p50Ms": 0.052,
+ "p95Ms": 1.027,
+ "maxMs": 1.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.11,
+ "items": 703
+ },
+ "markers.applyDiff": {
+ "count": 13,
+ "totalMs": 0.4,
+ "avgMs": 0.031,
+ "p50Ms": 0.004,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0.4,
+ "backgroundMs": 0,
+ "items": 54
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 253.2,
+ "afterLoadMB": 316,
+ "afterInteractionMB": 287.4,
+ "afterCleanupMB": 283.4,
+ "peakMB": 316,
+ "loadDeltaMB": 62.8,
+ "interactionDeltaMB": -28.6,
+ "retainedAfterCleanupMB": 30.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 253.2,
+ "residentMB": 400,
+ "javaHeapMB": 50.9,
+ "nativeHeapMB": 123.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 316,
+ "residentMB": 462.9,
+ "javaHeapMB": 56.3,
+ "nativeHeapMB": 182.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 287.4,
+ "residentMB": 434.4,
+ "javaHeapMB": 58.4,
+ "nativeHeapMB": 152.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 283.4,
+ "residentMB": 430.4,
+ "javaHeapMB": 58.5,
+ "nativeHeapMB": 147.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 140584,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": {
+ "javaBytesAllocated": 21069184,
+ "gcCount": 1,
+ "gcTimeMs": 58,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -31317184
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1244,
+ "wallMs": 2511,
+ "percent": 49.6,
+ "threadsBefore": 95,
+ "threadsAfter": 95,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-rapid-10k",
+ "name": "Camera rapid, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Twenty 150 ms flicks mixing small pans and half-zoom steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:28:16.711Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4976,
+ "load": {
+ "commitMs": 12.13,
+ "readyMs": 754,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.98,
+ "avgMs": 0.491,
+ "p50Ms": 0,
+ "p95Ms": 0.982,
+ "maxMs": 0.982,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.064,
+ "p50Ms": 0.064,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.219,
+ "p50Ms": 0.219,
+ "p95Ms": 0.219,
+ "maxMs": 0.219,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.041,
+ "p50Ms": 0.038,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.51,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.166,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.58,
+ "avgMs": 0.788,
+ "p50Ms": 0.003,
+ "p95Ms": 1.573,
+ "maxMs": 1.573,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2719664,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 246,
+ "durationMs": 4104,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 246,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.4,
+ "p50": 17.4,
+ "p95": 17.4,
+ "p99": 17.4,
+ "worst": 17.4
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.5,
+ "inputHandling": 0,
+ "animation": 2.1,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 5.8,
+ "swapBuffers": 32,
+ "gpu": 86.4
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.6,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 2,
+ "swapBuffers": 11.1,
+ "gpu": 30.1,
+ "total": 34.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 487,
+ "p50": 0.07,
+ "p95": 0.27,
+ "p99": 0.58,
+ "max": 3.52
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.47,
+ "max": 21.57
+ },
+ "lateFrames": 0,
+ "busyMs": 54.3,
+ "busyRatio": 0.0132,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4105.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 556,
+ "mainThreadMs": 17.65,
+ "backgroundMs": 4.83,
+ "byName": {
+ "camera.apply": {
+ "count": 21,
+ "totalMs": 2.48,
+ "avgMs": 0.118,
+ "p50Ms": 0.097,
+ "p95Ms": 0.265,
+ "maxMs": 0.287,
+ "mainThreadMs": 2.48,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 23,
+ "totalMs": 0.71,
+ "avgMs": 0.031,
+ "p50Ms": 0.017,
+ "p95Ms": 0.125,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.71,
+ "items": 230000
+ },
+ "markers.viewportFilter": {
+ "count": 23,
+ "totalMs": 1.15,
+ "avgMs": 0.05,
+ "p50Ms": 0.022,
+ "p95Ms": 0.117,
+ "maxMs": 0.513,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.15,
+ "items": 2477
+ },
+ "markers.diff": {
+ "count": 23,
+ "totalMs": 0.46,
+ "avgMs": 0.02,
+ "p50Ms": 0.015,
+ "p95Ms": 0.041,
+ "maxMs": 0.102,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 1279
+ },
+ "markers.viewportCompute": {
+ "count": 23,
+ "totalMs": 2.51,
+ "avgMs": 0.109,
+ "p50Ms": 0.055,
+ "p95Ms": 0.313,
+ "maxMs": 0.7,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.51,
+ "items": 2477
+ },
+ "markers.applyDiff": {
+ "count": 23,
+ "totalMs": 11.21,
+ "avgMs": 0.487,
+ "p50Ms": 0.074,
+ "p95Ms": 1.807,
+ "maxMs": 3.462,
+ "mainThreadMs": 11.21,
+ "backgroundMs": 0,
+ "items": 837
+ },
+ "marker.visualProps": {
+ "count": 420,
+ "totalMs": 3.96,
+ "avgMs": 0.009,
+ "p50Ms": 0.006,
+ "p95Ms": 0.018,
+ "maxMs": 0.282,
+ "mainThreadMs": 3.96,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 283.5,
+ "afterLoadMB": 352.6,
+ "afterInteractionMB": 293.1,
+ "afterCleanupMB": 289.3,
+ "peakMB": 352.6,
+ "loadDeltaMB": 69.1,
+ "interactionDeltaMB": -59.5,
+ "retainedAfterCleanupMB": 5.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 283.5,
+ "residentMB": 430.4,
+ "javaHeapMB": 58.6,
+ "nativeHeapMB": 147.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 352.6,
+ "residentMB": 499.3,
+ "javaHeapMB": 64,
+ "nativeHeapMB": 213.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 293.1,
+ "residentMB": 439.9,
+ "javaHeapMB": 56,
+ "nativeHeapMB": 159.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 289.3,
+ "residentMB": 436.1,
+ "javaHeapMB": 56.4,
+ "nativeHeapMB": 154.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 359680,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": {
+ "javaBytesAllocated": 15783744,
+ "gcCount": 3,
+ "gcTimeMs": 185,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -56915424
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1124,
+ "wallMs": 4111,
+ "percent": 27.3,
+ "threadsBefore": 97,
+ "threadsAfter": 96,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "camera-fast-pan-50k",
+ "name": "Camera fast-pan, 50k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 50000 markers.",
+ "recordedAt": "2026-09-10T14:28:26.764Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4583,
+ "load": {
+ "commitMs": 42.15,
+ "readyMs": 922,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 335,
+ "mainThreadMs": 26.91,
+ "backgroundMs": 3.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 5.72,
+ "avgMs": 2.859,
+ "p50Ms": 0,
+ "p95Ms": 5.717,
+ "maxMs": 5.717,
+ "mainThreadMs": 5.72,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.363,
+ "p50Ms": 2.363,
+ "p95Ms": 2.363,
+ "maxMs": 2.363,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.36,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.17,
+ "avgMs": 0.087,
+ "p50Ms": 0.035,
+ "p95Ms": 0.139,
+ "maxMs": 0.139,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 100000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.22,
+ "avgMs": 0.11,
+ "p50Ms": 0.102,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 826
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.24,
+ "avgMs": 0.118,
+ "p50Ms": 0.046,
+ "p95Ms": 0.189,
+ "maxMs": 0.189,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 626
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.64,
+ "avgMs": 0.321,
+ "p50Ms": 0.202,
+ "p95Ms": 0.439,
+ "maxMs": 0.439,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.64,
+ "items": 826
+ },
+ "marker.visualProps": {
+ "count": 313,
+ "totalMs": 7.44,
+ "avgMs": 0.024,
+ "p50Ms": 0.007,
+ "p95Ms": 0.035,
+ "maxMs": 1.164,
+ "mainThreadMs": 7.44,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 13.63,
+ "avgMs": 6.813,
+ "p50Ms": 0.02,
+ "p95Ms": 13.607,
+ "maxMs": 13.607,
+ "mainThreadMs": 13.63,
+ "backgroundMs": 0,
+ "items": 313
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.007232374999999999,
+ "allocatedBytes": 13898624,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 223,
+ "durationMs": 3723.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 223,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 35.78,
+ "p50": 35.78,
+ "p95": 35.78,
+ "p99": 35.78,
+ "worst": 35.78
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.3,
+ "inputHandling": 0,
+ "animation": 4.3,
+ "layoutMeasure": 1,
+ "draw": 0.8,
+ "sync": 1,
+ "commandIssue": 7.1,
+ "swapBuffers": 84.2,
+ "gpu": 84.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.7,
+ "draw": 0.6,
+ "sync": 0.7,
+ "commandIssue": 5,
+ "swapBuffers": 60.3,
+ "gpu": 60.2,
+ "total": 71.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 441,
+ "p50": 0.06,
+ "p95": 0.19,
+ "p99": 0.33,
+ "max": 0.99
+ },
+ "frameGapMs": {
+ "p50": 16.7,
+ "p95": 17.44,
+ "max": 20.24
+ },
+ "lateFrames": 0,
+ "busyMs": 36.7,
+ "busyRatio": 0.0099,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3724.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1332,
+ "mainThreadMs": 36,
+ "backgroundMs": 18.36,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 0.88,
+ "avgMs": 0.126,
+ "p50Ms": 0.094,
+ "p95Ms": 0.326,
+ "maxMs": 0.326,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 0.69,
+ "avgMs": 0.033,
+ "p50Ms": 0.027,
+ "p95Ms": 0.057,
+ "maxMs": 0.099,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.69,
+ "items": 1050000
+ },
+ "markers.viewportFilter": {
+ "count": 21,
+ "totalMs": 4.43,
+ "avgMs": 0.211,
+ "p50Ms": 0.129,
+ "p95Ms": 0.538,
+ "maxMs": 1.126,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.43,
+ "items": 14991
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 4.02,
+ "avgMs": 0.191,
+ "p50Ms": 0.094,
+ "p95Ms": 0.227,
+ "maxMs": 1.995,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.02,
+ "items": 8687
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 9.22,
+ "avgMs": 0.439,
+ "p50Ms": 0.233,
+ "p95Ms": 1.341,
+ "maxMs": 2.179,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.22,
+ "items": 14991
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 26.06,
+ "avgMs": 1.241,
+ "p50Ms": 1.124,
+ "p95Ms": 3.651,
+ "maxMs": 5.535,
+ "mainThreadMs": 26.06,
+ "backgroundMs": 0,
+ "items": 2334
+ },
+ "marker.visualProps": {
+ "count": 1220,
+ "totalMs": 9.06,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.201,
+ "mainThreadMs": 9.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 278.8,
+ "afterLoadMB": 351.6,
+ "afterInteractionMB": 333.6,
+ "afterCleanupMB": 330,
+ "peakMB": 351.6,
+ "loadDeltaMB": 72.8,
+ "interactionDeltaMB": -18,
+ "retainedAfterCleanupMB": 51.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 278.8,
+ "residentMB": 425.7,
+ "javaHeapMB": 56.5,
+ "nativeHeapMB": 142,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 351.6,
+ "residentMB": 498.4,
+ "javaHeapMB": 63.4,
+ "nativeHeapMB": 202.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 333.6,
+ "residentMB": 480.5,
+ "javaHeapMB": 61.6,
+ "nativeHeapMB": 185.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 330,
+ "residentMB": 476.9,
+ "javaHeapMB": 61.8,
+ "nativeHeapMB": 181.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 372288,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 44
+ },
+ "android": {
+ "javaBytesAllocated": 23555632,
+ "gcCount": 5,
+ "gcTimeMs": 272,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -17253680
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1342,
+ "wallMs": 3741,
+ "percent": 35.9,
+ "threadsBefore": 98,
+ "threadsAfter": 98,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-10k",
+ "name": "Marker update cost at 10k",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "With 10000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:28:50.798Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 20265,
+ "load": {
+ "commitMs": 10.14,
+ "readyMs": 771,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.27,
+ "backgroundMs": 0.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.75,
+ "avgMs": 0.873,
+ "p50Ms": 0,
+ "p95Ms": 1.745,
+ "maxMs": 1.745,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.106,
+ "p50Ms": 0.106,
+ "p95Ms": 0.106,
+ "maxMs": 0.106,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.192,
+ "p50Ms": 0.192,
+ "p95Ms": 0.192,
+ "maxMs": 0.192,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.023,
+ "p50Ms": 0.015,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.024,
+ "p50Ms": 0.022,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.064,
+ "p50Ms": 0.053,
+ "p95Ms": 0.076,
+ "maxMs": 0.076,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.44,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.006,
+ "maxMs": 0.13,
+ "mainThreadMs": 0.44,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.98,
+ "avgMs": 0.49,
+ "p50Ms": 0.003,
+ "p95Ms": 0.978,
+ "maxMs": 0.978,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.007621500000000003,
+ "allocatedBytes": 2720448,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 1161,
+ "durationMs": 19393,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.7,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1159,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0017,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.48,
+ "p50": 17.48,
+ "p95": 17.48,
+ "p99": 17.48,
+ "worst": 17.48
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.5,
+ "inputHandling": 0,
+ "animation": 2.5,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 3,
+ "swapBuffers": 31.6,
+ "gpu": 92
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.9,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1,
+ "swapBuffers": 11.1,
+ "gpu": 32.2,
+ "total": 35
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 2140,
+ "p50": 0.13,
+ "p95": 0.66,
+ "p99": 14.96,
+ "max": 34.81
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 19.03,
+ "max": 48.27
+ },
+ "lateFrames": 7,
+ "busyMs": 1314.6,
+ "busyRatio": 0.0678,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 19394.8,
+ "commits": {
+ "count": 40,
+ "totalMs": 640.67,
+ "avgMs": 16.017,
+ "p95Ms": 19.152,
+ "maxMs": 23.074
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 14.061,
+ "maxMs": 22.554
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 2.071,
+ "maxMs": 18.332
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 675,
+ "mainThreadMs": 170.62,
+ "backgroundMs": 28.06,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 40,
+ "totalMs": 80.78,
+ "avgMs": 2.019,
+ "p50Ms": 1.302,
+ "p95Ms": 3.93,
+ "maxMs": 18.256,
+ "mainThreadMs": 80.78,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.set": {
+ "count": 40,
+ "totalMs": 82.82,
+ "avgMs": 2.071,
+ "p50Ms": 1.338,
+ "p95Ms": 3.987,
+ "maxMs": 18.332,
+ "mainThreadMs": 82.82,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 21.62,
+ "avgMs": 0.54,
+ "p50Ms": 0.404,
+ "p95Ms": 1.269,
+ "maxMs": 1.646,
+ "mainThreadMs": 0,
+ "backgroundMs": 21.62,
+ "items": 400025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 1.07,
+ "avgMs": 0.027,
+ "p50Ms": 0.019,
+ "p95Ms": 0.057,
+ "maxMs": 0.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.07,
+ "items": 400025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.96,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.044,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 3254
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 1.14,
+ "avgMs": 0.029,
+ "p50Ms": 0.024,
+ "p95Ms": 0.046,
+ "maxMs": 0.119,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 2558
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 3.27,
+ "avgMs": 0.082,
+ "p50Ms": 0.062,
+ "p95Ms": 0.16,
+ "maxMs": 0.297,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.27,
+ "items": 3254
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 5.49,
+ "avgMs": 0.137,
+ "p50Ms": 0.006,
+ "p95Ms": 0.532,
+ "maxMs": 1.404,
+ "mainThreadMs": 5.49,
+ "backgroundMs": 0,
+ "items": 357
+ },
+ "marker.visualProps": {
+ "count": 355,
+ "totalMs": 1.52,
+ "avgMs": 0.004,
+ "p50Ms": 0.002,
+ "p95Ms": 0.011,
+ "maxMs": 0.256,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 329.8,
+ "afterLoadMB": 368,
+ "afterInteractionMB": 313.6,
+ "afterCleanupMB": 309.6,
+ "peakMB": 368,
+ "loadDeltaMB": 38.2,
+ "interactionDeltaMB": -54.4,
+ "retainedAfterCleanupMB": -20.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 329.8,
+ "residentMB": 476.7,
+ "javaHeapMB": 62,
+ "nativeHeapMB": 181.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 368,
+ "residentMB": 514.7,
+ "javaHeapMB": 67.4,
+ "nativeHeapMB": 214.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 313.6,
+ "residentMB": 460.6,
+ "javaHeapMB": 75.4,
+ "nativeHeapMB": 144.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 309.6,
+ "residentMB": 456.6,
+ "javaHeapMB": 75.5,
+ "nativeHeapMB": 140.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 45769000,
+ "gcCount": 12,
+ "gcTimeMs": 0.05694537499999999,
+ "heapSizeAfterMB": 48
+ },
+ "android": {
+ "javaBytesAllocated": 140014240,
+ "gcCount": 5,
+ "gcTimeMs": 398,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -72915776
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 2409,
+ "wallMs": 19402,
+ "percent": 12.4,
+ "threadsBefore": 100,
+ "threadsAfter": 98,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 41,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 410025,
+ "coordinates": 410025,
+ "estimatedBytes": 29361098
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717190
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 472.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.36,
+ "avgMs": 11.36,
+ "p95Ms": 11.36,
+ "maxMs": 11.36
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.348,
+ "maxMs": 14.348
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.774,
+ "maxMs": 0.774
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 0.36,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.75,
+ "avgMs": 0.747,
+ "p50Ms": 0.747,
+ "p95Ms": 0.747,
+ "maxMs": 0.747,
+ "mainThreadMs": 0.75,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.774,
+ "p50Ms": 0.774,
+ "p95Ms": 0.774,
+ "maxMs": 0.774,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.263,
+ "p50Ms": 0.263,
+ "p95Ms": 0.263,
+ "maxMs": 0.263,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1026128,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 1
+ },
+ "wallMs": 484.03,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.46,
+ "avgMs": 17.458,
+ "p95Ms": 17.458,
+ "maxMs": 17.458
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.305,
+ "maxMs": 16.305
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.284,
+ "maxMs": 1.284
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.53,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.241,
+ "p50Ms": 1.241,
+ "p95Ms": 1.241,
+ "maxMs": 1.241,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.28,
+ "avgMs": 1.284,
+ "p50Ms": 1.284,
+ "p95Ms": 1.284,
+ "maxMs": 1.284,
+ "mainThreadMs": 1.28,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.324,
+ "p50Ms": 0.324,
+ "p95Ms": 0.324,
+ "maxMs": 0.324,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1024360,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 2
+ },
+ "wallMs": 482.48,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.26,
+ "avgMs": 18.259,
+ "p95Ms": 18.259,
+ "maxMs": 18.259
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.769,
+ "maxMs": 13.769
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.977,
+ "maxMs": 0.977
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.92,
+ "backgroundMs": 0.42,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.94,
+ "avgMs": 0.943,
+ "p50Ms": 0.943,
+ "p95Ms": 0.943,
+ "maxMs": 0.943,
+ "mainThreadMs": 0.94,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.977,
+ "p50Ms": 0.977,
+ "p95Ms": 0.977,
+ "maxMs": 0.977,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.301,
+ "p50Ms": 0.301,
+ "p95Ms": 0.301,
+ "maxMs": 0.301,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.061,
+ "p50Ms": 0.061,
+ "p95Ms": 0.061,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002484708000000002,
+ "allocatedBytes": 1024840,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 3
+ },
+ "wallMs": 479.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.7,
+ "avgMs": 16.705,
+ "p95Ms": 16.705,
+ "maxMs": 16.705
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.77,
+ "maxMs": 14.77
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.798,
+ "maxMs": 1.798
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.55,
+ "backgroundMs": 0.49,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.75,
+ "avgMs": 1.75,
+ "p50Ms": 1.75,
+ "p95Ms": 1.75,
+ "maxMs": 1.75,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.8,
+ "avgMs": 1.798,
+ "p50Ms": 1.798,
+ "p95Ms": 1.798,
+ "maxMs": 1.798,
+ "mainThreadMs": 1.8,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.366,
+ "p50Ms": 0.366,
+ "p95Ms": 0.366,
+ "maxMs": 0.366,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1023376,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 4
+ },
+ "wallMs": 485.85,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.31,
+ "avgMs": 12.313,
+ "p95Ms": 12.313,
+ "maxMs": 12.313
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.993,
+ "maxMs": 2.993
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.833,
+ "maxMs": 0.833
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.65,
+ "backgroundMs": 0.29,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.81,
+ "avgMs": 0.811,
+ "p50Ms": 0.811,
+ "p95Ms": 0.811,
+ "maxMs": 0.811,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.83,
+ "avgMs": 0.833,
+ "p50Ms": 0.833,
+ "p95Ms": 0.833,
+ "maxMs": 0.833,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.206,
+ "p50Ms": 0.206,
+ "p95Ms": 0.206,
+ "maxMs": 0.206,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 10005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1025808,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10005,
+ "repeat": 0
+ },
+ "wallMs": 477.38,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.57,
+ "avgMs": 15.569,
+ "p95Ms": 15.569,
+ "maxMs": 15.569
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.005,
+ "maxMs": 14.005
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.434,
+ "maxMs": 1.434
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.78,
+ "backgroundMs": 0.6,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.35,
+ "avgMs": 1.346,
+ "p50Ms": 1.346,
+ "p95Ms": 1.346,
+ "maxMs": 1.346,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.43,
+ "avgMs": 1.434,
+ "p50Ms": 1.434,
+ "p95Ms": 1.434,
+ "maxMs": 1.434,
+ "mainThreadMs": 1.43,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.442,
+ "p50Ms": 0.442,
+ "p95Ms": 0.442,
+ "maxMs": 0.442,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931768,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 1
+ },
+ "wallMs": 481.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.67,
+ "avgMs": 16.674,
+ "p95Ms": 16.674,
+ "maxMs": 16.674
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.991,
+ "maxMs": 16.991
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.273,
+ "maxMs": 1.273
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.52,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.241,
+ "p50Ms": 1.241,
+ "p95Ms": 1.241,
+ "maxMs": 1.241,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.273,
+ "p50Ms": 1.273,
+ "p95Ms": 1.273,
+ "maxMs": 1.273,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.404,
+ "p50Ms": 0.404,
+ "p95Ms": 0.404,
+ "maxMs": 0.404,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.4,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016481250000000003,
+ "allocatedBytes": 931568,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 2
+ },
+ "wallMs": 482.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.79,
+ "avgMs": 17.786,
+ "p95Ms": 17.786,
+ "maxMs": 17.786
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.179,
+ "maxMs": 15.179
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.163,
+ "maxMs": 1.163
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 1,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.11,
+ "avgMs": 1.111,
+ "p50Ms": 1.111,
+ "p95Ms": 1.111,
+ "maxMs": 1.111,
+ "mainThreadMs": 1.11,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.163,
+ "p50Ms": 1.163,
+ "p95Ms": 1.163,
+ "maxMs": 1.163,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.765,
+ "p50Ms": 0.765,
+ "p95Ms": 0.765,
+ "maxMs": 0.765,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.76,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.119,
+ "p50Ms": 0.119,
+ "p95Ms": 0.119,
+ "maxMs": 0.119,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931392,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 3
+ },
+ "wallMs": 478.31,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.38,
+ "avgMs": 17.379,
+ "p95Ms": 17.379,
+ "maxMs": 17.379
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.671,
+ "maxMs": 14.671
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.901,
+ "maxMs": 1.901
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.76,
+ "backgroundMs": 0.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.84,
+ "avgMs": 1.844,
+ "p50Ms": 1.844,
+ "p95Ms": 1.844,
+ "maxMs": 1.844,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.9,
+ "avgMs": 1.901,
+ "p50Ms": 1.901,
+ "p95Ms": 1.901,
+ "maxMs": 1.901,
+ "mainThreadMs": 1.9,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.51,
+ "p50Ms": 0.51,
+ "p95Ms": 0.51,
+ "maxMs": 0.51,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.103,
+ "p50Ms": 0.103,
+ "p95Ms": 0.103,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 936464,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 4
+ },
+ "wallMs": 482.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.88,
+ "avgMs": 15.88,
+ "p95Ms": 15.88,
+ "maxMs": 15.88
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.47,
+ "maxMs": 18.47
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.724,
+ "maxMs": 1.724
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.41,
+ "backgroundMs": 0.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.682,
+ "p50Ms": 1.682,
+ "p95Ms": 1.682,
+ "maxMs": 1.682,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.72,
+ "avgMs": 1.724,
+ "p50Ms": 1.724,
+ "p95Ms": 1.724,
+ "maxMs": 1.724,
+ "mainThreadMs": 1.72,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.534,
+ "p50Ms": 0.534,
+ "p95Ms": 0.534,
+ "maxMs": 0.534,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931096,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 481.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.21,
+ "avgMs": 17.208,
+ "p95Ms": 17.208,
+ "maxMs": 17.208
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.61,
+ "maxMs": 16.61
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.334,
+ "maxMs": 1.334
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.64,
+ "backgroundMs": 0.57,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.3,
+ "avgMs": 1.302,
+ "p50Ms": 1.302,
+ "p95Ms": 1.302,
+ "maxMs": 1.302,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.33,
+ "avgMs": 1.334,
+ "p50Ms": 1.334,
+ "p95Ms": 1.334,
+ "maxMs": 1.334,
+ "mainThreadMs": 1.33,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.45,
+ "avgMs": 0.45,
+ "p50Ms": 0.45,
+ "p95Ms": 0.45,
+ "maxMs": 0.45,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.06,
+ "p50Ms": 0.06,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931400,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 484.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.81,
+ "avgMs": 17.812,
+ "p95Ms": 17.812,
+ "maxMs": 17.812
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.343,
+ "maxMs": 16.343
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.358,
+ "maxMs": 1.358
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.33,
+ "avgMs": 1.328,
+ "p50Ms": 1.328,
+ "p95Ms": 1.328,
+ "maxMs": 1.328,
+ "mainThreadMs": 1.33,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.36,
+ "avgMs": 1.358,
+ "p50Ms": 1.358,
+ "p95Ms": 1.358,
+ "maxMs": 1.358,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.337,
+ "p50Ms": 0.337,
+ "p95Ms": 0.337,
+ "maxMs": 0.337,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.34,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003186207999999996,
+ "allocatedBytes": 931264,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 485.14,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.33,
+ "avgMs": 17.328,
+ "p95Ms": 17.328,
+ "maxMs": 17.328
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.191,
+ "maxMs": 15.191
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.162,
+ "maxMs": 1.162
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.3,
+ "backgroundMs": 0.45,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.13,
+ "avgMs": 1.129,
+ "p50Ms": 1.129,
+ "p95Ms": 1.129,
+ "maxMs": 1.129,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.162,
+ "p50Ms": 1.162,
+ "p95Ms": 1.162,
+ "maxMs": 1.162,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.339,
+ "p50Ms": 0.339,
+ "p95Ms": 0.339,
+ "maxMs": 0.339,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.34,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931328,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 477.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.11,
+ "avgMs": 15.111,
+ "p95Ms": 15.111,
+ "maxMs": 15.111
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.67,
+ "maxMs": 14.67
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.403,
+ "maxMs": 1.403
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.37,
+ "avgMs": 1.366,
+ "p50Ms": 1.366,
+ "p95Ms": 1.366,
+ "maxMs": 1.366,
+ "mainThreadMs": 1.37,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.403,
+ "p50Ms": 1.403,
+ "p95Ms": 1.403,
+ "maxMs": 1.403,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.321,
+ "p50Ms": 0.321,
+ "p95Ms": 0.321,
+ "maxMs": 0.321,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931264,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 480.47,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.19,
+ "avgMs": 14.193,
+ "p95Ms": 14.193,
+ "maxMs": 14.193
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 19.027,
+ "maxMs": 19.027
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.06,
+ "maxMs": 1.06
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.06,
+ "backgroundMs": 0.56,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.99,
+ "p50Ms": 0.99,
+ "p95Ms": 0.99,
+ "maxMs": 0.99,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.06,
+ "avgMs": 1.06,
+ "p50Ms": 1.06,
+ "p95Ms": 1.06,
+ "maxMs": 1.06,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.348,
+ "p50Ms": 0.348,
+ "p95Ms": 0.348,
+ "maxMs": 0.348,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.35,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 931328,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 481.68,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.81,
+ "avgMs": 18.81,
+ "p95Ms": 18.81,
+ "maxMs": 18.81
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.303,
+ "maxMs": 15.303
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.123,
+ "maxMs": 1.123
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.21,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.09,
+ "avgMs": 1.085,
+ "p50Ms": 1.085,
+ "p95Ms": 1.085,
+ "maxMs": 1.085,
+ "mainThreadMs": 1.09,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.12,
+ "avgMs": 1.123,
+ "p50Ms": 1.123,
+ "p95Ms": 1.123,
+ "maxMs": 1.123,
+ "mainThreadMs": 1.12,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.397,
+ "p50Ms": 0.397,
+ "p95Ms": 0.397,
+ "maxMs": 0.397,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.4,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.06,
+ "p50Ms": 0.06,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0026310830000000063,
+ "allocatedBytes": 932472,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 483.21,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.22,
+ "avgMs": 15.225,
+ "p95Ms": 15.225,
+ "maxMs": 15.225
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 22.554,
+ "maxMs": 22.554
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 4.758,
+ "maxMs": 4.758
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 9.4,
+ "backgroundMs": 1.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 4.64,
+ "avgMs": 4.64,
+ "p50Ms": 4.64,
+ "p95Ms": 4.64,
+ "maxMs": 4.64,
+ "mainThreadMs": 4.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 4.76,
+ "avgMs": 4.758,
+ "p50Ms": 4.758,
+ "p95Ms": 4.758,
+ "maxMs": 4.758,
+ "mainThreadMs": 4.76,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.15,
+ "avgMs": 1.146,
+ "p50Ms": 1.146,
+ "p95Ms": 1.146,
+ "maxMs": 1.146,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.15,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 934456,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 482.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.81,
+ "avgMs": 18.815,
+ "p95Ms": 18.815,
+ "maxMs": 18.815
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.003,
+ "maxMs": 17.003
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 18.332,
+ "maxMs": 18.332
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 36.59,
+ "backgroundMs": 0.78,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 18.26,
+ "avgMs": 18.256,
+ "p50Ms": 18.256,
+ "p95Ms": 18.256,
+ "maxMs": 18.256,
+ "mainThreadMs": 18.26,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 18.33,
+ "avgMs": 18.332,
+ "p50Ms": 18.332,
+ "p95Ms": 18.332,
+ "maxMs": 18.332,
+ "mainThreadMs": 18.33,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.629,
+ "p50Ms": 0.629,
+ "p95Ms": 0.629,
+ "maxMs": 0.629,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.63,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.033,
+ "p50Ms": 0.033,
+ "p95Ms": 0.033,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 940480,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 480.94,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.03,
+ "avgMs": 14.034,
+ "p95Ms": 14.034,
+ "maxMs": 14.034
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.309,
+ "maxMs": 18.309
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.062,
+ "maxMs": 1.062
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.1,
+ "backgroundMs": 0.66,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.04,
+ "avgMs": 1.036,
+ "p50Ms": 1.036,
+ "p95Ms": 1.036,
+ "maxMs": 1.036,
+ "mainThreadMs": 1.04,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.06,
+ "avgMs": 1.062,
+ "p50Ms": 1.062,
+ "p95Ms": 1.062,
+ "maxMs": 1.062,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.54,
+ "avgMs": 0.543,
+ "p50Ms": 0.543,
+ "p95Ms": 0.543,
+ "maxMs": 0.543,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 932424,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 487.32,
+ "commits": {
+ "count": 1,
+ "totalMs": 23.07,
+ "avgMs": 23.074,
+ "p95Ms": 23.074,
+ "maxMs": 23.074
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.991,
+ "maxMs": 11.991
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.231,
+ "maxMs": 1.231
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0.62,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.2,
+ "avgMs": 1.204,
+ "p50Ms": 1.204,
+ "p95Ms": 1.204,
+ "maxMs": 1.204,
+ "mainThreadMs": 1.2,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.23,
+ "avgMs": 1.231,
+ "p50Ms": 1.231,
+ "p95Ms": 1.231,
+ "maxMs": 1.231,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.511,
+ "p50Ms": 0.511,
+ "p95Ms": 0.511,
+ "maxMs": 0.511,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 932440,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 491.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.02,
+ "avgMs": 12.023,
+ "p95Ms": 12.023,
+ "maxMs": 12.023
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.212,
+ "maxMs": 8.212
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.82,
+ "maxMs": 2.82
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 5.54,
+ "backgroundMs": 1.96,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.7,
+ "avgMs": 2.703,
+ "p50Ms": 2.703,
+ "p95Ms": 2.703,
+ "maxMs": 2.703,
+ "mainThreadMs": 2.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.82,
+ "avgMs": 2.82,
+ "p50Ms": 2.82,
+ "p95Ms": 2.82,
+ "maxMs": 2.82,
+ "mainThreadMs": 2.82,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.65,
+ "avgMs": 1.646,
+ "p50Ms": 1.646,
+ "p95Ms": 1.646,
+ "maxMs": 1.646,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.65,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.066,
+ "p50Ms": 0.066,
+ "p95Ms": 0.066,
+ "maxMs": 0.066,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.16,
+ "p50Ms": 0.16,
+ "p95Ms": 0.16,
+ "maxMs": 0.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.023658417000000015,
+ "allocatedBytes": 943512,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 482.99,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.32,
+ "avgMs": 16.321,
+ "p95Ms": 16.321,
+ "maxMs": 16.321
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.907,
+ "maxMs": 17.907
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.338,
+ "maxMs": 1.338
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.61,
+ "backgroundMs": 0.75,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.26,
+ "avgMs": 1.265,
+ "p50Ms": 1.265,
+ "p95Ms": 1.265,
+ "maxMs": 1.265,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.338,
+ "p50Ms": 1.338,
+ "p95Ms": 1.338,
+ "maxMs": 1.338,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.592,
+ "p50Ms": 0.592,
+ "p95Ms": 0.592,
+ "maxMs": 0.592,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943488,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 481.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.43,
+ "avgMs": 19.428,
+ "p95Ms": 19.428,
+ "maxMs": 19.428
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.634,
+ "maxMs": 13.634
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.118,
+ "maxMs": 2.118
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.15,
+ "backgroundMs": 1.03,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.03,
+ "avgMs": 2.028,
+ "p50Ms": 2.028,
+ "p95Ms": 2.028,
+ "maxMs": 2.028,
+ "mainThreadMs": 2.03,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.12,
+ "avgMs": 2.118,
+ "p50Ms": 2.118,
+ "p95Ms": 2.118,
+ "maxMs": 2.118,
+ "mainThreadMs": 2.12,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.917,
+ "p50Ms": 0.917,
+ "p95Ms": 0.917,
+ "maxMs": 0.917,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.92,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943448,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 481.64,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.72,
+ "avgMs": 16.721,
+ "p95Ms": 16.721,
+ "maxMs": 16.721
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.708,
+ "maxMs": 16.708
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.683,
+ "maxMs": 1.683
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.36,
+ "backgroundMs": 1.79,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.619,
+ "p50Ms": 1.619,
+ "p95Ms": 1.619,
+ "maxMs": 1.619,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.683,
+ "p50Ms": 1.683,
+ "p95Ms": 1.683,
+ "maxMs": 1.683,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.269,
+ "p50Ms": 1.269,
+ "p95Ms": 1.269,
+ "maxMs": 1.269,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.27,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.186,
+ "p50Ms": 0.186,
+ "p95Ms": 0.186,
+ "maxMs": 0.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002140916999999992,
+ "allocatedBytes": 943464,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 481.23,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.51,
+ "avgMs": 18.514,
+ "p95Ms": 18.514,
+ "maxMs": 18.514
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.647,
+ "maxMs": 15.647
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.233,
+ "maxMs": 2.233
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.4,
+ "backgroundMs": 0.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.16,
+ "avgMs": 2.162,
+ "p50Ms": 2.162,
+ "p95Ms": 2.162,
+ "maxMs": 2.162,
+ "mainThreadMs": 2.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.23,
+ "avgMs": 2.233,
+ "p50Ms": 2.233,
+ "p95Ms": 2.233,
+ "maxMs": 2.233,
+ "mainThreadMs": 2.23,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.548,
+ "p50Ms": 0.548,
+ "p95Ms": 0.548,
+ "maxMs": 0.548,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.55,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943464,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 483.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.44,
+ "avgMs": 13.445,
+ "p95Ms": 13.445,
+ "maxMs": 13.445
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.23,
+ "maxMs": 2.23
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.206,
+ "maxMs": 1.206
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 2.57,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.17,
+ "avgMs": 1.172,
+ "p50Ms": 1.172,
+ "p95Ms": 1.172,
+ "maxMs": 1.172,
+ "mainThreadMs": 1.17,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.206,
+ "p50Ms": 1.206,
+ "p95Ms": 1.206,
+ "maxMs": 1.206,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.409,
+ "p50Ms": 0.409,
+ "p95Ms": 0.409,
+ "maxMs": 0.409,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.179,
+ "p50Ms": 0.179,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 945480,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 479.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.03,
+ "avgMs": 19.025,
+ "p95Ms": 19.025,
+ "maxMs": 19.025
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.359,
+ "maxMs": 14.359
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.886,
+ "maxMs": 1.886
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 10,
+ "mainThreadMs": 3.91,
+ "backgroundMs": 0.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.8,
+ "avgMs": 1.798,
+ "p50Ms": 1.798,
+ "p95Ms": 1.798,
+ "maxMs": 1.798,
+ "mainThreadMs": 1.8,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.89,
+ "avgMs": 1.886,
+ "p50Ms": 1.886,
+ "p95Ms": 1.886,
+ "maxMs": 1.886,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.53,
+ "p50Ms": 0.53,
+ "p95Ms": 0.53,
+ "maxMs": 0.53,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "marker.visualProps": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.004,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.205,
+ "p50Ms": 0.205,
+ "p95Ms": 0.205,
+ "maxMs": 0.205,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 945264,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 481.94,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.15,
+ "avgMs": 19.152,
+ "p95Ms": 19.152,
+ "maxMs": 19.152
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.823,
+ "maxMs": 14.823
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.698,
+ "maxMs": 1.698
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.38,
+ "backgroundMs": 0.72,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.675,
+ "p50Ms": 1.675,
+ "p95Ms": 1.675,
+ "maxMs": 1.675,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.7,
+ "avgMs": 1.698,
+ "p50Ms": 1.698,
+ "p95Ms": 1.698,
+ "maxMs": 1.698,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.557,
+ "p50Ms": 0.557,
+ "p95Ms": 0.557,
+ "maxMs": 0.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 943688,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 466.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.08,
+ "avgMs": 9.082,
+ "p95Ms": 9.082,
+ "maxMs": 9.082
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.778,
+ "maxMs": 3.778
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.293,
+ "maxMs": 1.293
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.57,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.271,
+ "p50Ms": 1.271,
+ "p95Ms": 1.271,
+ "maxMs": 1.271,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.293,
+ "p50Ms": 1.293,
+ "p95Ms": 1.293,
+ "maxMs": 1.293,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.374,
+ "p50Ms": 0.374,
+ "p95Ms": 0.374,
+ "maxMs": 0.374,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00432933399999999,
+ "allocatedBytes": 943824,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 481.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.4,
+ "avgMs": 17.397,
+ "p95Ms": 17.397,
+ "maxMs": 17.397
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.767,
+ "maxMs": 16.767
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.388,
+ "maxMs": 1.388
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 2.84,
+ "backgroundMs": 0.49,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.34,
+ "p50Ms": 1.34,
+ "p95Ms": 1.34,
+ "maxMs": 1.34,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.39,
+ "avgMs": 1.388,
+ "p50Ms": 1.388,
+ "p95Ms": 1.388,
+ "maxMs": 1.388,
+ "mainThreadMs": 1.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.358,
+ "p50Ms": 0.358,
+ "p95Ms": 0.358,
+ "maxMs": 0.358,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.087,
+ "p50Ms": 0.087,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 945200,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 482.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.85,
+ "avgMs": 14.845,
+ "p95Ms": 14.845,
+ "maxMs": 14.845
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.812,
+ "maxMs": 16.812
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.711,
+ "maxMs": 3.711
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 14,
+ "mainThreadMs": 7.5,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.64,
+ "avgMs": 3.642,
+ "p50Ms": 3.642,
+ "p95Ms": 3.642,
+ "maxMs": 3.642,
+ "mainThreadMs": 3.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.71,
+ "avgMs": 3.711,
+ "p50Ms": 3.711,
+ "p95Ms": 3.711,
+ "maxMs": 3.711,
+ "mainThreadMs": 3.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.397,
+ "p50Ms": 0.397,
+ "p95Ms": 0.397,
+ "maxMs": 0.397,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.4,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 6,
+ "totalMs": 0.03,
+ "avgMs": 0.004,
+ "p50Ms": 0.003,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.122,
+ "p50Ms": 0.122,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 6
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1059016,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 481.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.12,
+ "avgMs": 18.12,
+ "p95Ms": 18.12,
+ "maxMs": 18.12
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.11,
+ "maxMs": 13.11
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.156,
+ "maxMs": 1.156
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 2.72,
+ "backgroundMs": 0.61,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.11,
+ "avgMs": 1.114,
+ "p50Ms": 1.114,
+ "p95Ms": 1.114,
+ "maxMs": 1.114,
+ "mainThreadMs": 1.11,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.156,
+ "p50Ms": 1.156,
+ "p95Ms": 1.156,
+ "maxMs": 1.156,
+ "mainThreadMs": 1.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.366,
+ "p50Ms": 0.366,
+ "p95Ms": 0.366,
+ "maxMs": 0.366,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.042,
+ "p50Ms": 0.042,
+ "p95Ms": 0.042,
+ "maxMs": 0.042,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 8,
+ "totalMs": 0.07,
+ "avgMs": 0.009,
+ "p50Ms": 0.003,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.377,
+ "p50Ms": 0.377,
+ "p95Ms": 0.377,
+ "maxMs": 0.377,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 8
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003258209000000012,
+ "allocatedBytes": 1055176,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 483.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.45,
+ "avgMs": 17.446,
+ "p95Ms": 17.446,
+ "maxMs": 17.446
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.094,
+ "maxMs": 16.094
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.364,
+ "maxMs": 2.364
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 4.85,
+ "backgroundMs": 0.58,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.31,
+ "avgMs": 2.306,
+ "p50Ms": 2.306,
+ "p95Ms": 2.306,
+ "maxMs": 2.306,
+ "mainThreadMs": 2.31,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.364,
+ "p50Ms": 2.364,
+ "p95Ms": 2.364,
+ "maxMs": 2.364,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.395,
+ "p50Ms": 0.395,
+ "p95Ms": 0.395,
+ "maxMs": 0.395,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.39,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 5,
+ "totalMs": 0.03,
+ "avgMs": 0.007,
+ "p50Ms": 0.003,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.145,
+ "p50Ms": 0.145,
+ "p95Ms": 0.145,
+ "maxMs": 0.145,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1054688,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 482.17,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.96,
+ "avgMs": 16.958,
+ "p95Ms": 16.958,
+ "maxMs": 16.958
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.141,
+ "maxMs": 13.141
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.852,
+ "maxMs": 1.852
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 3.88,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.82,
+ "avgMs": 1.822,
+ "p50Ms": 1.822,
+ "p95Ms": 1.822,
+ "maxMs": 1.822,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.85,
+ "avgMs": 1.852,
+ "p50Ms": 1.852,
+ "p95Ms": 1.852,
+ "maxMs": 1.852,
+ "mainThreadMs": 1.85,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.314,
+ "p50Ms": 0.314,
+ "p95Ms": 0.314,
+ "maxMs": 0.314,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.061,
+ "p50Ms": 0.061,
+ "p95Ms": 0.061,
+ "maxMs": 0.061,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 7,
+ "totalMs": 0.04,
+ "avgMs": 0.005,
+ "p50Ms": 0.003,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.166,
+ "p50Ms": 0.166,
+ "p95Ms": 0.166,
+ "maxMs": 0.166,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1054920,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 480.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.28,
+ "avgMs": 18.278,
+ "p95Ms": 18.278,
+ "maxMs": 18.278
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.201,
+ "maxMs": 12.201
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.987,
+ "maxMs": 3.987
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 8.7,
+ "backgroundMs": 2.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.93,
+ "avgMs": 3.93,
+ "p50Ms": 3.93,
+ "p95Ms": 3.93,
+ "maxMs": 3.93,
+ "mainThreadMs": 3.93,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.99,
+ "avgMs": 3.987,
+ "p50Ms": 3.987,
+ "p95Ms": 3.987,
+ "maxMs": 3.987,
+ "mainThreadMs": 3.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.64,
+ "avgMs": 1.636,
+ "p50Ms": 1.636,
+ "p95Ms": 1.636,
+ "maxMs": 1.636,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.64,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.148,
+ "p50Ms": 0.148,
+ "p95Ms": 0.148,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.119,
+ "p50Ms": 0.119,
+ "p95Ms": 0.119,
+ "maxMs": 0.119,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.297,
+ "p50Ms": 0.297,
+ "p95Ms": 0.297,
+ "maxMs": 0.297,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 7,
+ "totalMs": 0.3,
+ "avgMs": 0.043,
+ "p50Ms": 0.003,
+ "p95Ms": 0.256,
+ "maxMs": 0.256,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.481,
+ "p50Ms": 0.481,
+ "p95Ms": 0.481,
+ "maxMs": 0.481,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1054904,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 483.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.13,
+ "avgMs": 12.129,
+ "p95Ms": 12.129,
+ "maxMs": 12.129
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 5.346,
+ "maxMs": 5.346
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.287,
+ "maxMs": 1.287
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 71,
+ "mainThreadMs": 4.23,
+ "backgroundMs": 0.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.249,
+ "p50Ms": 1.249,
+ "p95Ms": 1.249,
+ "maxMs": 1.249,
+ "mainThreadMs": 1.25,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.287,
+ "p50Ms": 1.287,
+ "p95Ms": 1.287,
+ "maxMs": 1.287,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.551,
+ "p50Ms": 0.551,
+ "p95Ms": 0.551,
+ "maxMs": 0.551,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.55,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 63
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.06,
+ "p50Ms": 0.06,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 63,
+ "totalMs": 0.29,
+ "avgMs": 0.005,
+ "p50Ms": 0.002,
+ "p95Ms": 0.007,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.404,
+ "p50Ms": 1.404,
+ "p95Ms": 1.404,
+ "maxMs": 1.404,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004249499999999989,
+ "allocatedBytes": 2223096,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 497.75,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.1,
+ "avgMs": 12.101,
+ "p95Ms": 12.101,
+ "maxMs": 12.101
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.428,
+ "maxMs": 3.428
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.994,
+ "maxMs": 0.994
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 2.86,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.965,
+ "p50Ms": 0.965,
+ "p95Ms": 0.965,
+ "maxMs": 0.965,
+ "mainThreadMs": 0.97,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.994,
+ "p50Ms": 0.994,
+ "p95Ms": 0.994,
+ "maxMs": 0.994,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.386,
+ "p50Ms": 0.386,
+ "p95Ms": 0.386,
+ "maxMs": 0.386,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.39,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 82
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.2,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.052,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.703,
+ "p50Ms": 0.703,
+ "p95Ms": 0.703,
+ "maxMs": 0.703,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2207064,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 498.24,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.06,
+ "avgMs": 12.058,
+ "p95Ms": 12.058,
+ "maxMs": 12.058
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.1,
+ "maxMs": 14.1
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.296,
+ "maxMs": 1.296
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 3.04,
+ "backgroundMs": 0.41,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.215,
+ "p50Ms": 1.215,
+ "p95Ms": 1.215,
+ "maxMs": 1.215,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.3,
+ "avgMs": 1.296,
+ "p50Ms": 1.296,
+ "p95Ms": 1.296,
+ "maxMs": 1.296,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 83
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.14,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.388,
+ "p50Ms": 0.388,
+ "p95Ms": 0.388,
+ "maxMs": 0.388,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0054079579999999905,
+ "allocatedBytes": 2215744,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 497.95,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.95,
+ "avgMs": 14.95,
+ "p95Ms": 14.95,
+ "maxMs": 14.95
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.505,
+ "maxMs": 17.505
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.623,
+ "maxMs": 1.623
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 3.87,
+ "backgroundMs": 0.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.577,
+ "p50Ms": 1.577,
+ "p95Ms": 1.577,
+ "maxMs": 1.577,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.623,
+ "p50Ms": 1.623,
+ "p95Ms": 1.623,
+ "maxMs": 1.623,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.557,
+ "p50Ms": 0.557,
+ "p95Ms": 0.557,
+ "maxMs": 0.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 64
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 83
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.18,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.492,
+ "p50Ms": 0.492,
+ "p95Ms": 0.492,
+ "maxMs": 0.492,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.003950915999999999,
+ "allocatedBytes": 2207600,
+ "heapSizeAfterBytes": 50331648
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 494.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.68,
+ "avgMs": 11.684,
+ "p95Ms": 11.684,
+ "maxMs": 11.684
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.15,
+ "maxMs": 18.15
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.909,
+ "maxMs": 0.909
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 71,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 0.48,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.876,
+ "p50Ms": 0.876,
+ "p95Ms": 0.876,
+ "maxMs": 0.876,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.91,
+ "avgMs": 0.909,
+ "p50Ms": 0.909,
+ "p95Ms": 0.909,
+ "maxMs": 0.909,
+ "mainThreadMs": 0.91,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.365,
+ "p50Ms": 0.365,
+ "p95Ms": 0.365,
+ "maxMs": 0.365,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.37,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 84
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 63
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 84
+ },
+ "marker.visualProps": {
+ "count": 63,
+ "totalMs": 0.19,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.532,
+ "p50Ms": 0.532,
+ "p95Ms": 0.532,
+ "maxMs": 0.532,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2207080,
+ "heapSizeAfterBytes": 50331648
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-1k-children",
+ "name": "Marker update cost at 1k (children)",
+ "group": "mutations",
+ "tags": [
+ "baseline"
+ ],
+ "description": "With 1000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:29:14.106Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 19521,
+ "load": {
+ "commitMs": 5.67,
+ "readyMs": 812,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 1.91,
+ "backgroundMs": 4.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.49,
+ "avgMs": 0.243,
+ "p50Ms": 0,
+ "p95Ms": 0.487,
+ "maxMs": 0.487,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.72,
+ "avgMs": 0.72,
+ "p50Ms": 0.72,
+ "p95Ms": 0.72,
+ "maxMs": 0.72,
+ "mainThreadMs": 0.72,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 4.54,
+ "avgMs": 4.539,
+ "p50Ms": 4.539,
+ "p95Ms": 4.539,
+ "maxMs": 4.539,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.54,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.066,
+ "p50Ms": 0.02,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.004,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.009,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.19,
+ "avgMs": 0.093,
+ "p50Ms": 0.034,
+ "p95Ms": 0.151,
+ "maxMs": 0.151,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.16,
+ "avgMs": 0.039,
+ "p50Ms": 0.006,
+ "p95Ms": 0.134,
+ "maxMs": 0.134,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.274,
+ "p50Ms": 0.007,
+ "p95Ms": 0.542,
+ "maxMs": 0.542,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002217582999999995,
+ "allocatedBytes": 887352,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ "frames": {
+ "frames": 1120,
+ "durationMs": 18671.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1120,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 83.01,
+ "p50": 83.01,
+ "p95": 83.01,
+ "p99": 83.01,
+ "worst": 83.01
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0.4,
+ "inputHandling": 0,
+ "animation": 2.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1,
+ "swapBuffers": 96.2,
+ "gpu": 95.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 3.5,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.6,
+ "swapBuffers": 159.6,
+ "gpu": 158.9,
+ "total": 166
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 2070,
+ "p50": 0.15,
+ "p95": 0.37,
+ "p99": 1.6,
+ "max": 18.87
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 18.1,
+ "max": 41.59
+ },
+ "lateFrames": 1,
+ "busyMs": 439.7,
+ "busyRatio": 0.0235,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 18672.8,
+ "commits": {
+ "count": 40,
+ "totalMs": 195.32,
+ "avgMs": 4.883,
+ "p95Ms": 8.478,
+ "maxMs": 9.762
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 9.236,
+ "maxMs": 13.666
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 0.309,
+ "maxMs": 0.754
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 474,
+ "mainThreadMs": 25.86,
+ "backgroundMs": 16.45,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 41,
+ "totalMs": 10.63,
+ "avgMs": 0.259,
+ "p50Ms": 0.223,
+ "p95Ms": 0.615,
+ "maxMs": 0.692,
+ "mainThreadMs": 10.63,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "markers.set": {
+ "count": 41,
+ "totalMs": 12.51,
+ "avgMs": 0.305,
+ "p50Ms": 0.274,
+ "p95Ms": 0.695,
+ "maxMs": 0.754,
+ "mainThreadMs": 12.51,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "polylines.set": {
+ "count": 41,
+ "totalMs": 0.73,
+ "avgMs": 0.018,
+ "p50Ms": 0.014,
+ "p95Ms": 0.035,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 41,
+ "totalMs": 0.06,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.005,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 41,
+ "totalMs": 0.05,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 13.79,
+ "avgMs": 0.345,
+ "p50Ms": 0.297,
+ "p95Ms": 0.621,
+ "maxMs": 0.743,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.79,
+ "items": 40025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 0.7,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.034,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 40025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.23,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.011,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 360
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 0.3,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.01,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 162
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 1.43,
+ "avgMs": 0.036,
+ "p50Ms": 0.035,
+ "p95Ms": 0.054,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.43,
+ "items": 360
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 1.58,
+ "avgMs": 0.04,
+ "p50Ms": 0.004,
+ "p95Ms": 0.203,
+ "maxMs": 0.302,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 29
+ },
+ "marker.visualProps": {
+ "count": 29,
+ "totalMs": 0.3,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.034,
+ "maxMs": 0.064,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 309.6,
+ "afterLoadMB": 374.1,
+ "afterInteractionMB": 333.9,
+ "afterCleanupMB": 329.8,
+ "peakMB": 374.1,
+ "loadDeltaMB": 64.5,
+ "interactionDeltaMB": -40.2,
+ "retainedAfterCleanupMB": 20.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 309.6,
+ "residentMB": 456.6,
+ "javaHeapMB": 75.7,
+ "nativeHeapMB": 140.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 374.1,
+ "residentMB": 520.9,
+ "javaHeapMB": 78,
+ "nativeHeapMB": 202.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 333.9,
+ "residentMB": 480.5,
+ "javaHeapMB": 82.5,
+ "nativeHeapMB": 149.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 329.8,
+ "residentMB": 476.7,
+ "javaHeapMB": 82.6,
+ "nativeHeapMB": 144.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 30116984,
+ "gcCount": 7,
+ "gcTimeMs": 0.03067129199999999,
+ "heapSizeAfterMB": 56
+ },
+ "android": {
+ "javaBytesAllocated": 28604464,
+ "gcCount": 1,
+ "gcTimeMs": 93,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -56114560
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1272,
+ "wallMs": 18681,
+ "percent": 6.8,
+ "threadsBefore": 100,
+ "threadsAfter": 98,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 41,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 41025,
+ "coordinates": 41025,
+ "estimatedBytes": 2937158
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1005,
+ "coordinates": 1005,
+ "estimatedBytes": 71954
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 470.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.68,
+ "avgMs": 2.678,
+ "p95Ms": 2.678,
+ "maxMs": 2.678
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.863,
+ "maxMs": 0.863
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.217,
+ "maxMs": 0.217
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 0.69,
+ "backgroundMs": 0.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.32,
+ "avgMs": 0.161,
+ "p50Ms": 0.114,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 2001
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.35,
+ "avgMs": 0.177,
+ "p50Ms": 0.136,
+ "p95Ms": 0.217,
+ "maxMs": 0.217,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 2001
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.003,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.293,
+ "p50Ms": 0.293,
+ "p95Ms": 0.293,
+ "maxMs": 0.293,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.29,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718520,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 1
+ },
+ "wallMs": 465.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.97,
+ "avgMs": 7.968,
+ "p95Ms": 7.968,
+ "maxMs": 7.968
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 5.801,
+ "maxMs": 5.801
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.327,
+ "maxMs": 0.327
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.42,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.223,
+ "p50Ms": 0.223,
+ "p95Ms": 0.223,
+ "maxMs": 0.223,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.327,
+ "p50Ms": 0.327,
+ "p95Ms": 0.327,
+ "maxMs": 0.327,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.297,
+ "p50Ms": 0.297,
+ "p95Ms": 0.297,
+ "maxMs": 0.297,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.034,
+ "p50Ms": 0.034,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718008,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 2
+ },
+ "wallMs": 464.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.82,
+ "avgMs": 6.82,
+ "p95Ms": 6.82,
+ "maxMs": 6.82
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.644,
+ "maxMs": 7.644
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.261,
+ "maxMs": 0.261
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.217,
+ "p50Ms": 0.217,
+ "p95Ms": 0.217,
+ "maxMs": 0.217,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.261,
+ "p50Ms": 0.261,
+ "p95Ms": 0.261,
+ "maxMs": 0.261,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.346,
+ "p50Ms": 0.346,
+ "p95Ms": 0.346,
+ "maxMs": 0.346,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.35,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 719520,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 3
+ },
+ "wallMs": 465.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.67,
+ "avgMs": 5.668,
+ "p95Ms": 5.668,
+ "maxMs": 5.668
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.417,
+ "maxMs": 9.417
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.243,
+ "maxMs": 0.243
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0.53,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.199,
+ "p50Ms": 0.199,
+ "p95Ms": 0.199,
+ "maxMs": 0.199,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.243,
+ "p50Ms": 0.243,
+ "p95Ms": 0.243,
+ "maxMs": 0.243,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.439,
+ "p50Ms": 0.439,
+ "p95Ms": 0.439,
+ "maxMs": 0.439,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718256,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 4
+ },
+ "wallMs": 466.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.76,
+ "avgMs": 9.762,
+ "p95Ms": 9.762,
+ "maxMs": 9.762
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 4.681,
+ "maxMs": 4.681
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.242,
+ "maxMs": 0.242
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.198,
+ "p50Ms": 0.198,
+ "p95Ms": 0.198,
+ "maxMs": 0.198,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.242,
+ "p50Ms": 0.242,
+ "p95Ms": 0.242,
+ "maxMs": 0.242,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.235,
+ "p50Ms": 0.235,
+ "p95Ms": 0.235,
+ "maxMs": 0.235,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.034,
+ "p50Ms": 0.034,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005094541000000008,
+ "allocatedBytes": 720760,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1005,
+ "repeat": 0
+ },
+ "wallMs": 463.48,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.39,
+ "avgMs": 4.39,
+ "p95Ms": 4.39,
+ "maxMs": 4.39
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.116,
+ "maxMs": 10.116
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.374,
+ "maxMs": 0.374
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0.35,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.295,
+ "p50Ms": 0.295,
+ "p95Ms": 0.295,
+ "maxMs": 0.295,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.374,
+ "p50Ms": 0.374,
+ "p95Ms": 0.374,
+ "maxMs": 0.374,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.274,
+ "p50Ms": 0.274,
+ "p95Ms": 0.274,
+ "maxMs": 0.274,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 714696,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 1
+ },
+ "wallMs": 463.27,
+ "commits": {
+ "count": 1,
+ "totalMs": 4,
+ "avgMs": 3.998,
+ "p95Ms": 3.998,
+ "maxMs": 3.998
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.39,
+ "maxMs": 9.39
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.18,
+ "maxMs": 0.18
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0.32,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.144,
+ "p50Ms": 0.144,
+ "p95Ms": 0.144,
+ "maxMs": 0.144,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.18,
+ "p50Ms": 0.18,
+ "p95Ms": 0.18,
+ "maxMs": 0.18,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.25,
+ "p50Ms": 0.25,
+ "p95Ms": 0.25,
+ "maxMs": 0.25,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712768,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 2
+ },
+ "wallMs": 467.38,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.84,
+ "avgMs": 2.838,
+ "p95Ms": 2.838,
+ "maxMs": 2.838
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.223,
+ "maxMs": 13.223
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.266,
+ "maxMs": 0.266
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.225,
+ "p50Ms": 0.225,
+ "p95Ms": 0.225,
+ "maxMs": 0.225,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.266,
+ "p50Ms": 0.266,
+ "p95Ms": 0.266,
+ "maxMs": 0.266,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.415,
+ "p50Ms": 0.415,
+ "p95Ms": 0.415,
+ "maxMs": 0.415,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712136,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 3
+ },
+ "wallMs": 463.99,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.59,
+ "avgMs": 4.594,
+ "p95Ms": 4.594,
+ "maxMs": 4.594
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.943,
+ "maxMs": 9.943
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.274,
+ "maxMs": 0.274
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0.23,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.226,
+ "p50Ms": 0.226,
+ "p95Ms": 0.226,
+ "maxMs": 0.226,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.274,
+ "p50Ms": 0.274,
+ "p95Ms": 0.274,
+ "maxMs": 0.274,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.036,
+ "p50Ms": 0.036,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.135,
+ "p50Ms": 0.135,
+ "p95Ms": 0.135,
+ "maxMs": 0.135,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711408,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 4
+ },
+ "wallMs": 465.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.81,
+ "avgMs": 2.815,
+ "p95Ms": 2.815,
+ "maxMs": 2.815
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.606,
+ "maxMs": 12.606
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.131,
+ "maxMs": 0.131
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.196,
+ "p50Ms": 0.196,
+ "p95Ms": 0.196,
+ "maxMs": 0.196,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 714528,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.12,
+ "avgMs": 6.12,
+ "p95Ms": 6.12,
+ "maxMs": 6.12
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.264,
+ "maxMs": 9.264
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.082,
+ "maxMs": 0.082
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0.28,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.244,
+ "p50Ms": 0.244,
+ "p95Ms": 0.244,
+ "maxMs": 0.244,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003888499999999989,
+ "allocatedBytes": 710616,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 462.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.44,
+ "avgMs": 4.444,
+ "p95Ms": 4.444,
+ "maxMs": 4.444
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.368,
+ "maxMs": 9.368
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.695,
+ "maxMs": 0.695
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0.32,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.615,
+ "p50Ms": 0.615,
+ "p95Ms": 0.615,
+ "maxMs": 0.615,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.695,
+ "p50Ms": 0.695,
+ "p95Ms": 0.695,
+ "maxMs": 0.695,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.227,
+ "p50Ms": 0.227,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712816,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 467.2,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.87,
+ "avgMs": 2.866,
+ "p95Ms": 2.866,
+ "maxMs": 2.866
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.368,
+ "maxMs": 13.368
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.336,
+ "maxMs": 0.336
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.67,
+ "backgroundMs": 0.33,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.311,
+ "p50Ms": 0.311,
+ "p95Ms": 0.311,
+ "maxMs": 0.311,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.336,
+ "p50Ms": 0.336,
+ "p95Ms": 0.336,
+ "maxMs": 0.336,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.267,
+ "p50Ms": 0.267,
+ "p95Ms": 0.267,
+ "maxMs": 0.267,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 710720,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.33,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.86,
+ "avgMs": 6.856,
+ "p95Ms": 6.856,
+ "maxMs": 6.856
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.307,
+ "maxMs": 9.307
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.493,
+ "maxMs": 0.493
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.94,
+ "backgroundMs": 0.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.43,
+ "avgMs": 0.429,
+ "p50Ms": 0.429,
+ "p95Ms": 0.429,
+ "maxMs": 0.429,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.493,
+ "p50Ms": 0.493,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.61,
+ "p50Ms": 0.61,
+ "p95Ms": 0.61,
+ "maxMs": 0.61,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.61,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 710784,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.91,
+ "avgMs": 3.911,
+ "p95Ms": 3.911,
+ "maxMs": 3.911
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.418,
+ "maxMs": 10.418
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.177,
+ "maxMs": 0.177
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0.53,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.145,
+ "p50Ms": 0.145,
+ "p95Ms": 0.145,
+ "maxMs": 0.145,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.177,
+ "p50Ms": 0.177,
+ "p95Ms": 0.177,
+ "maxMs": 0.177,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.476,
+ "p50Ms": 0.476,
+ "p95Ms": 0.476,
+ "maxMs": 0.476,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.48,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 710656,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.15,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.48,
+ "avgMs": 8.478,
+ "p95Ms": 8.478,
+ "maxMs": 8.478
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.387,
+ "maxMs": 6.387
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.19,
+ "maxMs": 0.19
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.19,
+ "p50Ms": 0.19,
+ "p95Ms": 0.19,
+ "maxMs": 0.19,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004374041999999995,
+ "allocatedBytes": 711704,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 463.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.3,
+ "avgMs": 5.304,
+ "p95Ms": 5.304,
+ "maxMs": 5.304
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.344,
+ "maxMs": 8.344
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.515,
+ "maxMs": 0.515
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.9,
+ "backgroundMs": 0.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.361,
+ "p50Ms": 0.361,
+ "p95Ms": 0.361,
+ "maxMs": 0.361,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.515,
+ "p50Ms": 0.515,
+ "p95Ms": 0.515,
+ "maxMs": 0.515,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.318,
+ "p50Ms": 0.318,
+ "p95Ms": 0.318,
+ "maxMs": 0.318,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711936,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 468.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.12,
+ "avgMs": 4.125,
+ "p95Ms": 4.125,
+ "maxMs": 4.125
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.556,
+ "maxMs": 11.556
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.359,
+ "maxMs": 0.359
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.69,
+ "backgroundMs": 0.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.359,
+ "p50Ms": 0.359,
+ "p95Ms": 0.359,
+ "maxMs": 0.359,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.313,
+ "p50Ms": 0.313,
+ "p95Ms": 0.313,
+ "maxMs": 0.313,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711864,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 462.98,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.95,
+ "avgMs": 4.954,
+ "p95Ms": 4.954,
+ "maxMs": 4.954
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.454,
+ "maxMs": 7.454
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.187,
+ "maxMs": 0.187
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0.2,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.165,
+ "p50Ms": 0.165,
+ "p95Ms": 0.165,
+ "maxMs": 0.165,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.187,
+ "p50Ms": 0.187,
+ "p95Ms": 0.187,
+ "maxMs": 0.187,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 719944,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.76,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.3,
+ "avgMs": 5.302,
+ "p95Ms": 5.302,
+ "maxMs": 5.302
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.725,
+ "maxMs": 9.725
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.171,
+ "maxMs": 0.171
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.151,
+ "p50Ms": 0.151,
+ "p95Ms": 0.151,
+ "maxMs": 0.151,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.171,
+ "p50Ms": 0.171,
+ "p95Ms": 0.171,
+ "maxMs": 0.171,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711656,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 468.69,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.96,
+ "avgMs": 1.964,
+ "p95Ms": 1.964,
+ "maxMs": 1.964
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.666,
+ "maxMs": 13.666
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.298,
+ "maxMs": 0.298
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.276,
+ "p50Ms": 0.276,
+ "p95Ms": 0.276,
+ "maxMs": 0.276,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.298,
+ "p50Ms": 0.298,
+ "p95Ms": 0.298,
+ "maxMs": 0.298,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.223,
+ "p50Ms": 0.223,
+ "p95Ms": 0.223,
+ "maxMs": 0.223,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.16,
+ "p50Ms": 0.16,
+ "p95Ms": 0.16,
+ "maxMs": 0.16,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723800,
+ "heapSizeAfterBytes": 54525952
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 463.1,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.94,
+ "avgMs": 8.943,
+ "p95Ms": 8.943,
+ "maxMs": 8.943
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.274,
+ "maxMs": 3.274
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.275,
+ "maxMs": 0.275
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.19,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.248,
+ "p50Ms": 0.248,
+ "p95Ms": 0.248,
+ "maxMs": 0.248,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.275,
+ "p50Ms": 0.275,
+ "p95Ms": 0.275,
+ "maxMs": 0.275,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.154,
+ "p50Ms": 0.154,
+ "p95Ms": 0.154,
+ "maxMs": 0.154,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005491250000000003,
+ "allocatedBytes": 723664,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.57,
+ "avgMs": 3.57,
+ "p95Ms": 3.57,
+ "maxMs": 3.57
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.314,
+ "maxMs": 11.314
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.3,
+ "maxMs": 0.3
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.245,
+ "p50Ms": 0.245,
+ "p95Ms": 0.245,
+ "maxMs": 0.245,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.3,
+ "p50Ms": 0.3,
+ "p95Ms": 0.3,
+ "maxMs": 0.3,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.133,
+ "p50Ms": 0.133,
+ "p95Ms": 0.133,
+ "maxMs": 0.133,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.057,
+ "p50Ms": 0.057,
+ "p95Ms": 0.057,
+ "maxMs": 0.057,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 728240,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.07,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.02,
+ "avgMs": 5.023,
+ "p95Ms": 5.023,
+ "maxMs": 5.023
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.125,
+ "maxMs": 9.125
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.277,
+ "maxMs": 0.277
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.234,
+ "p50Ms": 0.234,
+ "p95Ms": 0.234,
+ "maxMs": 0.234,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.277,
+ "p50Ms": 0.277,
+ "p95Ms": 0.277,
+ "maxMs": 0.277,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.46,
+ "avgMs": 0.458,
+ "p50Ms": 0.458,
+ "p95Ms": 0.458,
+ "maxMs": 0.458,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 724136,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.69,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.5,
+ "avgMs": 4.496,
+ "p95Ms": 4.496,
+ "maxMs": 4.496
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.697,
+ "maxMs": 9.697
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.306,
+ "maxMs": 0.306
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0.18,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.215,
+ "p50Ms": 0.215,
+ "p95Ms": 0.215,
+ "maxMs": 0.215,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.306,
+ "p50Ms": 0.306,
+ "p95Ms": 0.306,
+ "maxMs": 0.306,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.122,
+ "p50Ms": 0.122,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723824,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 464.17,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.03,
+ "avgMs": 5.029,
+ "p95Ms": 5.029,
+ "maxMs": 5.029
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.336,
+ "maxMs": 10.336
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.642,
+ "maxMs": 0.642
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.577,
+ "p50Ms": 0.577,
+ "p95Ms": 0.577,
+ "maxMs": 0.577,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p50Ms": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.621,
+ "p50Ms": 0.621,
+ "p95Ms": 0.621,
+ "maxMs": 0.621,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.04,
+ "p50Ms": 0.04,
+ "p95Ms": 0.04,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 711968,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.65,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.34,
+ "avgMs": 3.341,
+ "p95Ms": 3.341,
+ "maxMs": 3.341
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.968,
+ "maxMs": 11.968
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.195,
+ "maxMs": 0.195
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0.54,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.161,
+ "p50Ms": 0.161,
+ "p95Ms": 0.161,
+ "maxMs": 0.161,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.195,
+ "p50Ms": 0.195,
+ "p95Ms": 0.195,
+ "maxMs": 0.195,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.486,
+ "p50Ms": 0.486,
+ "p95Ms": 0.486,
+ "maxMs": 0.486,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712240,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.79,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.52,
+ "avgMs": 7.524,
+ "p95Ms": 7.524,
+ "maxMs": 7.524
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.01,
+ "maxMs": 8.01
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.401,
+ "maxMs": 0.401
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.78,
+ "backgroundMs": 0.54,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.355,
+ "p50Ms": 0.355,
+ "p95Ms": 0.355,
+ "maxMs": 0.355,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.4,
+ "avgMs": 0.401,
+ "p50Ms": 0.401,
+ "p95Ms": 0.401,
+ "maxMs": 0.401,
+ "mainThreadMs": 0.4,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.488,
+ "p50Ms": 0.488,
+ "p95Ms": 0.488,
+ "maxMs": 0.488,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003923584000000008,
+ "allocatedBytes": 712288,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.57,
+ "avgMs": 4.571,
+ "p95Ms": 4.571,
+ "maxMs": 4.571
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.17,
+ "maxMs": 11.17
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.732,
+ "maxMs": 0.732
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.44,
+ "backgroundMs": 0.33,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.69,
+ "avgMs": 0.692,
+ "p50Ms": 0.692,
+ "p95Ms": 0.692,
+ "maxMs": 0.692,
+ "mainThreadMs": 0.69,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.73,
+ "avgMs": 0.732,
+ "p50Ms": 0.732,
+ "p95Ms": 0.732,
+ "maxMs": 0.732,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.243,
+ "p50Ms": 0.243,
+ "p95Ms": 0.243,
+ "maxMs": 0.243,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712208,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.15,
+ "avgMs": 5.155,
+ "p95Ms": 5.155,
+ "maxMs": 5.155
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.135,
+ "maxMs": 10.135
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.227,
+ "maxMs": 0.227
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.44,
+ "backgroundMs": 0.55,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.193,
+ "p50Ms": 0.193,
+ "p95Ms": 0.193,
+ "maxMs": 0.193,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.227,
+ "p50Ms": 0.227,
+ "p95Ms": 0.227,
+ "maxMs": 0.227,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.5,
+ "avgMs": 0.495,
+ "p50Ms": 0.495,
+ "p95Ms": 0.495,
+ "maxMs": 0.495,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.5,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 712128,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 464.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.32,
+ "avgMs": 4.315,
+ "p95Ms": 4.315,
+ "maxMs": 4.315
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.047,
+ "maxMs": 10.047
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.376,
+ "maxMs": 0.376
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.33,
+ "p50Ms": 0.33,
+ "p95Ms": 0.33,
+ "maxMs": 0.33,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.376,
+ "p50Ms": 0.376,
+ "p95Ms": 0.376,
+ "maxMs": 0.376,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.15,
+ "p50Ms": 0.15,
+ "p95Ms": 0.15,
+ "maxMs": 0.15,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.048,
+ "p50Ms": 0.048,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.175,
+ "p50Ms": 0.175,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 724136,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.98,
+ "avgMs": 4.98,
+ "p95Ms": 4.98,
+ "maxMs": 4.98
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.104,
+ "maxMs": 12.104
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.162,
+ "maxMs": 0.162
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0.61,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.118,
+ "p50Ms": 0.118,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.162,
+ "p50Ms": 0.162,
+ "p95Ms": 0.162,
+ "maxMs": 0.162,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.534,
+ "p50Ms": 0.534,
+ "p95Ms": 0.534,
+ "maxMs": 0.534,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723184,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.74,
+ "avgMs": 7.737,
+ "p95Ms": 7.737,
+ "maxMs": 7.737
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.411,
+ "maxMs": 7.411
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.164,
+ "maxMs": 0.164
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.143,
+ "p50Ms": 0.143,
+ "p95Ms": 0.143,
+ "maxMs": 0.143,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.47,
+ "avgMs": 0.467,
+ "p50Ms": 0.467,
+ "p95Ms": 0.467,
+ "maxMs": 0.467,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.048,
+ "p50Ms": 0.048,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004186791999999995,
+ "allocatedBytes": 724176,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.27,
+ "avgMs": 5.268,
+ "p95Ms": 5.268,
+ "maxMs": 5.268
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.274,
+ "maxMs": 9.274
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.754,
+ "maxMs": 0.754
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 1.47,
+ "backgroundMs": 0.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.653,
+ "p50Ms": 0.653,
+ "p95Ms": 0.653,
+ "maxMs": 0.653,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.75,
+ "avgMs": 0.754,
+ "p50Ms": 0.754,
+ "p95Ms": 0.754,
+ "maxMs": 0.754,
+ "mainThreadMs": 0.75,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.6,
+ "avgMs": 0.599,
+ "p50Ms": 0.599,
+ "p95Ms": 0.599,
+ "maxMs": 0.599,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.6,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.059,
+ "p50Ms": 0.059,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 723128,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 463.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.06,
+ "avgMs": 4.059,
+ "p95Ms": 4.059,
+ "maxMs": 4.059
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.774,
+ "maxMs": 9.774
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.248,
+ "maxMs": 0.248
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.81,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.213,
+ "p50Ms": 0.213,
+ "p95Ms": 0.213,
+ "maxMs": 0.213,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.248,
+ "p50Ms": 0.248,
+ "p95Ms": 0.248,
+ "maxMs": 0.248,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.74,
+ "avgMs": 0.743,
+ "p50Ms": 0.743,
+ "p95Ms": 0.743,
+ "maxMs": 0.743,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.74,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 722968,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.63,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.15,
+ "avgMs": 2.145,
+ "p95Ms": 2.145,
+ "maxMs": 2.145
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.085,
+ "maxMs": 11.085
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.131,
+ "maxMs": 0.131
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0.4,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.363,
+ "p50Ms": 0.363,
+ "p95Ms": 0.363,
+ "maxMs": 0.363,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.07,
+ "avgMs": 0.017,
+ "p50Ms": 0.002,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.203,
+ "p50Ms": 0.203,
+ "p95Ms": 0.203,
+ "maxMs": 0.203,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 832888,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 463.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.49,
+ "avgMs": 3.488,
+ "p95Ms": 3.488,
+ "maxMs": 3.488
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.995,
+ "maxMs": 6.995
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.281,
+ "maxMs": 0.281
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.261,
+ "p50Ms": 0.261,
+ "p95Ms": 0.261,
+ "maxMs": 0.261,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.281,
+ "p50Ms": 0.281,
+ "p95Ms": 0.281,
+ "maxMs": 0.281,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.412,
+ "p50Ms": 0.412,
+ "p95Ms": 0.412,
+ "maxMs": 0.412,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.02,
+ "avgMs": 0.005,
+ "p50Ms": 0.002,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.068,
+ "p50Ms": 0.068,
+ "p95Ms": 0.068,
+ "maxMs": 0.068,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 849232,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 464.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.22,
+ "avgMs": 4.221,
+ "p95Ms": 4.221,
+ "maxMs": 4.221
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.827,
+ "maxMs": 8.827
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.309,
+ "maxMs": 0.309
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 15,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0.25,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.309,
+ "p50Ms": 0.309,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.176,
+ "p50Ms": 0.176,
+ "p95Ms": 0.176,
+ "maxMs": 0.176,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.02,
+ "avgMs": 0.005,
+ "p50Ms": 0.002,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 832856,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.27,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.73,
+ "avgMs": 1.73,
+ "p95Ms": 1.73,
+ "maxMs": 1.73
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.006,
+ "maxMs": 7.006
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.315,
+ "maxMs": 0.315
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 0.86,
+ "backgroundMs": 0.4,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.293,
+ "p50Ms": 0.293,
+ "p95Ms": 0.293,
+ "maxMs": 0.293,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.315,
+ "p50Ms": 0.315,
+ "p95Ms": 0.315,
+ "maxMs": 0.315,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.363,
+ "p50Ms": 0.363,
+ "p95Ms": 0.363,
+ "maxMs": 0.363,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 5,
+ "totalMs": 0.04,
+ "avgMs": 0.007,
+ "p50Ms": 0.002,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.209,
+ "p50Ms": 0.209,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0037125829999999915,
+ "allocatedBytes": 833424,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 464.22,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.87,
+ "avgMs": 3.868,
+ "p95Ms": 3.868,
+ "maxMs": 3.868
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.325,
+ "maxMs": 9.325
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.259,
+ "maxMs": 0.259
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 16,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0.83,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.174,
+ "p50Ms": 0.174,
+ "p95Ms": 0.174,
+ "maxMs": 0.174,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.259,
+ "p50Ms": 0.259,
+ "p95Ms": 0.259,
+ "maxMs": 0.259,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.72,
+ "avgMs": 0.723,
+ "p50Ms": 0.723,
+ "p95Ms": 0.723,
+ "maxMs": 0.723,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.72,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 9
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 9
+ },
+ "marker.visualProps": {
+ "count": 5,
+ "totalMs": 0.05,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.302,
+ "p50Ms": 0.302,
+ "p95Ms": 0.302,
+ "maxMs": 0.302,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 833304,
+ "heapSizeAfterBytes": 58720256
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-continuous-1k",
+ "name": "Continuous updates: 100 of 1k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:29:24.063Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6688,
+ "load": {
+ "commitMs": 1.58,
+ "readyMs": 807,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 26,
+ "mainThreadMs": 2.06,
+ "backgroundMs": 10.09,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.59,
+ "avgMs": 0.294,
+ "p50Ms": 0,
+ "p95Ms": 0.587,
+ "maxMs": 0.587,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.172,
+ "p50Ms": 0.172,
+ "p95Ms": 0.172,
+ "maxMs": 0.172,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 9.76,
+ "avgMs": 9.76,
+ "p50Ms": 9.76,
+ "p95Ms": 9.76,
+ "maxMs": 9.76,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.76,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.14,
+ "avgMs": 0.069,
+ "p50Ms": 0.04,
+ "p95Ms": 0.098,
+ "maxMs": 0.098,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 2000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.004,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 18
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.006,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 8
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.17,
+ "avgMs": 0.086,
+ "p50Ms": 0.052,
+ "p95Ms": 0.12,
+ "maxMs": 0.12,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 18
+ },
+ "marker.visualProps": {
+ "count": 4,
+ "totalMs": 0.36,
+ "avgMs": 0.091,
+ "p50Ms": 0.005,
+ "p95Ms": 0.347,
+ "maxMs": 0.347,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.94,
+ "avgMs": 0.468,
+ "p50Ms": 0.004,
+ "p95Ms": 0.932,
+ "maxMs": 0.932,
+ "mainThreadMs": 0.94,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 316544,
+ "heapSizeAfterBytes": 58720256
+ }
+ },
+ "frames": {
+ "frames": 349,
+ "durationMs": 5833.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 349,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 45.2,
+ "p50": 45.2,
+ "p95": 45.2,
+ "p99": 45.2,
+ "worst": 45.2
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 94.1,
+ "gpu": 93.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 2.8,
+ "layoutMeasure": 0.1,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 1.3,
+ "swapBuffers": 85,
+ "gpu": 84.8,
+ "total": 90.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 665,
+ "p50": 0.1,
+ "p95": 0.39,
+ "p99": 2.44,
+ "max": 10.71
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 18.07,
+ "max": 27.24
+ },
+ "lateFrames": 1,
+ "busyMs": 141.3,
+ "busyRatio": 0.0242,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5834.5,
+ "commits": {
+ "count": 50,
+ "totalMs": 128.97,
+ "avgMs": 2.579,
+ "p95Ms": 4.509,
+ "maxMs": 11.525
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 13.749,
+ "maxMs": 15.919
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.294,
+ "maxMs": 0.779
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 450,
+ "mainThreadMs": 31.72,
+ "backgroundMs": 19.77,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 12.58,
+ "avgMs": 0.252,
+ "p50Ms": 0.205,
+ "p95Ms": 0.516,
+ "maxMs": 0.723,
+ "mainThreadMs": 12.58,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 14.71,
+ "avgMs": 0.294,
+ "p50Ms": 0.244,
+ "p95Ms": 0.57,
+ "maxMs": 0.779,
+ "mainThreadMs": 14.71,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 15.9,
+ "avgMs": 0.318,
+ "p50Ms": 0.243,
+ "p95Ms": 0.717,
+ "maxMs": 0.95,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.9,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.96,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.037,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.38,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.019,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 450
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.49,
+ "avgMs": 0.01,
+ "p50Ms": 0.009,
+ "p95Ms": 0.019,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.04,
+ "p95Ms": 0.067,
+ "maxMs": 0.073,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.04,
+ "items": 450
+ },
+ "marker.visualProps": {
+ "count": 50,
+ "totalMs": 0.83,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.026,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 3.59,
+ "avgMs": 0.072,
+ "p50Ms": 0.063,
+ "p95Ms": 0.122,
+ "maxMs": 0.245,
+ "mainThreadMs": 3.59,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 329,
+ "afterLoadMB": 317.3,
+ "afterInteractionMB": 333.2,
+ "afterCleanupMB": 329.2,
+ "peakMB": 333.2,
+ "loadDeltaMB": -11.7,
+ "interactionDeltaMB": 15.9,
+ "retainedAfterCleanupMB": 0.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 329,
+ "residentMB": 475.8,
+ "javaHeapMB": 82.8,
+ "nativeHeapMB": 144.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 317.3,
+ "residentMB": 464.2,
+ "javaHeapMB": 63.3,
+ "nativeHeapMB": 152,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 333.2,
+ "residentMB": 480,
+ "javaHeapMB": 75.8,
+ "nativeHeapMB": 154.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 329.2,
+ "residentMB": 476.1,
+ "javaHeapMB": 75.9,
+ "nativeHeapMB": 149.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 7025624,
+ "gcCount": 2,
+ "gcTimeMs": 0.01725233300000001,
+ "heapSizeAfterMB": 60
+ },
+ "android": {
+ "javaBytesAllocated": 38838912,
+ "gcCount": 1,
+ "gcTimeMs": 94,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 2132560
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 721,
+ "wallMs": 5838,
+ "percent": 12.4,
+ "threadsBefore": 101,
+ "threadsAfter": 100,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 51000,
+ "coordinates": 51000,
+ "estimatedBytes": 3653136
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5828.9,
+ "commits": {
+ "count": 50,
+ "totalMs": 128.97,
+ "avgMs": 2.579,
+ "p95Ms": 4.509,
+ "maxMs": 11.525
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 13.749,
+ "maxMs": 15.919
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.294,
+ "maxMs": 0.779
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 450,
+ "mainThreadMs": 31.72,
+ "backgroundMs": 19.77,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 12.58,
+ "avgMs": 0.252,
+ "p50Ms": 0.205,
+ "p95Ms": 0.516,
+ "maxMs": 0.723,
+ "mainThreadMs": 12.58,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 14.71,
+ "avgMs": 0.294,
+ "p50Ms": 0.244,
+ "p95Ms": 0.57,
+ "maxMs": 0.779,
+ "mainThreadMs": 14.71,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 15.9,
+ "avgMs": 0.318,
+ "p50Ms": 0.243,
+ "p95Ms": 0.717,
+ "maxMs": 0.95,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.9,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.96,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.037,
+ "maxMs": 0.04,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.38,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.019,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 450
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.49,
+ "avgMs": 0.01,
+ "p50Ms": 0.009,
+ "p95Ms": 0.019,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.04,
+ "p95Ms": 0.067,
+ "maxMs": 0.073,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.04,
+ "items": 450
+ },
+ "marker.visualProps": {
+ "count": 50,
+ "totalMs": 0.83,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.026,
+ "maxMs": 0.036,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 3.59,
+ "avgMs": 0.072,
+ "p50Ms": 0.063,
+ "p95Ms": 0.122,
+ "maxMs": 0.245,
+ "mainThreadMs": 3.59,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.01725233300000001,
+ "allocatedBytes": 6838368,
+ "heapSizeAfterBytes": 62914560
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "mutations-continuous-10k",
+ "name": "Continuous updates: 100 of 10k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:29:33.958Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6638,
+ "load": {
+ "commitMs": 14.33,
+ "readyMs": 762,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.98,
+ "backgroundMs": 0.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0.93,
+ "avgMs": 0.463,
+ "p50Ms": 0,
+ "p95Ms": 0.926,
+ "maxMs": 0.926,
+ "mainThreadMs": 0.93,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.074,
+ "p50Ms": 0.074,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.21,
+ "p50Ms": 0.21,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.016,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.022,
+ "p50Ms": 0.017,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.064,
+ "p50Ms": 0.049,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.63,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.015,
+ "maxMs": 0.13,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.35,
+ "avgMs": 0.675,
+ "p50Ms": 0.003,
+ "p95Ms": 1.347,
+ "maxMs": 1.347,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0023047499999999943,
+ "allocatedBytes": 2720408,
+ "heapSizeAfterBytes": 62914560
+ }
+ },
+ "frames": {
+ "frames": 347,
+ "durationMs": 5787.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 347,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.29,
+ "p50": 17.29,
+ "p95": 17.29,
+ "p99": 17.29,
+ "worst": 17.29
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.1,
+ "inputHandling": 0,
+ "animation": 3.1,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.3,
+ "commandIssue": 6.6,
+ "swapBuffers": 45.4,
+ "gpu": 85.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 2.3,
+ "swapBuffers": 15.7,
+ "gpu": 29.7,
+ "total": 34.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 651,
+ "p50": 0.09,
+ "p95": 8.04,
+ "p99": 13.27,
+ "max": 14.62
+ },
+ "frameGapMs": {
+ "p50": 16.71,
+ "p95": 19.79,
+ "max": 33.92
+ },
+ "lateFrames": 2,
+ "busyMs": 571.9,
+ "busyRatio": 0.0988,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5788.7,
+ "commits": {
+ "count": 50,
+ "totalMs": 615.49,
+ "avgMs": 12.31,
+ "p95Ms": 15.637,
+ "maxMs": 16.551
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 7.069,
+ "maxMs": 19.773
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.913,
+ "maxMs": 1.262
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 89.97,
+ "backgroundMs": 20.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 44.13,
+ "avgMs": 0.883,
+ "p50Ms": 0.875,
+ "p95Ms": 1.149,
+ "maxMs": 1.235,
+ "mainThreadMs": 44.13,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 45.65,
+ "avgMs": 0.913,
+ "p50Ms": 0.907,
+ "p95Ms": 1.185,
+ "maxMs": 1.262,
+ "mainThreadMs": 45.65,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 16.13,
+ "avgMs": 0.323,
+ "p50Ms": 0.275,
+ "p95Ms": 0.54,
+ "maxMs": 1.195,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.13,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.7,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.018,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.62,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.02,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.93,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.031,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 3200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.32,
+ "avgMs": 0.046,
+ "p50Ms": 0.044,
+ "p95Ms": 0.069,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.32,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.19,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 329.3,
+ "afterLoadMB": 396.3,
+ "afterInteractionMB": 327.8,
+ "afterCleanupMB": 323.8,
+ "peakMB": 396.3,
+ "loadDeltaMB": 67,
+ "interactionDeltaMB": -68.5,
+ "retainedAfterCleanupMB": -5.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 329.3,
+ "residentMB": 476.2,
+ "javaHeapMB": 76,
+ "nativeHeapMB": 149.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 396.3,
+ "residentMB": 543,
+ "javaHeapMB": 81.4,
+ "nativeHeapMB": 211.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 327.8,
+ "residentMB": 474.6,
+ "javaHeapMB": 65.3,
+ "nativeHeapMB": 154.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 323.8,
+ "residentMB": 470.7,
+ "javaHeapMB": 65.6,
+ "nativeHeapMB": 149.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 46610720,
+ "gcCount": 12,
+ "gcTimeMs": 0.018941790999999958,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 169746528,
+ "gcCount": 7,
+ "gcTimeMs": 366,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -60237520
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1347,
+ "wallMs": 5794,
+ "percent": 23.2,
+ "threadsBefore": 102,
+ "threadsAfter": 102,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 510000,
+ "coordinates": 510000,
+ "estimatedBytes": 36525893
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717815
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5784.9,
+ "commits": {
+ "count": 50,
+ "totalMs": 615.49,
+ "avgMs": 12.31,
+ "p95Ms": 15.637,
+ "maxMs": 16.551
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 7.069,
+ "maxMs": 19.773
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.913,
+ "maxMs": 1.262
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 89.97,
+ "backgroundMs": 20.71,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 44.13,
+ "avgMs": 0.883,
+ "p50Ms": 0.875,
+ "p95Ms": 1.149,
+ "maxMs": 1.235,
+ "mainThreadMs": 44.13,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 45.65,
+ "avgMs": 0.913,
+ "p50Ms": 0.907,
+ "p95Ms": 1.185,
+ "maxMs": 1.262,
+ "mainThreadMs": 45.65,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 16.13,
+ "avgMs": 0.323,
+ "p50Ms": 0.275,
+ "p95Ms": 0.54,
+ "maxMs": 1.195,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.13,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.7,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.018,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.62,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.02,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.93,
+ "avgMs": 0.019,
+ "p50Ms": 0.017,
+ "p95Ms": 0.031,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 3200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 2.32,
+ "avgMs": 0.046,
+ "p50Ms": 0.044,
+ "p95Ms": 0.069,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.32,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.19,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 12,
+ "gcTimeMs": 0.018941790999999958,
+ "allocatedBytes": 46422728,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-100",
+ "name": "Polyline, 100 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:29:42.598Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5914,
+ "load": {
+ "commitMs": 1.05,
+ "readyMs": 743,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58064,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 303,
+ "durationMs": 5054.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.01,
+ "p50": 17.01,
+ "p95": 17.01,
+ "p99": 17.01,
+ "worst": 17.01
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.2,
+ "inputHandling": 0,
+ "animation": 6.5,
+ "layoutMeasure": 0.4,
+ "draw": 1,
+ "sync": 0.3,
+ "commandIssue": 6.2,
+ "swapBuffers": 65.3,
+ "gpu": 83
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.8,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.1,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 2.1,
+ "swapBuffers": 22.2,
+ "gpu": 28.2,
+ "total": 34
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 580,
+ "p50": 0.1,
+ "p95": 0.3,
+ "p99": 0.47,
+ "max": 1.12
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.59,
+ "max": 21.43
+ },
+ "lateFrames": 0,
+ "busyMs": 74.5,
+ "busyRatio": 0.0147,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5056.3,
+ "commits": {
+ "count": 8,
+ "totalMs": 5.3,
+ "avgMs": 0.663,
+ "p95Ms": 1.157,
+ "maxMs": 1.157
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 12.536,
+ "maxMs": 15.516
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 0.485,
+ "maxMs": 0.772
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 4.72,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 3.88,
+ "avgMs": 0.485,
+ "p50Ms": 0.406,
+ "p95Ms": 0.772,
+ "maxMs": 0.772,
+ "mainThreadMs": 3.88,
+ "backgroundMs": 0,
+ "items": 800
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.84,
+ "avgMs": 0.21,
+ "p50Ms": 0.17,
+ "p95Ms": 0.356,
+ "maxMs": 0.356,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 323.9,
+ "afterLoadMB": 386,
+ "afterInteractionMB": 340.2,
+ "afterCleanupMB": 336.2,
+ "peakMB": 386,
+ "loadDeltaMB": 62.1,
+ "interactionDeltaMB": -45.8,
+ "retainedAfterCleanupMB": 12.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 323.9,
+ "residentMB": 470.7,
+ "javaHeapMB": 65.7,
+ "nativeHeapMB": 149.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 386,
+ "residentMB": 532.8,
+ "javaHeapMB": 67.5,
+ "nativeHeapMB": 211.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 340.2,
+ "residentMB": 487.1,
+ "javaHeapMB": 67.1,
+ "nativeHeapMB": 165.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 336.2,
+ "residentMB": 483.1,
+ "javaHeapMB": 67.2,
+ "nativeHeapMB": 160.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 565944,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 5272928,
+ "gcCount": 1,
+ "gcTimeMs": 58,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -48520080
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 601,
+ "wallMs": 5060,
+ "percent": 11.9,
+ "threadsBefore": 104,
+ "threadsAfter": 104,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900,
+ "estimatedBytes": 40852
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4543
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 303.73,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.407,
+ "p95Ms": 0.407,
+ "maxMs": 0.407
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.377,
+ "maxMs": 3.377
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.461,
+ "maxMs": 0.461
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.46,
+ "avgMs": 0.461,
+ "p50Ms": 0.461,
+ "p95Ms": 0.461,
+ "maxMs": 0.461,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 38168,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 317.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.44,
+ "p95Ms": 0.44,
+ "maxMs": 0.44
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.516,
+ "maxMs": 15.516
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.357,
+ "maxMs": 0.357
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.357,
+ "p50Ms": 0.357,
+ "p95Ms": 0.357,
+ "maxMs": 0.357,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37160,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 314.2,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.55,
+ "p95Ms": 0.55,
+ "maxMs": 0.55
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.275,
+ "maxMs": 13.275
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.626,
+ "maxMs": 0.626
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.626,
+ "p50Ms": 0.626,
+ "p95Ms": 0.626,
+ "maxMs": 0.626,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36496,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 312.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.157,
+ "p95Ms": 1.157,
+ "maxMs": 1.157
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.204,
+ "maxMs": 13.204
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.647,
+ "maxMs": 0.647
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.647,
+ "p50Ms": 0.647,
+ "p95Ms": 0.647,
+ "maxMs": 0.647,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37360,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 317.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.696,
+ "p95Ms": 0.696,
+ "maxMs": 0.696
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.677,
+ "maxMs": 14.677
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.217,
+ "maxMs": 0.217
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.217,
+ "p50Ms": 0.217,
+ "p95Ms": 0.217,
+ "maxMs": 0.217,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36392,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 314.39,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.817,
+ "p95Ms": 0.817,
+ "maxMs": 0.817
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.532,
+ "maxMs": 12.532
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.772,
+ "maxMs": 0.772
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.772,
+ "p50Ms": 0.772,
+ "p95Ms": 0.772,
+ "maxMs": 0.772,
+ "mainThreadMs": 0.77,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37352,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 314.76,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.613,
+ "p95Ms": 0.613,
+ "maxMs": 0.613
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.202,
+ "maxMs": 15.202
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.406,
+ "maxMs": 0.406
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.406,
+ "p50Ms": 0.406,
+ "p95Ms": 0.406,
+ "maxMs": 0.406,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 39312,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 314.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.622,
+ "p95Ms": 0.622,
+ "maxMs": 0.622
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.508,
+ "maxMs": 12.508
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.394,
+ "maxMs": 0.394
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.394,
+ "p50Ms": 0.394,
+ "p95Ms": 0.394,
+ "maxMs": 0.394,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37280,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-1k",
+ "name": "Polyline, 1k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:29:51.247Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5925,
+ "load": {
+ "commitMs": 1.38,
+ "readyMs": 750,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 260520,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 303,
+ "durationMs": 5064.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 303,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 0,
+ "renderTotalMs": {
+ "average": 0,
+ "p50": 0,
+ "p95": 0,
+ "p99": 0,
+ "worst": 0
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0,
+ "total": 0
+ },
+ "missedDeadline": 0
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 580,
+ "p50": 0.09,
+ "p95": 0.35,
+ "p99": 1.01,
+ "max": 3.88
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 18.25,
+ "max": 20.65
+ },
+ "lateFrames": 0,
+ "busyMs": 85.2,
+ "busyRatio": 0.0168,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5067.6,
+ "commits": {
+ "count": 8,
+ "totalMs": 8.17,
+ "avgMs": 1.022,
+ "p95Ms": 1.483,
+ "maxMs": 1.483
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 11.326,
+ "maxMs": 13.247
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 0.739,
+ "maxMs": 1.151
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 6.84,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 5.91,
+ "avgMs": 0.739,
+ "p50Ms": 0.645,
+ "p95Ms": 1.151,
+ "maxMs": 1.151,
+ "mainThreadMs": 5.91,
+ "backgroundMs": 0,
+ "items": 8000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.93,
+ "avgMs": 0.232,
+ "p50Ms": 0.27,
+ "p95Ms": 0.311,
+ "maxMs": 0.311,
+ "mainThreadMs": 0.93,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 336.3,
+ "afterLoadMB": 398.5,
+ "afterInteractionMB": 334.2,
+ "afterCleanupMB": 330.2,
+ "peakMB": 398.5,
+ "loadDeltaMB": 62.2,
+ "interactionDeltaMB": -64.3,
+ "retainedAfterCleanupMB": -6.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 336.3,
+ "residentMB": 483.1,
+ "javaHeapMB": 67.4,
+ "nativeHeapMB": 161,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 398.5,
+ "residentMB": 545.4,
+ "javaHeapMB": 69.2,
+ "nativeHeapMB": 223.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 334.2,
+ "residentMB": 481.3,
+ "javaHeapMB": 67.7,
+ "nativeHeapMB": 158.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 330.2,
+ "residentMB": 477.2,
+ "javaHeapMB": 67.8,
+ "nativeHeapMB": 154.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1737448,
+ "gcCount": 1,
+ "gcTimeMs": 0.008637457999999987,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 6555456,
+ "gcCount": 1,
+ "gcTimeMs": 79,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -67451200
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 643,
+ "wallMs": 5072,
+ "percent": 12.7,
+ "threadsBefore": 106,
+ "threadsAfter": 105,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 9000,
+ "estimatedBytes": 403674
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44865
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 316.3,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.438,
+ "p95Ms": 0.438,
+ "maxMs": 0.438
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.145,
+ "maxMs": 12.145
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.607,
+ "maxMs": 0.607
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.607,
+ "p50Ms": 0.607,
+ "p95Ms": 0.607,
+ "maxMs": 0.607,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170808,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 312.65,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.18,
+ "avgMs": 1.18,
+ "p95Ms": 1.18,
+ "maxMs": 1.18
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.41,
+ "maxMs": 11.41
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.642,
+ "maxMs": 0.642
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p50Ms": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170576,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 317.14,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.483,
+ "p95Ms": 1.483,
+ "maxMs": 1.483
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.247,
+ "maxMs": 13.247
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.151,
+ "maxMs": 1.151
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.15,
+ "avgMs": 1.151,
+ "p50Ms": 1.151,
+ "p95Ms": 1.151,
+ "maxMs": 1.151,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170200,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 315.12,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.558,
+ "p95Ms": 0.558,
+ "maxMs": 0.558
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 4.859,
+ "maxMs": 4.859
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.571,
+ "maxMs": 0.571
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.57,
+ "avgMs": 0.571,
+ "p50Ms": 0.571,
+ "p95Ms": 0.571,
+ "maxMs": 0.571,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.008637457999999987,
+ "allocatedBytes": 171104,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 315.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.97,
+ "p95Ms": 0.97,
+ "maxMs": 0.97
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.976,
+ "maxMs": 12.976
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.645,
+ "maxMs": 0.645
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.645,
+ "p50Ms": 0.645,
+ "p95Ms": 0.645,
+ "maxMs": 0.645,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170232,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 316.27,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.08,
+ "avgMs": 1.082,
+ "p95Ms": 1.082,
+ "maxMs": 1.082
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.746,
+ "maxMs": 12.746
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.65,
+ "maxMs": 0.65
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.65,
+ "p50Ms": 0.65,
+ "p95Ms": 0.65,
+ "maxMs": 0.65,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 181288,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 314.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.985,
+ "p95Ms": 0.985,
+ "maxMs": 0.985
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.348,
+ "maxMs": 12.348
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.728,
+ "maxMs": 0.728
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.73,
+ "avgMs": 0.728,
+ "p50Ms": 0.728,
+ "p95Ms": 0.728,
+ "maxMs": 0.728,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 183392,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 314.96,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.477,
+ "p95Ms": 1.477,
+ "maxMs": 1.477
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.874,
+ "maxMs": 10.874
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.916,
+ "maxMs": 0.916
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.916,
+ "p50Ms": 0.916,
+ "p95Ms": 0.916,
+ "maxMs": 0.916,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 181304,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-10k",
+ "name": "Polyline, 10k points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:29:59.941Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5965,
+ "load": {
+ "commitMs": 1.67,
+ "readyMs": 744,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.072,
+ "p50Ms": 0.072,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1922568,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 305,
+ "durationMs": 5097.6,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 305,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.89,
+ "p50": 16.89,
+ "p95": 16.89,
+ "p99": 16.89,
+ "worst": 16.89
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.5,
+ "inputHandling": 0,
+ "animation": 2.3,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.2,
+ "commandIssue": 2.4,
+ "swapBuffers": 25.2,
+ "gpu": 92.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.8,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 0.8,
+ "swapBuffers": 8.5,
+ "gpu": 31.3,
+ "total": 33.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 590,
+ "p50": 0.09,
+ "p95": 0.28,
+ "p99": 5.15,
+ "max": 9.64
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 18.09,
+ "max": 24.48
+ },
+ "lateFrames": 0,
+ "busyMs": 118.2,
+ "busyRatio": 0.0232,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5098.3,
+ "commits": {
+ "count": 8,
+ "totalMs": 13.28,
+ "avgMs": 1.661,
+ "p95Ms": 2.608,
+ "maxMs": 2.608
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 8.607,
+ "maxMs": 18.361
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 3.299,
+ "maxMs": 6.556
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 26.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 26.39,
+ "avgMs": 3.299,
+ "p50Ms": 2.959,
+ "p95Ms": 6.556,
+ "maxMs": 6.556,
+ "mainThreadMs": 26.39,
+ "backgroundMs": 0,
+ "items": 80000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.57,
+ "avgMs": 0.141,
+ "p50Ms": 0.112,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 330.3,
+ "afterLoadMB": 395.1,
+ "afterInteractionMB": 370.6,
+ "afterCleanupMB": 366.6,
+ "peakMB": 395.1,
+ "loadDeltaMB": 64.8,
+ "interactionDeltaMB": -24.5,
+ "retainedAfterCleanupMB": 36.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 330.3,
+ "residentMB": 477.4,
+ "javaHeapMB": 68,
+ "nativeHeapMB": 154.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 395.1,
+ "residentMB": 542.3,
+ "javaHeapMB": 71.5,
+ "nativeHeapMB": 217.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 370.6,
+ "residentMB": 517.8,
+ "javaHeapMB": 70,
+ "nativeHeapMB": 191.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 366.6,
+ "residentMB": 513.8,
+ "javaHeapMB": 70.1,
+ "nativeHeapMB": 186.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 9941448,
+ "gcCount": 5,
+ "gcTimeMs": 0.0052175420000000194,
+ "heapSizeAfterMB": 64
+ },
+ "android": {
+ "javaBytesAllocated": 21457296,
+ "gcCount": 1,
+ "gcTimeMs": 59,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -27342112
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 671,
+ "wallMs": 5102,
+ "percent": 13.2,
+ "threadsBefore": 107,
+ "threadsAfter": 107,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 90000,
+ "estimatedBytes": 4030707
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 324.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.155,
+ "p95Ms": 1.155,
+ "maxMs": 1.155
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.624,
+ "maxMs": 15.624
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.34,
+ "maxMs": 2.34
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.34,
+ "avgMs": 2.34,
+ "p50Ms": 2.34,
+ "p95Ms": 2.34,
+ "maxMs": 2.34,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1062128,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 329.31,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.61,
+ "avgMs": 2.608,
+ "p95Ms": 2.608,
+ "maxMs": 2.608
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 18.361,
+ "maxMs": 18.361
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.395,
+ "maxMs": 3.395
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.4,
+ "avgMs": 3.395,
+ "p50Ms": 3.395,
+ "p95Ms": 3.395,
+ "maxMs": 3.395,
+ "mainThreadMs": 3.4,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013150000000000106,
+ "allocatedBytes": 1062008,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 315.85,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.37,
+ "avgMs": 1.371,
+ "p95Ms": 1.371,
+ "maxMs": 1.371
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.613,
+ "maxMs": 9.613
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 6.556,
+ "maxMs": 6.556
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 6.56,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 6.56,
+ "avgMs": 6.556,
+ "p50Ms": 6.556,
+ "p95Ms": 6.556,
+ "maxMs": 6.556,
+ "mainThreadMs": 6.56,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061320,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 318.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.51,
+ "avgMs": 1.509,
+ "p95Ms": 1.509,
+ "maxMs": 1.509
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.002,
+ "maxMs": 9.002
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.996,
+ "maxMs": 2.996
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3,
+ "avgMs": 2.996,
+ "p50Ms": 2.996,
+ "p95Ms": 2.996,
+ "maxMs": 2.996,
+ "mainThreadMs": 3,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1062320,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 313.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.235,
+ "p95Ms": 1.235,
+ "maxMs": 1.235
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 5.002,
+ "maxMs": 5.002
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.959,
+ "maxMs": 2.959
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.96,
+ "avgMs": 2.959,
+ "p50Ms": 2.959,
+ "p95Ms": 2.959,
+ "maxMs": 2.959,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001157458,
+ "allocatedBytes": 1061336,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 315.33,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.683,
+ "p95Ms": 1.683,
+ "maxMs": 1.683
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 4.69,
+ "maxMs": 4.69
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.747,
+ "maxMs": 2.747
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.75,
+ "avgMs": 2.747,
+ "p50Ms": 2.747,
+ "p95Ms": 2.747,
+ "maxMs": 2.747,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1173240,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 317.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.76,
+ "avgMs": 1.761,
+ "p95Ms": 1.761,
+ "maxMs": 1.761
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.745,
+ "maxMs": 3.745
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.437,
+ "maxMs": 2.437
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.44,
+ "avgMs": 2.437,
+ "p50Ms": 2.437,
+ "p95Ms": 2.437,
+ "maxMs": 2.437,
+ "mainThreadMs": 2.44,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0008984169999999847,
+ "allocatedBytes": 1175352,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 314.12,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.96,
+ "avgMs": 1.961,
+ "p95Ms": 1.961,
+ "maxMs": 1.961
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.815,
+ "maxMs": 2.815
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.963,
+ "maxMs": 2.963
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.96,
+ "avgMs": 2.963,
+ "p50Ms": 2.963,
+ "p95Ms": 2.963,
+ "maxMs": 2.963,
+ "mainThreadMs": 2.96,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1173304,
+ "heapSizeAfterBytes": 67108864
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polyline-100k",
+ "name": "Polyline, 100k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "One 100000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:09.276Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6478,
+ "load": {
+ "commitMs": 6.17,
+ "readyMs": 763,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.101,
+ "p50Ms": 0.101,
+ "p95Ms": 0.101,
+ "maxMs": 0.101,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.007243916000000017,
+ "allocatedBytes": 18680160,
+ "heapSizeAfterBytes": 67108864
+ }
+ },
+ "frames": {
+ "frames": 330,
+ "durationMs": 5640.6,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.6,
+ "p50": 58,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 17.07,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 322,
+ 0,
+ 0,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 8,
+ "jankRatio": 0.0242,
+ "droppedFrames": 8,
+ "longFrames": 0,
+ "overBudgetFrames": 8,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.9,
+ "p50": 16.9,
+ "p95": 16.9,
+ "p99": 16.9,
+ "worst": 16.9
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.5,
+ "inputHandling": 0,
+ "animation": 1.9,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 4,
+ "swapBuffers": 66.6,
+ "gpu": 91.5
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.6,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.3,
+ "swapBuffers": 22.5,
+ "gpu": 30.9,
+ "total": 33.8
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 657,
+ "p50": 0.07,
+ "p95": 40.96,
+ "p99": 69.15,
+ "max": 109.71
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 30.59,
+ "max": 73.21
+ },
+ "lateFrames": 17,
+ "busyMs": 2819.6,
+ "busyRatio": 0.4998,
+ "longTasks": {
+ "count": 9,
+ "totalMs": 573.1,
+ "maxMs": 72.1,
+ "source": "performance-observer"
+ },
+ "durationMs": 5641.6,
+ "commits": {
+ "count": 8,
+ "totalMs": 48.2,
+ "avgMs": 6.025,
+ "p95Ms": 6.234,
+ "maxMs": 6.234
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 13.771,
+ "maxMs": 20.331
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 15.01,
+ "maxMs": 16.343
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 120.51,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 120.08,
+ "avgMs": 15.01,
+ "p50Ms": 14.659,
+ "p95Ms": 16.343,
+ "maxMs": 16.343,
+ "mainThreadMs": 120.08,
+ "backgroundMs": 0,
+ "items": 800000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.42,
+ "avgMs": 0.106,
+ "p50Ms": 0.085,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0.42,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 364.9,
+ "afterLoadMB": 352.4,
+ "afterInteractionMB": 421.7,
+ "afterCleanupMB": 417.7,
+ "peakMB": 421.7,
+ "loadDeltaMB": -12.5,
+ "interactionDeltaMB": 69.3,
+ "retainedAfterCleanupMB": 52.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 364.9,
+ "residentMB": 512.1,
+ "javaHeapMB": 70.2,
+ "nativeHeapMB": 186.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 352.4,
+ "residentMB": 499.7,
+ "javaHeapMB": 75.4,
+ "nativeHeapMB": 169.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 421.7,
+ "residentMB": 568.9,
+ "javaHeapMB": 89.9,
+ "nativeHeapMB": 215.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 417.7,
+ "residentMB": 565,
+ "javaHeapMB": 90,
+ "nativeHeapMB": 210.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 95259304,
+ "gcCount": 26,
+ "gcTimeMs": 0.013053210999999953,
+ "heapSizeAfterMB": 72
+ },
+ "android": {
+ "javaBytesAllocated": 144762272,
+ "gcCount": 4,
+ "gcTimeMs": 209,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 47548384
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1620,
+ "wallMs": 5645,
+ "percent": 28.7,
+ "threadsBefore": 110,
+ "threadsAfter": 109,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900000,
+ "estimatedBytes": 40300927
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100000,
+ "estimatedBytes": 4477935
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 360.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.52,
+ "avgMs": 5.522,
+ "p95Ms": 5.522,
+ "maxMs": 5.522
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.557,
+ "maxMs": 8.557
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 16.343,
+ "maxMs": 16.343
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 16.34,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 16.34,
+ "avgMs": 16.343,
+ "p50Ms": 16.343,
+ "p95Ms": 16.343,
+ "maxMs": 16.343,
+ "mainThreadMs": 16.34,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0005801249999999869,
+ "allocatedBytes": 10424856,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 382.28,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.06,
+ "avgMs": 6.063,
+ "p95Ms": 6.063,
+ "maxMs": 6.063
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 20.331,
+ "maxMs": 20.331
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.477,
+ "maxMs": 14.477
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.48,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.48,
+ "avgMs": 14.477,
+ "p50Ms": 14.477,
+ "p95Ms": 14.477,
+ "maxMs": 14.477,
+ "mainThreadMs": 14.48,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.000586958999999998,
+ "allocatedBytes": 10422704,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 382.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.23,
+ "avgMs": 6.234,
+ "p95Ms": 6.234,
+ "maxMs": 6.234
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.967,
+ "maxMs": 16.967
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 15.359,
+ "maxMs": 15.359
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 15.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 15.36,
+ "avgMs": 15.359,
+ "p50Ms": 15.359,
+ "p95Ms": 15.359,
+ "maxMs": 15.359,
+ "mainThreadMs": 15.36,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0006605829999999924,
+ "allocatedBytes": 10422120,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 3
+ },
+ "wallMs": 382.47,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.12,
+ "avgMs": 6.121,
+ "p95Ms": 6.121,
+ "maxMs": 6.121
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 16.044,
+ "maxMs": 16.044
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.659,
+ "maxMs": 14.659
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.66,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.66,
+ "avgMs": 14.659,
+ "p50Ms": 14.659,
+ "p95Ms": 14.659,
+ "maxMs": 14.659,
+ "mainThreadMs": 14.66,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0006086249999999738,
+ "allocatedBytes": 10423008,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 4
+ },
+ "wallMs": 383.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.2,
+ "avgMs": 6.201,
+ "p95Ms": 6.201,
+ "maxMs": 6.201
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.666,
+ "maxMs": 15.666
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 15.44,
+ "maxMs": 15.44
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 15.44,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 15.44,
+ "avgMs": 15.44,
+ "p50Ms": 15.44,
+ "p95Ms": 15.44,
+ "maxMs": 15.44,
+ "mainThreadMs": 15.44,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0005733340000000364,
+ "allocatedBytes": 10422184,
+ "heapSizeAfterBytes": 71303168
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 381.24,
+ "commits": {
+ "count": 1,
+ "totalMs": 6,
+ "avgMs": 5.998,
+ "p95Ms": 5.998,
+ "maxMs": 5.998
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.387,
+ "maxMs": 7.387
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.368,
+ "maxMs": 14.368
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.37,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.37,
+ "avgMs": 14.368,
+ "p50Ms": 14.368,
+ "p95Ms": 14.368,
+ "maxMs": 14.368,
+ "mainThreadMs": 14.37,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0014992090000000013,
+ "allocatedBytes": 11541872,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 382.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.99,
+ "avgMs": 5.995,
+ "p95Ms": 5.995,
+ "maxMs": 5.995
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.418,
+ "maxMs": 13.418
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.917,
+ "maxMs": 14.917
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.92,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.92,
+ "avgMs": 14.917,
+ "p50Ms": 14.917,
+ "p95Ms": 14.917,
+ "maxMs": 14.917,
+ "mainThreadMs": 14.92,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0012355419999999784,
+ "allocatedBytes": 11543968,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 382.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.06,
+ "avgMs": 6.064,
+ "p95Ms": 6.064,
+ "maxMs": 6.064
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.799,
+ "maxMs": 11.799
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 14.521,
+ "maxMs": 14.521
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 14.52,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 14.52,
+ "avgMs": 14.521,
+ "p50Ms": 14.521,
+ "p95Ms": 14.521,
+ "maxMs": 14.521,
+ "mainThreadMs": 14.52,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.0013609169999999615,
+ "allocatedBytes": 11541896,
+ "heapSizeAfterBytes": 75497472
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygon-100",
+ "name": "Polygon, 100 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:16.986Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4977,
+ "load": {
+ "commitMs": 0.84,
+ "readyMs": 765,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 56048,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ "frames": {
+ "frames": 246,
+ "durationMs": 4114.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 246,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 9.81,
+ "p50": 9.81,
+ "p95": 9.81,
+ "p99": 9.81,
+ "worst": 9.81
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.3,
+ "inputHandling": 0,
+ "animation": 5.8,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.3,
+ "commandIssue": 7.9,
+ "swapBuffers": 80.3,
+ "gpu": 79.6
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.5,
+ "swapBuffers": 15.8,
+ "gpu": 15.6,
+ "total": 19.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 480,
+ "p50": 0.08,
+ "p95": 0.32,
+ "p99": 0.88,
+ "max": 2.8
+ },
+ "frameGapMs": {
+ "p50": 16.64,
+ "p95": 17.75,
+ "max": 22.43
+ },
+ "lateFrames": 0,
+ "busyMs": 61.7,
+ "busyRatio": 0.015,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4115.9,
+ "commits": {
+ "count": 5,
+ "totalMs": 3.66,
+ "avgMs": 0.731,
+ "p95Ms": 1.029,
+ "maxMs": 1.029
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 13.344,
+ "maxMs": 14.973
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 0.657,
+ "maxMs": 1.023
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 3.9,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 3.28,
+ "avgMs": 0.657,
+ "p50Ms": 0.833,
+ "p95Ms": 1.023,
+ "maxMs": 1.023,
+ "mainThreadMs": 3.28,
+ "backgroundMs": 0,
+ "items": 500
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.62,
+ "avgMs": 0.154,
+ "p50Ms": 0.099,
+ "p95Ms": 0.254,
+ "maxMs": 0.254,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 417.9,
+ "afterLoadMB": 365.7,
+ "afterInteractionMB": 414.8,
+ "afterCleanupMB": 410.8,
+ "peakMB": 417.9,
+ "loadDeltaMB": -52.2,
+ "interactionDeltaMB": 49.1,
+ "retainedAfterCleanupMB": -7.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 417.9,
+ "residentMB": 565.1,
+ "javaHeapMB": 90.1,
+ "nativeHeapMB": 210.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 365.7,
+ "residentMB": 513.3,
+ "javaHeapMB": 77.5,
+ "nativeHeapMB": 171,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 414.8,
+ "residentMB": 562.1,
+ "javaHeapMB": 82.4,
+ "nativeHeapMB": 216.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 410.8,
+ "residentMB": 558.2,
+ "javaHeapMB": 82.5,
+ "nativeHeapMB": 211.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 394856,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 72
+ },
+ "android": {
+ "javaBytesAllocated": 5185472,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 47697680
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 462,
+ "wallMs": 4119,
+ "percent": 11.2,
+ "threadsBefore": 111,
+ "threadsAfter": 110,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 600,
+ "estimatedBytes": 27462
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4577
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 312.59,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.264,
+ "p95Ms": 0.264,
+ "maxMs": 0.264
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 11.844,
+ "maxMs": 11.844
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.251,
+ "maxMs": 0.251
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.251,
+ "p50Ms": 0.251,
+ "p95Ms": 0.251,
+ "maxMs": 0.251,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37888,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 317.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.029,
+ "p95Ms": 1.029,
+ "maxMs": 1.029
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.973,
+ "maxMs": 14.973
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.833,
+ "maxMs": 0.833
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.83,
+ "avgMs": 0.833,
+ "p50Ms": 0.833,
+ "p95Ms": 0.833,
+ "maxMs": 0.833,
+ "mainThreadMs": 0.83,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37240,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 316.12,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.816,
+ "p95Ms": 0.816,
+ "maxMs": 0.816
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.756,
+ "maxMs": 12.756
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.86,
+ "maxMs": 0.86
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.86,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.86,
+ "avgMs": 0.86,
+ "p50Ms": 0.86,
+ "p95Ms": 0.86,
+ "maxMs": 0.86,
+ "mainThreadMs": 0.86,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36512,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 313.09,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.76,
+ "p95Ms": 0.76,
+ "maxMs": 0.76
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.282,
+ "maxMs": 12.282
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.316,
+ "maxMs": 0.316
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 37384,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 316.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.79,
+ "avgMs": 0.789,
+ "p95Ms": 0.789,
+ "maxMs": 0.789
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.864,
+ "maxMs": 14.864
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.023,
+ "maxMs": 1.023
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.02,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.02,
+ "avgMs": 1.023,
+ "p50Ms": 1.023,
+ "p95Ms": 1.023,
+ "maxMs": 1.023,
+ "mainThreadMs": 1.02,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 36312,
+ "heapSizeAfterBytes": 75497472
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygon-1k",
+ "name": "Polygon, 1k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:24.706Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4966,
+ "load": {
+ "commitMs": 0.97,
+ "readyMs": 765,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.112,
+ "p50Ms": 0.112,
+ "p95Ms": 0.112,
+ "maxMs": 0.112,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 260840,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ "frames": {
+ "frames": 246,
+ "durationMs": 4115,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 246,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 11.68,
+ "p50": 11.68,
+ "p95": 11.68,
+ "p99": 11.68,
+ "worst": 11.68
+ },
+ "phaseSharePct": {
+ "unknownDelay": 8.6,
+ "inputHandling": 0,
+ "animation": 13.9,
+ "layoutMeasure": 0.4,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 6.3,
+ "swapBuffers": 68.7,
+ "gpu": 68.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2,
+ "inputHandling": 0,
+ "animation": 3.2,
+ "layoutMeasure": 0.1,
+ "draw": 0.3,
+ "sync": 0.1,
+ "commandIssue": 1.5,
+ "swapBuffers": 16,
+ "gpu": 15.9,
+ "total": 23.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 479,
+ "p50": 0.08,
+ "p95": 0.26,
+ "p99": 1,
+ "max": 2.53
+ },
+ "frameGapMs": {
+ "p50": 16.64,
+ "p95": 17.9,
+ "max": 20.57
+ },
+ "lateFrames": 0,
+ "busyMs": 57.4,
+ "busyRatio": 0.0139,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4117,
+ "commits": {
+ "count": 5,
+ "totalMs": 4.1,
+ "avgMs": 0.82,
+ "p95Ms": 1.351,
+ "maxMs": 1.351
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 13.209,
+ "maxMs": 14.351
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 1.151,
+ "maxMs": 1.837
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 6.39,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 5.75,
+ "avgMs": 1.151,
+ "p50Ms": 1.048,
+ "p95Ms": 1.837,
+ "maxMs": 1.837,
+ "mainThreadMs": 5.75,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.63,
+ "avgMs": 0.158,
+ "p50Ms": 0.118,
+ "p95Ms": 0.299,
+ "maxMs": 0.299,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 411,
+ "afterLoadMB": 369.7,
+ "afterInteractionMB": 420.3,
+ "afterCleanupMB": 416.3,
+ "peakMB": 420.3,
+ "loadDeltaMB": -41.3,
+ "interactionDeltaMB": 50.6,
+ "retainedAfterCleanupMB": 5.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 411,
+ "residentMB": 558.3,
+ "javaHeapMB": 82.6,
+ "nativeHeapMB": 212,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 369.7,
+ "residentMB": 517,
+ "javaHeapMB": 78.4,
+ "nativeHeapMB": 174.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 420.3,
+ "residentMB": 567.7,
+ "javaHeapMB": 84.5,
+ "nativeHeapMB": 220.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 416.3,
+ "residentMB": 563.8,
+ "javaHeapMB": 84.6,
+ "nativeHeapMB": 215.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1131496,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 72
+ },
+ "android": {
+ "javaBytesAllocated": 6436304,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 47789680
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 450,
+ "wallMs": 4120,
+ "percent": 10.9,
+ "threadsBefore": 112,
+ "threadsAfter": 111,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 6000,
+ "estimatedBytes": 269292
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44882
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 313.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.35,
+ "p95Ms": 0.35,
+ "maxMs": 0.35
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.603,
+ "maxMs": 13.603
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.708,
+ "maxMs": 0.708
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.71,
+ "avgMs": 0.708,
+ "p50Ms": 0.708,
+ "p95Ms": 0.708,
+ "maxMs": 0.708,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170632,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 320.56,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.962,
+ "p95Ms": 0.962,
+ "maxMs": 0.962
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.204,
+ "maxMs": 14.204
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.048,
+ "maxMs": 1.048
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.05,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.05,
+ "avgMs": 1.048,
+ "p50Ms": 1.048,
+ "p95Ms": 1.048,
+ "maxMs": 1.048,
+ "mainThreadMs": 1.05,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170600,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 311.86,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.35,
+ "avgMs": 1.351,
+ "p95Ms": 1.351,
+ "maxMs": 1.351
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.378,
+ "maxMs": 10.378
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.837,
+ "maxMs": 1.837
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.84,
+ "avgMs": 1.837,
+ "p50Ms": 1.837,
+ "p95Ms": 1.837,
+ "maxMs": 1.837,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170112,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 315.64,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.509,
+ "maxMs": 13.509
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.88,
+ "maxMs": 0.88
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.88,
+ "p50Ms": 0.88,
+ "p95Ms": 0.88,
+ "maxMs": 0.88,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 171096,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 315.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.8,
+ "avgMs": 0.795,
+ "p95Ms": 0.795,
+ "maxMs": 0.795
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.351,
+ "maxMs": 14.351
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.281,
+ "maxMs": 1.281
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.28,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.28,
+ "avgMs": 1.281,
+ "p50Ms": 1.281,
+ "p95Ms": 1.281,
+ "maxMs": 1.281,
+ "mainThreadMs": 1.28,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 170176,
+ "heapSizeAfterBytes": 75497472
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygon-10k",
+ "name": "Polygon, 10k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:30:32.456Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4996,
+ "load": {
+ "commitMs": 1.83,
+ "readyMs": 764,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.338,
+ "p50Ms": 0.338,
+ "p95Ms": 0.338,
+ "maxMs": 0.338,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005067333000000007,
+ "allocatedBytes": 1922904,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ "frames": {
+ "frames": 248,
+ "durationMs": 4145.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 248,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.51,
+ "p50": 17.51,
+ "p95": 17.51,
+ "p99": 17.51,
+ "worst": 17.51
+ },
+ "phaseSharePct": {
+ "unknownDelay": 5.4,
+ "inputHandling": 0,
+ "animation": 2.1,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 2.9,
+ "swapBuffers": 23.5,
+ "gpu": 88.7
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.9,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1,
+ "swapBuffers": 8.2,
+ "gpu": 31.1,
+ "total": 35
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 477,
+ "p50": 0.07,
+ "p95": 0.38,
+ "p99": 2.23,
+ "max": 11.29
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 18.13,
+ "max": 21.61
+ },
+ "lateFrames": 0,
+ "busyMs": 85.3,
+ "busyRatio": 0.0206,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4146.8,
+ "commits": {
+ "count": 5,
+ "totalMs": 6.94,
+ "avgMs": 1.388,
+ "p95Ms": 1.949,
+ "maxMs": 1.949
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 7.804,
+ "maxMs": 15.783
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 3.785,
+ "maxMs": 5.002
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 19.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 18.92,
+ "avgMs": 3.785,
+ "p50Ms": 3.487,
+ "p95Ms": 5.002,
+ "maxMs": 5.002,
+ "mainThreadMs": 18.92,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.48,
+ "avgMs": 0.12,
+ "p50Ms": 0.09,
+ "p95Ms": 0.167,
+ "maxMs": 0.167,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 416.4,
+ "afterLoadMB": 375.7,
+ "afterInteractionMB": 442.4,
+ "afterCleanupMB": 438.3,
+ "peakMB": 442.4,
+ "loadDeltaMB": -40.7,
+ "interactionDeltaMB": 66.7,
+ "retainedAfterCleanupMB": 21.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 416.4,
+ "residentMB": 563.9,
+ "javaHeapMB": 84.8,
+ "nativeHeapMB": 215.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 375.7,
+ "residentMB": 523.3,
+ "javaHeapMB": 79.8,
+ "nativeHeapMB": 178.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 442.4,
+ "residentMB": 589.7,
+ "javaHeapMB": 101.4,
+ "nativeHeapMB": 224.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 438.3,
+ "residentMB": 585.9,
+ "javaHeapMB": 101.5,
+ "nativeHeapMB": 220.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 6362080,
+ "gcCount": 2,
+ "gcTimeMs": 0.0018145829999999807,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 22704384,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 48985728
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 487,
+ "wallMs": 4150,
+ "percent": 11.7,
+ "threadsBefore": 113,
+ "threadsAfter": 113,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 60000,
+ "estimatedBytes": 2687472
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447912
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 327.19,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.159,
+ "p95Ms": 1.159,
+ "maxMs": 1.159
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.783,
+ "maxMs": 15.783
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 4.505,
+ "maxMs": 4.505
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 4.51,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 4.51,
+ "avgMs": 4.505,
+ "p50Ms": 4.505,
+ "p95Ms": 4.505,
+ "maxMs": 4.505,
+ "mainThreadMs": 4.51,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1062088,
+ "heapSizeAfterBytes": 75497472
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 314.05,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.02,
+ "avgMs": 1.017,
+ "p95Ms": 1.017,
+ "maxMs": 1.017
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.636,
+ "maxMs": 7.636
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.176,
+ "maxMs": 3.176
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.18,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.18,
+ "avgMs": 3.176,
+ "p50Ms": 3.176,
+ "p95Ms": 3.176,
+ "maxMs": 3.176,
+ "mainThreadMs": 3.18,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061744,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 329.71,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.89,
+ "avgMs": 1.893,
+ "p95Ms": 1.893,
+ "maxMs": 1.893
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.572,
+ "maxMs": 2.572
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.002,
+ "maxMs": 5.002
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 5,
+ "avgMs": 5.002,
+ "p50Ms": 5.002,
+ "p95Ms": 5.002,
+ "maxMs": 5.002,
+ "mainThreadMs": 5,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061456,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 314.73,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.922,
+ "p95Ms": 0.922,
+ "maxMs": 0.922
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.548,
+ "maxMs": 6.548
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.754,
+ "maxMs": 2.754
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.75,
+ "avgMs": 2.754,
+ "p50Ms": 2.754,
+ "p95Ms": 2.754,
+ "maxMs": 2.754,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0005431249999999777,
+ "allocatedBytes": 1062176,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 317.59,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.95,
+ "avgMs": 1.949,
+ "p95Ms": 1.949,
+ "maxMs": 1.949
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.48,
+ "maxMs": 6.48
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.487,
+ "maxMs": 3.487
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.49,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.49,
+ "avgMs": 3.487,
+ "p50Ms": 3.487,
+ "p95Ms": 3.487,
+ "maxMs": 3.487,
+ "mainThreadMs": 3.49,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1061384,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polylines-200x50",
+ "name": "200 polylines of 50 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polylines: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:30:39.573Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4353,
+ "load": {
+ "commitMs": 1.52,
+ "readyMs": 773,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0005332920000000185,
+ "allocatedBytes": 1438120,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 209,
+ "durationMs": 3485.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.93,
+ "p50": 16.93,
+ "p95": 16.93,
+ "p99": 16.93,
+ "worst": 16.93
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.5,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.3,
+ "draw": 0.4,
+ "sync": 0.2,
+ "commandIssue": 5.1,
+ "swapBuffers": 38.7,
+ "gpu": 89.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.9,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.7,
+ "swapBuffers": 13.1,
+ "gpu": 30.2,
+ "total": 33.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 408,
+ "p50": 0.07,
+ "p95": 0.21,
+ "p99": 0.47,
+ "max": 2.58
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.88,
+ "max": 30.37
+ },
+ "lateFrames": 2,
+ "busyMs": 40.2,
+ "busyRatio": 0.0115,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3486.4,
+ "commits": {
+ "count": 3,
+ "totalMs": 5.87,
+ "avgMs": 1.958,
+ "p95Ms": 2.505,
+ "maxMs": 2.505
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 8.359,
+ "maxMs": 10.938
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 12.313,
+ "maxMs": 13.517
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 37.42,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 36.94,
+ "avgMs": 12.313,
+ "p50Ms": 12.165,
+ "p95Ms": 13.517,
+ "maxMs": 13.517,
+ "mainThreadMs": 36.94,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.48,
+ "avgMs": 0.119,
+ "p50Ms": 0.115,
+ "p95Ms": 0.15,
+ "maxMs": 0.15,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 438.7,
+ "afterLoadMB": 430.1,
+ "afterInteractionMB": 428.1,
+ "afterCleanupMB": 425.6,
+ "peakMB": 438.7,
+ "loadDeltaMB": -8.6,
+ "interactionDeltaMB": -2,
+ "retainedAfterCleanupMB": -13.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 438.7,
+ "residentMB": 586.1,
+ "javaHeapMB": 101.9,
+ "nativeHeapMB": 220.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 430.1,
+ "residentMB": 577.3,
+ "javaHeapMB": 81.6,
+ "nativeHeapMB": 229.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 428.1,
+ "residentMB": 575.3,
+ "javaHeapMB": 87.1,
+ "nativeHeapMB": 221.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 425.6,
+ "residentMB": 572.9,
+ "javaHeapMB": 87.2,
+ "nativeHeapMB": 215.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 2696896,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 32031056,
+ "gcCount": 1,
+ "gcTimeMs": 65,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -9300416
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 830,
+ "wallMs": 3490,
+ "percent": 23.8,
+ "threadsBefore": 124,
+ "threadsAfter": 124,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 800,
+ "coordinates": 40000,
+ "estimatedBytes": 1850384
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 200,
+ "coordinates": 10000,
+ "estimatedBytes": 462596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 0
+ },
+ "wallMs": 312.41,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.27,
+ "avgMs": 1.269,
+ "p95Ms": 1.269,
+ "maxMs": 1.269
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.701,
+ "maxMs": 6.701
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 13.517,
+ "maxMs": 13.517
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 13.52,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 13.52,
+ "avgMs": 13.517,
+ "p50Ms": 13.517,
+ "p95Ms": 13.517,
+ "maxMs": 13.517,
+ "mainThreadMs": 13.52,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 537408,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 1
+ },
+ "wallMs": 313.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.5,
+ "avgMs": 2.505,
+ "p95Ms": 2.505,
+ "maxMs": 2.505
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.439,
+ "maxMs": 7.439
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 11.258,
+ "maxMs": 11.258
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 11.26,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 11.26,
+ "avgMs": 11.258,
+ "p50Ms": 11.258,
+ "p95Ms": 11.258,
+ "maxMs": 11.258,
+ "mainThreadMs": 11.26,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 537232,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 2
+ },
+ "wallMs": 316.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.1,
+ "avgMs": 2.101,
+ "p95Ms": 2.101,
+ "maxMs": 2.101
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 10.938,
+ "maxMs": 10.938
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 12.165,
+ "maxMs": 12.165
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 12.17,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 12.17,
+ "avgMs": 12.165,
+ "p50Ms": 12.165,
+ "p95Ms": 12.165,
+ "maxMs": 12.165,
+ "mainThreadMs": 12.17,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 536760,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "polygons-200x20",
+ "name": "200 polygons of 20 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polygons: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:30:46.700Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4348,
+ "load": {
+ "commitMs": 1.54,
+ "readyMs": 794,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 718448,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 209,
+ "durationMs": 3486.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 209,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.87,
+ "p50": 16.87,
+ "p95": 16.87,
+ "p99": 16.87,
+ "worst": 16.87
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.9,
+ "inputHandling": 0,
+ "animation": 2.2,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.3,
+ "commandIssue": 3.3,
+ "swapBuffers": 33.6,
+ "gpu": 87.9
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.3,
+ "inputHandling": 0,
+ "animation": 0.7,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.1,
+ "swapBuffers": 11.4,
+ "gpu": 29.6,
+ "total": 33.7
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 413,
+ "p50": 0.07,
+ "p95": 0.27,
+ "p99": 2.05,
+ "max": 3.98
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 18.02,
+ "max": 23.17
+ },
+ "lateFrames": 0,
+ "busyMs": 54.6,
+ "busyRatio": 0.0157,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3487.8,
+ "commits": {
+ "count": 3,
+ "totalMs": 3.55,
+ "avgMs": 1.184,
+ "p95Ms": 1.423,
+ "maxMs": 1.423
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 13.497,
+ "maxMs": 14.043
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 5.766,
+ "maxMs": 6.323
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 17.78,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 17.3,
+ "avgMs": 5.766,
+ "p50Ms": 5.655,
+ "p95Ms": 6.323,
+ "maxMs": 6.323,
+ "mainThreadMs": 17.3,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.48,
+ "avgMs": 0.12,
+ "p50Ms": 0.088,
+ "p95Ms": 0.207,
+ "maxMs": 0.207,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 425.7,
+ "afterLoadMB": 398.7,
+ "afterInteractionMB": 390.1,
+ "afterCleanupMB": 386.1,
+ "peakMB": 425.7,
+ "loadDeltaMB": -27,
+ "interactionDeltaMB": -8.6,
+ "retainedAfterCleanupMB": -39.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 425.7,
+ "residentMB": 573,
+ "javaHeapMB": 87.4,
+ "nativeHeapMB": 215.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 398.7,
+ "residentMB": 546.1,
+ "javaHeapMB": 84,
+ "nativeHeapMB": 192.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 390.1,
+ "residentMB": 537.6,
+ "javaHeapMB": 87.4,
+ "nativeHeapMB": 181.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 386.1,
+ "residentMB": 533.6,
+ "javaHeapMB": 87.6,
+ "nativeHeapMB": 176.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1362928,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 53962272,
+ "gcCount": 2,
+ "gcTimeMs": 151,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -12321472
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1305,
+ "wallMs": 3491,
+ "percent": 37.4,
+ "threadsBefore": 126,
+ "threadsAfter": 125,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 0
+ },
+ "wallMs": 317,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.032,
+ "p95Ms": 1.032,
+ "maxMs": 1.032
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 14.043,
+ "maxMs": 14.043
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.655,
+ "maxMs": 5.655
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5.66,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 5.66,
+ "avgMs": 5.655,
+ "p50Ms": 5.655,
+ "p95Ms": 5.655,
+ "maxMs": 5.655,
+ "mainThreadMs": 5.66,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 238808,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 1
+ },
+ "wallMs": 314.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.42,
+ "avgMs": 1.423,
+ "p95Ms": 1.423,
+ "maxMs": 1.423
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 12.691,
+ "maxMs": 12.691
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 6.323,
+ "maxMs": 6.323
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 6.32,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 6.32,
+ "avgMs": 6.323,
+ "p50Ms": 6.323,
+ "p95Ms": 6.323,
+ "maxMs": 6.323,
+ "mainThreadMs": 6.32,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 238672,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 2
+ },
+ "wallMs": 316.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.1,
+ "avgMs": 1.098,
+ "p95Ms": 1.098,
+ "maxMs": 1.098
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.757,
+ "maxMs": 13.757
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.32,
+ "maxMs": 5.32
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5.32,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 5.32,
+ "avgMs": 5.32,
+ "p50Ms": 5.32,
+ "p95Ms": 5.32,
+ "maxMs": 5.32,
+ "mainThreadMs": 5.32,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 238216,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "cluster-1k",
+ "name": "Clustering, 1k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "1000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:31:01.570Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10934,
+ "load": {
+ "commitMs": 2.51,
+ "readyMs": 964,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 5.26,
+ "backgroundMs": 5.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.09,
+ "avgMs": 0.031,
+ "p50Ms": 0,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.578,
+ "p50Ms": 0.578,
+ "p95Ms": 0.578,
+ "maxMs": 0.578,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.49,
+ "avgMs": 0.243,
+ "p50Ms": 0.125,
+ "p95Ms": 0.362,
+ "maxMs": 0.362,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 2000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 2.09,
+ "avgMs": 1.043,
+ "p50Ms": 0.628,
+ "p95Ms": 1.457,
+ "maxMs": 1.457,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.09,
+ "items": 2000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.009,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 46
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 2.64,
+ "avgMs": 1.318,
+ "p50Ms": 0.767,
+ "p95Ms": 1.87,
+ "maxMs": 1.87,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.64,
+ "items": 2000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 5.1,
+ "avgMs": 2.548,
+ "p50Ms": 0.005,
+ "p95Ms": 5.091,
+ "maxMs": 5.091,
+ "mainThreadMs": 5.1,
+ "backgroundMs": 0,
+ "items": 23
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 319400,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 602,
+ "durationMs": 10056.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.69,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 601,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0017,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.51,
+ "p50": 17.51,
+ "p95": 17.51,
+ "p99": 17.51,
+ "worst": 17.51
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2,
+ "inputHandling": 0,
+ "animation": 2.8,
+ "layoutMeasure": 0.3,
+ "draw": 0.5,
+ "sync": 0.4,
+ "commandIssue": 6.8,
+ "swapBuffers": 44.2,
+ "gpu": 86.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 2.4,
+ "swapBuffers": 15.5,
+ "gpu": 30.4,
+ "total": 35
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 1192,
+ "p50": 0.07,
+ "p95": 0.22,
+ "p99": 0.5,
+ "max": 3.71
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.72,
+ "max": 42.15
+ },
+ "lateFrames": 1,
+ "busyMs": 122.3,
+ "busyRatio": 0.0122,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10058.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.584,
+ "p95Ms": 1.584,
+ "maxMs": 1.584
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.651,
+ "maxMs": 13.651
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.26,
+ "maxMs": 0.26
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 508,
+ "mainThreadMs": 74.57,
+ "backgroundMs": 47.87,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.2,
+ "avgMs": 0.12,
+ "p50Ms": 0.096,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 1.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 7.44,
+ "avgMs": 0.14,
+ "p50Ms": 0.152,
+ "p95Ms": 0.264,
+ "maxMs": 0.302,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.44,
+ "items": 53000
+ },
+ "markers.cluster": {
+ "count": 53,
+ "totalMs": 15.53,
+ "avgMs": 0.293,
+ "p50Ms": 0.227,
+ "p95Ms": 0.784,
+ "maxMs": 1.567,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.53,
+ "items": 37159
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 0.68,
+ "avgMs": 0.013,
+ "p50Ms": 0.01,
+ "p95Ms": 0.024,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.68,
+ "items": 1968
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 23.96,
+ "avgMs": 0.452,
+ "p50Ms": 0.418,
+ "p95Ms": 1.042,
+ "maxMs": 1.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 23.96,
+ "items": 37159
+ },
+ "markers.applyDiff": {
+ "count": 53,
+ "totalMs": 70.11,
+ "avgMs": 1.323,
+ "p50Ms": 0.109,
+ "p95Ms": 5.651,
+ "maxMs": 34.017,
+ "mainThreadMs": 70.11,
+ "backgroundMs": 0,
+ "items": 1758
+ },
+ "marker.visualProps": {
+ "count": 230,
+ "totalMs": 2.76,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.025,
+ "maxMs": 0.332,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.244,
+ "p50Ms": 0.244,
+ "p95Ms": 0.244,
+ "maxMs": 0.244,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 386.3,
+ "afterLoadMB": 401.9,
+ "afterInteractionMB": 470.1,
+ "afterCleanupMB": 466.2,
+ "peakMB": 470.1,
+ "loadDeltaMB": 15.6,
+ "interactionDeltaMB": 68.2,
+ "retainedAfterCleanupMB": 79.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 386.3,
+ "residentMB": 533.7,
+ "javaHeapMB": 87.8,
+ "nativeHeapMB": 176.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 401.9,
+ "residentMB": 549.7,
+ "javaHeapMB": 85.7,
+ "nativeHeapMB": 193.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 470.1,
+ "residentMB": 618.1,
+ "javaHeapMB": 111.7,
+ "nativeHeapMB": 233.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 466.2,
+ "residentMB": 614.2,
+ "javaHeapMB": 111.9,
+ "nativeHeapMB": 228.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 830016,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 76
+ },
+ "android": {
+ "javaBytesAllocated": 59022192,
+ "gcCount": 3,
+ "gcTimeMs": 189,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": 41995312
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1453,
+ "wallMs": 10066,
+ "percent": 14.4,
+ "threadsBefore": 129,
+ "threadsAfter": 127,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 2000,
+ "coordinates": 2000,
+ "estimatedBytes": 181192
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 90596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5166.92,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 385,
+ "mainThreadMs": 72.29,
+ "backgroundMs": 25.44,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.66,
+ "avgMs": 0.131,
+ "p50Ms": 0.1,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 3.24,
+ "avgMs": 0.108,
+ "p50Ms": 0.099,
+ "p95Ms": 0.265,
+ "maxMs": 0.302,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.24,
+ "items": 30000
+ },
+ "markers.cluster": {
+ "count": 30,
+ "totalMs": 8.91,
+ "avgMs": 0.297,
+ "p50Ms": 0.249,
+ "p95Ms": 0.784,
+ "maxMs": 0.825,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.91,
+ "items": 14159
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.47,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1440
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 12.81,
+ "avgMs": 0.427,
+ "p50Ms": 0.382,
+ "p95Ms": 1.042,
+ "maxMs": 1.068,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.81,
+ "items": 14159
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 68.88,
+ "avgMs": 2.296,
+ "p50Ms": 0.531,
+ "p95Ms": 8.582,
+ "maxMs": 34.017,
+ "mainThreadMs": 68.88,
+ "backgroundMs": 0,
+ "items": 1680
+ },
+ "marker.visualProps": {
+ "count": 230,
+ "totalMs": 2.76,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.025,
+ "maxMs": 0.332,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 225696,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3663.79,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 110,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 20.46,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.55,
+ "avgMs": 0.11,
+ "p50Ms": 0.096,
+ "p95Ms": 0.156,
+ "maxMs": 0.156,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 3.82,
+ "avgMs": 0.182,
+ "p50Ms": 0.184,
+ "p95Ms": 0.259,
+ "maxMs": 0.264,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.82,
+ "items": 21000
+ },
+ "markers.cluster": {
+ "count": 21,
+ "totalMs": 6.16,
+ "avgMs": 0.293,
+ "p50Ms": 0.221,
+ "p95Ms": 0.329,
+ "maxMs": 1.567,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.16,
+ "items": 21000
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.19,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.013,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 478
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 10.29,
+ "avgMs": 0.49,
+ "p50Ms": 0.421,
+ "p95Ms": 0.57,
+ "maxMs": 1.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.29,
+ "items": 21000
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 1.13,
+ "avgMs": 0.054,
+ "p50Ms": 0.004,
+ "p95Ms": 0.257,
+ "maxMs": 0.396,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 71
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 111856,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000
+ },
+ "wallMs": 1216.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.584,
+ "p95Ms": 1.584,
+ "maxMs": 1.584
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.651,
+ "maxMs": 13.651
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.26,
+ "maxMs": 0.26
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 1.97,
+ "byName": {
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.38,
+ "avgMs": 0.19,
+ "p50Ms": 0.17,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 2000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 0.45,
+ "avgMs": 0.226,
+ "p50Ms": 0.218,
+ "p95Ms": 0.235,
+ "maxMs": 0.235,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 2000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 50
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.86,
+ "avgMs": 0.429,
+ "p50Ms": 0.418,
+ "p95Ms": 0.441,
+ "maxMs": 0.441,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.86,
+ "items": 2000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.049,
+ "p50Ms": 0.003,
+ "p95Ms": 0.095,
+ "maxMs": 0.095,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.244,
+ "p50Ms": 0.244,
+ "p95Ms": 0.244,
+ "maxMs": 0.244,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.26,
+ "p50Ms": 0.26,
+ "p95Ms": 0.26,
+ "maxMs": 0.26,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 151944,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "cluster-10k",
+ "name": "Clustering, 10k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "10000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:31:16.150Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10939,
+ "load": {
+ "commitMs": 10.52,
+ "readyMs": 618,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 11.25,
+ "backgroundMs": 9.46,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.13,
+ "avgMs": 0.376,
+ "p50Ms": 0.001,
+ "p95Ms": 1.129,
+ "maxMs": 1.129,
+ "mainThreadMs": 1.13,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.242,
+ "p50Ms": 0.242,
+ "p95Ms": 0.242,
+ "maxMs": 0.242,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.62,
+ "avgMs": 0.309,
+ "p50Ms": 0.262,
+ "p95Ms": 0.356,
+ "maxMs": 0.356,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 3.95,
+ "avgMs": 1.975,
+ "p50Ms": 1.874,
+ "p95Ms": 2.075,
+ "maxMs": 2.075,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.95,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.01,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 52
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 4.62,
+ "avgMs": 2.309,
+ "p50Ms": 2.168,
+ "p95Ms": 2.449,
+ "maxMs": 2.449,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.62,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 10.08,
+ "avgMs": 5.04,
+ "p50Ms": 0.004,
+ "p95Ms": 10.077,
+ "maxMs": 10.077,
+ "mainThreadMs": 10.08,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005132042000000003,
+ "allocatedBytes": 2709200,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ "frames": {
+ "frames": 601,
+ "durationMs": 10046.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.69,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 600,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0017,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.03,
+ "p50": 17.03,
+ "p95": 17.03,
+ "p99": 17.03,
+ "worst": 17.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.2,
+ "inputHandling": 0,
+ "animation": 2.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.2,
+ "commandIssue": 4.2,
+ "swapBuffers": 43.8,
+ "gpu": 89.6
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 0.9,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 14.9,
+ "gpu": 30.5,
+ "total": 34.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 1185,
+ "p50": 0.06,
+ "p95": 0.21,
+ "p99": 0.81,
+ "max": 5.6
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.54,
+ "max": 34.52
+ },
+ "lateFrames": 1,
+ "busyMs": 121.5,
+ "busyRatio": 0.0121,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10048.1,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.16,
+ "avgMs": 11.16,
+ "p95Ms": 11.16,
+ "maxMs": 11.16
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.102,
+ "maxMs": 6.102
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.083,
+ "maxMs": 1.083
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 587,
+ "mainThreadMs": 80.57,
+ "backgroundMs": 170.07,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 0.99,
+ "avgMs": 0.099,
+ "p50Ms": 0.085,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 10.22,
+ "avgMs": 0.193,
+ "p50Ms": 0.229,
+ "p95Ms": 0.345,
+ "maxMs": 0.467,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.22,
+ "items": 530000
+ },
+ "markers.cluster": {
+ "count": 53,
+ "totalMs": 73.57,
+ "avgMs": 1.388,
+ "p50Ms": 1.729,
+ "p95Ms": 2.577,
+ "maxMs": 3.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 73.57,
+ "items": 370906
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 0.93,
+ "avgMs": 0.018,
+ "p50Ms": 0.014,
+ "p95Ms": 0.038,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 3186
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 85.04,
+ "avgMs": 1.604,
+ "p50Ms": 2.014,
+ "p95Ms": 2.846,
+ "maxMs": 3.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 85.04,
+ "items": 370906
+ },
+ "markers.applyDiff": {
+ "count": 53,
+ "totalMs": 74.52,
+ "avgMs": 1.406,
+ "p50Ms": 0.171,
+ "p95Ms": 7.057,
+ "maxMs": 18.171,
+ "mainThreadMs": 74.52,
+ "backgroundMs": 0,
+ "items": 3567
+ },
+ "marker.visualProps": {
+ "count": 309,
+ "totalMs": 2.91,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.018,
+ "maxMs": 0.245,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.07,
+ "p50Ms": 1.07,
+ "p95Ms": 1.07,
+ "maxMs": 1.07,
+ "mainThreadMs": 1.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.08,
+ "avgMs": 1.083,
+ "p50Ms": 1.083,
+ "p95Ms": 1.083,
+ "maxMs": 1.083,
+ "mainThreadMs": 1.08,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.309,
+ "p50Ms": 0.309,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 10000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 466.4,
+ "afterLoadMB": 485,
+ "afterInteractionMB": 391.2,
+ "afterCleanupMB": 387.1,
+ "peakMB": 485,
+ "loadDeltaMB": 18.6,
+ "interactionDeltaMB": -93.8,
+ "retainedAfterCleanupMB": -79.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 466.4,
+ "residentMB": 614.4,
+ "javaHeapMB": 112,
+ "nativeHeapMB": 229.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 485,
+ "residentMB": 632.9,
+ "javaHeapMB": 94.9,
+ "nativeHeapMB": 261.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 391.2,
+ "residentMB": 539.4,
+ "javaHeapMB": 91.8,
+ "nativeHeapMB": 151.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 387.1,
+ "residentMB": 535.4,
+ "javaHeapMB": 92.1,
+ "nativeHeapMB": 147,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1669584,
+ "gcCount": 1,
+ "gcTimeMs": 0.005923999999999985,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 74436128,
+ "gcCount": 9,
+ "gcTimeMs": 533,
+ "blockingGcCount": 2,
+ "nativeHeapDeltaBytes": -115106240
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 2248,
+ "wallMs": 10068,
+ "percent": 22.3,
+ "threadsBefore": 130,
+ "threadsAfter": 129,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 20000,
+ "coordinates": 20000,
+ "estimatedBytes": 1811880
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5161.21,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 464,
+ "mainThreadMs": 76.34,
+ "backgroundMs": 66.81,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.56,
+ "avgMs": 0.111,
+ "p50Ms": 0.12,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 3.82,
+ "avgMs": 0.127,
+ "p50Ms": 0.082,
+ "p95Ms": 0.309,
+ "maxMs": 0.326,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.82,
+ "items": 300000
+ },
+ "markers.cluster": {
+ "count": 30,
+ "totalMs": 28.84,
+ "avgMs": 0.961,
+ "p50Ms": 0.62,
+ "p95Ms": 2.275,
+ "maxMs": 2.577,
+ "mainThreadMs": 0,
+ "backgroundMs": 28.84,
+ "items": 140906
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.65,
+ "avgMs": 0.022,
+ "p50Ms": 0.02,
+ "p95Ms": 0.04,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.65,
+ "items": 2616
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 33.49,
+ "avgMs": 1.116,
+ "p50Ms": 0.725,
+ "p95Ms": 2.525,
+ "maxMs": 2.846,
+ "mainThreadMs": 0,
+ "backgroundMs": 33.49,
+ "items": 140906
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 72.87,
+ "avgMs": 2.429,
+ "p50Ms": 1.061,
+ "p95Ms": 8.55,
+ "maxMs": 18.171,
+ "mainThreadMs": 72.87,
+ "backgroundMs": 0,
+ "items": 3490
+ },
+ "marker.visualProps": {
+ "count": 309,
+ "totalMs": 2.91,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.018,
+ "maxMs": 0.245,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 258800,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3664.43,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 110,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 94.59,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.43,
+ "avgMs": 0.086,
+ "p50Ms": 0.077,
+ "p95Ms": 0.117,
+ "maxMs": 0.117,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 5.91,
+ "avgMs": 0.281,
+ "p50Ms": 0.259,
+ "p95Ms": 0.411,
+ "maxMs": 0.467,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.91,
+ "items": 210000
+ },
+ "markers.cluster": {
+ "count": 21,
+ "totalMs": 41.08,
+ "avgMs": 1.956,
+ "p50Ms": 1.807,
+ "p95Ms": 2.891,
+ "maxMs": 3.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 41.08,
+ "items": 210000
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.25,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.018,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 516
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 47.36,
+ "avgMs": 2.255,
+ "p50Ms": 2.081,
+ "p95Ms": 3.143,
+ "maxMs": 3.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 47.36,
+ "items": 210000
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 1.46,
+ "avgMs": 0.07,
+ "p50Ms": 0.003,
+ "p95Ms": 0.17,
+ "maxMs": 1.088,
+ "mainThreadMs": 1.46,
+ "backgroundMs": 0,
+ "items": 63
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 112800,
+ "heapSizeAfterBytes": 79691776
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000
+ },
+ "wallMs": 1215.39,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.16,
+ "avgMs": 11.16,
+ "p95Ms": 11.16,
+ "maxMs": 11.16
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 6.102,
+ "maxMs": 6.102
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.083,
+ "maxMs": 1.083
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 2.33,
+ "backgroundMs": 8.67,
+ "byName": {
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.49,
+ "avgMs": 0.246,
+ "p50Ms": 0.193,
+ "p95Ms": 0.299,
+ "maxMs": 0.299,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 3.66,
+ "avgMs": 1.828,
+ "p50Ms": 1.592,
+ "p95Ms": 2.064,
+ "maxMs": 2.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.66,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 54
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 4.19,
+ "avgMs": 2.095,
+ "p50Ms": 1.803,
+ "p95Ms": 2.387,
+ "maxMs": 2.387,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.19,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.18,
+ "avgMs": 0.09,
+ "p50Ms": 0.004,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 14
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.07,
+ "p50Ms": 1.07,
+ "p95Ms": 1.07,
+ "maxMs": 1.07,
+ "mainThreadMs": 1.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.08,
+ "avgMs": 1.083,
+ "p50Ms": 1.083,
+ "p95Ms": 1.083,
+ "maxMs": 1.083,
+ "mainThreadMs": 1.08,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.309,
+ "p50Ms": 0.309,
+ "p95Ms": 0.309,
+ "maxMs": 0.309,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.31,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 954744,
+ "heapSizeAfterBytes": 79691776
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "cluster-50k",
+ "name": "Clustering, 50k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline"
+ ],
+ "description": "50000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:31:32.366Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 11011,
+ "load": {
+ "commitMs": 38.87,
+ "readyMs": 656,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 10.64,
+ "backgroundMs": 44.2,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 2.93,
+ "avgMs": 0.975,
+ "p50Ms": 0,
+ "p95Ms": 2.926,
+ "maxMs": 2.926,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.77,
+ "p50Ms": 0.77,
+ "p95Ms": 0.77,
+ "maxMs": 0.77,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.77,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.96,
+ "avgMs": 0.481,
+ "p50Ms": 0.453,
+ "p95Ms": 0.51,
+ "maxMs": 0.51,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 100000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 20.72,
+ "avgMs": 10.361,
+ "p50Ms": 9.734,
+ "p95Ms": 10.988,
+ "maxMs": 10.988,
+ "mainThreadMs": 0,
+ "backgroundMs": 20.72,
+ "items": 100000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.011,
+ "p50Ms": 0.009,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 44
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 21.72,
+ "avgMs": 10.862,
+ "p50Ms": 10.208,
+ "p95Ms": 11.517,
+ "maxMs": 11.517,
+ "mainThreadMs": 0,
+ "backgroundMs": 21.72,
+ "items": 100000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 7.61,
+ "avgMs": 3.805,
+ "p50Ms": 0.003,
+ "p95Ms": 7.606,
+ "maxMs": 7.606,
+ "mainThreadMs": 7.61,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.005736542000000011,
+ "allocatedBytes": 13821736,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 605,
+ "durationMs": 10117.5,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.69,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 604,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0017,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 0,
+ "renderTotalMs": {
+ "average": 0,
+ "p50": 0,
+ "p95": 0,
+ "p99": 0,
+ "worst": 0
+ },
+ "phaseSharePct": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0,
+ "inputHandling": 0,
+ "animation": 0,
+ "layoutMeasure": 0,
+ "draw": 0,
+ "sync": 0,
+ "commandIssue": 0,
+ "swapBuffers": 0,
+ "gpu": 0,
+ "total": 0
+ },
+ "missedDeadline": 0
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 1202,
+ "p50": 0.06,
+ "p95": 0.24,
+ "p99": 2.32,
+ "max": 75.89
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.89,
+ "max": 60.09
+ },
+ "lateFrames": 6,
+ "busyMs": 512.4,
+ "busyRatio": 0.0506,
+ "longTasks": {
+ "count": 1,
+ "totalMs": 60,
+ "maxMs": 60,
+ "source": "performance-observer"
+ },
+ "durationMs": 10119.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 62.29,
+ "avgMs": 62.295,
+ "p95Ms": 62.295,
+ "maxMs": 62.295
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.389,
+ "maxMs": 15.389
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.954,
+ "maxMs": 2.954
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 501,
+ "mainThreadMs": 175.19,
+ "backgroundMs": 1029.19,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.23,
+ "avgMs": 0.123,
+ "p50Ms": 0.092,
+ "p95Ms": 0.276,
+ "maxMs": 0.276,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 29.07,
+ "avgMs": 0.549,
+ "p50Ms": 0.465,
+ "p95Ms": 1.198,
+ "maxMs": 7.7,
+ "mainThreadMs": 0,
+ "backgroundMs": 29.07,
+ "items": 2650000
+ },
+ "markers.cluster": {
+ "count": 53,
+ "totalMs": 483.66,
+ "avgMs": 9.126,
+ "p50Ms": 9.796,
+ "p95Ms": 15.972,
+ "maxMs": 51.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 483.66,
+ "items": 1857651
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 1.23,
+ "avgMs": 0.023,
+ "p50Ms": 0.02,
+ "p95Ms": 0.043,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 3976
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 514.55,
+ "avgMs": 9.708,
+ "p50Ms": 10.346,
+ "p95Ms": 16.8,
+ "maxMs": 59.085,
+ "mainThreadMs": 0,
+ "backgroundMs": 514.55,
+ "items": 1857651
+ },
+ "markers.applyDiff": {
+ "count": 53,
+ "totalMs": 166.05,
+ "avgMs": 3.133,
+ "p50Ms": 0.359,
+ "p95Ms": 24.44,
+ "maxMs": 32.951,
+ "mainThreadMs": 166.05,
+ "backgroundMs": 0,
+ "items": 4895
+ },
+ "marker.visualProps": {
+ "count": 223,
+ "totalMs": 2.02,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.02,
+ "maxMs": 0.12,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.93,
+ "avgMs": 2.93,
+ "p50Ms": 2.93,
+ "p95Ms": 2.93,
+ "maxMs": 2.93,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.95,
+ "avgMs": 2.954,
+ "p50Ms": 2.954,
+ "p95Ms": 2.954,
+ "maxMs": 2.954,
+ "mainThreadMs": 2.95,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.671,
+ "p50Ms": 0.671,
+ "p95Ms": 0.671,
+ "maxMs": 0.671,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.67,
+ "items": 50000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 381.8,
+ "afterLoadMB": 451.6,
+ "afterInteractionMB": 446.8,
+ "afterCleanupMB": 442.8,
+ "peakMB": 451.6,
+ "loadDeltaMB": 69.8,
+ "interactionDeltaMB": -4.8,
+ "retainedAfterCleanupMB": 61,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 381.8,
+ "residentMB": 530.1,
+ "javaHeapMB": 92.2,
+ "nativeHeapMB": 147.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 451.6,
+ "residentMB": 599.8,
+ "javaHeapMB": 98.1,
+ "nativeHeapMB": 207,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 446.8,
+ "residentMB": 595.1,
+ "javaHeapMB": 97.8,
+ "nativeHeapMB": 183.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 442.8,
+ "residentMB": 591.2,
+ "javaHeapMB": 98,
+ "nativeHeapMB": 179,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 5203824,
+ "gcCount": 1,
+ "gcTimeMs": 0.014084833000000019,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 234180272,
+ "gcCount": 14,
+ "gcTimeMs": 1006,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -24528848
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 3397,
+ "wallMs": 10133,
+ "percent": 33.5,
+ "threadsBefore": 130,
+ "threadsAfter": 129,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100000,
+ "coordinates": 100000,
+ "estimatedBytes": 9057816
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 4528908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5165.28,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 378,
+ "mainThreadMs": 166.56,
+ "backgroundMs": 485.33,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.68,
+ "avgMs": 0.136,
+ "p50Ms": 0.1,
+ "p95Ms": 0.276,
+ "maxMs": 0.276,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 16.33,
+ "avgMs": 0.544,
+ "p50Ms": 0.207,
+ "p95Ms": 1.485,
+ "maxMs": 7.7,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.33,
+ "items": 1500000
+ },
+ "markers.cluster": {
+ "count": 30,
+ "totalMs": 225.24,
+ "avgMs": 7.508,
+ "p50Ms": 3.586,
+ "p95Ms": 30.53,
+ "maxMs": 51.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 225.24,
+ "items": 707651
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.94,
+ "avgMs": 0.031,
+ "p50Ms": 0.027,
+ "p95Ms": 0.06,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 3460
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 242.82,
+ "avgMs": 8.094,
+ "p50Ms": 3.832,
+ "p95Ms": 32.065,
+ "maxMs": 59.085,
+ "mainThreadMs": 0,
+ "backgroundMs": 242.82,
+ "items": 707651
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 163.86,
+ "avgMs": 5.462,
+ "p50Ms": 2.015,
+ "p95Ms": 29.177,
+ "maxMs": 32.951,
+ "mainThreadMs": 163.86,
+ "backgroundMs": 0,
+ "items": 4828
+ },
+ "marker.visualProps": {
+ "count": 223,
+ "totalMs": 2.02,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.02,
+ "maxMs": 0.12,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 224136,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3664.31,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 110,
+ "mainThreadMs": 2.6,
+ "backgroundMs": 497.4,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.55,
+ "avgMs": 0.11,
+ "p50Ms": 0.091,
+ "p95Ms": 0.203,
+ "maxMs": 0.203,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 21,
+ "totalMs": 11.95,
+ "avgMs": 0.569,
+ "p50Ms": 0.535,
+ "p95Ms": 0.782,
+ "maxMs": 1.198,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.95,
+ "items": 1050000
+ },
+ "markers.cluster": {
+ "count": 21,
+ "totalMs": 236.37,
+ "avgMs": 11.256,
+ "p50Ms": 11.368,
+ "p95Ms": 13.409,
+ "maxMs": 14.11,
+ "mainThreadMs": 0,
+ "backgroundMs": 236.37,
+ "items": 1050000
+ },
+ "markers.diff": {
+ "count": 21,
+ "totalMs": 0.27,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.018,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.27,
+ "items": 466
+ },
+ "markers.viewportCompute": {
+ "count": 21,
+ "totalMs": 248.82,
+ "avgMs": 11.849,
+ "p50Ms": 11.877,
+ "p95Ms": 14.058,
+ "maxMs": 14.693,
+ "mainThreadMs": 0,
+ "backgroundMs": 248.82,
+ "items": 1050000
+ },
+ "markers.applyDiff": {
+ "count": 21,
+ "totalMs": 2.05,
+ "avgMs": 0.098,
+ "p50Ms": 0.004,
+ "p95Ms": 0.616,
+ "maxMs": 1.167,
+ "mainThreadMs": 2.05,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 113136,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 500,
+ "total": 50000
+ },
+ "wallMs": 1282.79,
+ "commits": {
+ "count": 1,
+ "totalMs": 62.29,
+ "avgMs": 62.295,
+ "p95Ms": 62.295,
+ "maxMs": 62.295
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.389,
+ "maxMs": 15.389
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.954,
+ "maxMs": 2.954
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 6.03,
+ "backgroundMs": 46.45,
+ "byName": {
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.79,
+ "avgMs": 0.396,
+ "p50Ms": 0.324,
+ "p95Ms": 0.469,
+ "maxMs": 0.469,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.79,
+ "items": 100000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 22.06,
+ "avgMs": 11.03,
+ "p50Ms": 8.94,
+ "p95Ms": 13.12,
+ "maxMs": 13.12,
+ "mainThreadMs": 0,
+ "backgroundMs": 22.06,
+ "items": 100000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.012,
+ "p50Ms": 0.011,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 50
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 22.9,
+ "avgMs": 11.451,
+ "p50Ms": 9.288,
+ "p95Ms": 13.614,
+ "maxMs": 13.614,
+ "mainThreadMs": 0,
+ "backgroundMs": 22.9,
+ "items": 100000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 0.15,
+ "avgMs": 0.073,
+ "p50Ms": 0.006,
+ "p95Ms": 0.14,
+ "maxMs": 0.14,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 17
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 2.93,
+ "avgMs": 2.93,
+ "p50Ms": 2.93,
+ "p95Ms": 2.93,
+ "maxMs": 2.93,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.95,
+ "avgMs": 2.954,
+ "p50Ms": 2.954,
+ "p95Ms": 2.954,
+ "maxMs": 2.954,
+ "mainThreadMs": 2.95,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.671,
+ "p50Ms": 0.671,
+ "p95Ms": 0.671,
+ "maxMs": 0.671,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.67,
+ "items": 50000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.014084833000000019,
+ "allocatedBytes": 4524384,
+ "heapSizeAfterBytes": 83886080
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-camera",
+ "name": "10k markers + camera",
+ "group": "combined",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast pan legs and a zoom sweep with 10k markers (no clustering).",
+ "recordedAt": "2026-09-10T14:31:43.264Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7123,
+ "load": {
+ "commitMs": 11.09,
+ "readyMs": 769,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 2.83,
+ "backgroundMs": 0.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.32,
+ "avgMs": 0.662,
+ "p50Ms": 0.001,
+ "p95Ms": 1.323,
+ "maxMs": 1.323,
+ "mainThreadMs": 1.32,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.218,
+ "p50Ms": 0.218,
+ "p95Ms": 0.218,
+ "maxMs": 0.218,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.056,
+ "p50Ms": 0.026,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.1,
+ "avgMs": 0.048,
+ "p50Ms": 0.016,
+ "p95Ms": 0.081,
+ "maxMs": 0.081,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.011,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.25,
+ "avgMs": 0.125,
+ "p50Ms": 0.054,
+ "p95Ms": 0.196,
+ "maxMs": 0.196,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.43,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.009,
+ "maxMs": 0.118,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.01,
+ "avgMs": 0.507,
+ "p50Ms": 0.004,
+ "p95Ms": 1.011,
+ "maxMs": 1.011,
+ "mainThreadMs": 1.01,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0010516669999999784,
+ "allocatedBytes": 2721904,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 373,
+ "durationMs": 6230.2,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 373,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 38.31,
+ "p50": 38.31,
+ "p95": 38.31,
+ "p99": 38.31,
+ "worst": 38.31
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.4,
+ "inputHandling": 0,
+ "animation": 5.1,
+ "layoutMeasure": 0.6,
+ "draw": 0.6,
+ "sync": 0.2,
+ "commandIssue": 2.7,
+ "swapBuffers": 66.5,
+ "gpu": 89.1
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.1,
+ "inputHandling": 0,
+ "animation": 3.9,
+ "layoutMeasure": 0.5,
+ "draw": 0.5,
+ "sync": 0.2,
+ "commandIssue": 2.1,
+ "swapBuffers": 51,
+ "gpu": 68.2,
+ "total": 76.6
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 746,
+ "p50": 0.06,
+ "p95": 0.16,
+ "p99": 0.36,
+ "max": 1.37
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.46,
+ "max": 19.79
+ },
+ "lateFrames": 0,
+ "busyMs": 60,
+ "busyRatio": 0.0096,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6231.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1164,
+ "mainThreadMs": 26.21,
+ "backgroundMs": 11.76,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 1.54,
+ "avgMs": 0.154,
+ "p50Ms": 0.107,
+ "p95Ms": 0.472,
+ "maxMs": 0.472,
+ "mainThreadMs": 1.54,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 34,
+ "totalMs": 0.94,
+ "avgMs": 0.028,
+ "p50Ms": 0.022,
+ "p95Ms": 0.087,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 340000
+ },
+ "markers.viewportFilter": {
+ "count": 34,
+ "totalMs": 3.82,
+ "avgMs": 0.112,
+ "p50Ms": 0.043,
+ "p95Ms": 0.295,
+ "maxMs": 1.553,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.82,
+ "items": 7104
+ },
+ "markers.diff": {
+ "count": 34,
+ "totalMs": 1.07,
+ "avgMs": 0.031,
+ "p50Ms": 0.026,
+ "p95Ms": 0.073,
+ "maxMs": 0.134,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.07,
+ "items": 3391
+ },
+ "markers.viewportCompute": {
+ "count": 34,
+ "totalMs": 5.94,
+ "avgMs": 0.175,
+ "p50Ms": 0.099,
+ "p95Ms": 0.409,
+ "maxMs": 1.608,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.94,
+ "items": 7104
+ },
+ "markers.applyDiff": {
+ "count": 34,
+ "totalMs": 17.77,
+ "avgMs": 0.523,
+ "p50Ms": 0.289,
+ "p95Ms": 2.164,
+ "maxMs": 2.73,
+ "mainThreadMs": 17.77,
+ "backgroundMs": 0,
+ "items": 1956
+ },
+ "marker.visualProps": {
+ "count": 984,
+ "totalMs": 6.9,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.334,
+ "mainThreadMs": 6.9,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 443,
+ "afterLoadMB": 511.8,
+ "afterInteractionMB": 488,
+ "afterCleanupMB": 484.4,
+ "peakMB": 511.8,
+ "loadDeltaMB": 68.8,
+ "interactionDeltaMB": -23.8,
+ "retainedAfterCleanupMB": 41.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 443,
+ "residentMB": 591.3,
+ "javaHeapMB": 98.1,
+ "nativeHeapMB": 179.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 511.8,
+ "residentMB": 660.2,
+ "javaHeapMB": 103.4,
+ "nativeHeapMB": 244.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 488,
+ "residentMB": 636.2,
+ "javaHeapMB": 101,
+ "nativeHeapMB": 222.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 484.4,
+ "residentMB": 632.7,
+ "javaHeapMB": 101.5,
+ "nativeHeapMB": 218,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 470344,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 32158384,
+ "gcCount": 5,
+ "gcTimeMs": 415,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -23143184
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1722,
+ "wallMs": 6240,
+ "percent": 27.6,
+ "threadsBefore": 131,
+ "threadsAfter": 130,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-cluster-camera",
+ "name": "10k markers + clustering + camera",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom sweep and pan with 10k clustered markers at country scale.",
+ "recordedAt": "2026-09-10T14:31:53.771Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6854,
+ "load": {
+ "commitMs": 10.86,
+ "readyMs": 634,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 13.24,
+ "backgroundMs": 8.73,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 2.42,
+ "avgMs": 0.807,
+ "p50Ms": 0,
+ "p95Ms": 2.422,
+ "maxMs": 2.422,
+ "mainThreadMs": 2.42,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.16,
+ "p50Ms": 0.16,
+ "p95Ms": 0.16,
+ "maxMs": 0.16,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.216,
+ "p50Ms": 0.216,
+ "p95Ms": 0.216,
+ "maxMs": 0.216,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.59,
+ "avgMs": 0.293,
+ "p50Ms": 0.273,
+ "p95Ms": 0.313,
+ "maxMs": 0.313,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 3.61,
+ "avgMs": 1.806,
+ "p50Ms": 1.735,
+ "p95Ms": 1.878,
+ "maxMs": 1.878,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.61,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.022,
+ "p50Ms": 0.014,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 52
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 4.27,
+ "avgMs": 2.135,
+ "p50Ms": 2.059,
+ "p95Ms": 2.211,
+ "maxMs": 2.211,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.27,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 10.65,
+ "avgMs": 5.327,
+ "p50Ms": 0.003,
+ "p95Ms": 10.651,
+ "maxMs": 10.651,
+ "mainThreadMs": 10.65,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.013167792000000011,
+ "allocatedBytes": 2708408,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 358,
+ "durationMs": 5972.8,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 358,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 50.12,
+ "p50": 50.12,
+ "p95": 50.12,
+ "p99": 50.12,
+ "worst": 50.12
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.2,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.7,
+ "swapBuffers": 71.2,
+ "gpu": 95.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.2,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.1,
+ "commandIssue": 1.7,
+ "swapBuffers": 71.3,
+ "gpu": 95.5,
+ "total": 100.2
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 715,
+ "p50": 0.07,
+ "p95": 0.25,
+ "p99": 1.31,
+ "max": 4.44
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.75,
+ "max": 24.93
+ },
+ "lateFrames": 0,
+ "busyMs": 86.8,
+ "busyRatio": 0.0145,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5974.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 295,
+ "mainThreadMs": 79.23,
+ "backgroundMs": 201.46,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 1.18,
+ "avgMs": 0.147,
+ "p50Ms": 0.131,
+ "p95Ms": 0.245,
+ "maxMs": 0.245,
+ "mainThreadMs": 1.18,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 31,
+ "totalMs": 22.74,
+ "avgMs": 0.734,
+ "p50Ms": 0.305,
+ "p95Ms": 4.936,
+ "maxMs": 8.956,
+ "mainThreadMs": 0,
+ "backgroundMs": 22.74,
+ "items": 310000
+ },
+ "markers.cluster": {
+ "count": 31,
+ "totalMs": 77.02,
+ "avgMs": 2.484,
+ "p50Ms": 2.092,
+ "p95Ms": 7.95,
+ "maxMs": 12.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 77.02,
+ "items": 248534
+ },
+ "markers.diff": {
+ "count": 31,
+ "totalMs": 0.77,
+ "avgMs": 0.025,
+ "p50Ms": 0.021,
+ "p95Ms": 0.048,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.77,
+ "items": 1760
+ },
+ "markers.viewportCompute": {
+ "count": 31,
+ "totalMs": 100.94,
+ "avgMs": 3.256,
+ "p50Ms": 2.374,
+ "p95Ms": 12.949,
+ "maxMs": 21.089,
+ "mainThreadMs": 0,
+ "backgroundMs": 100.94,
+ "items": 248534
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 76.3,
+ "avgMs": 2.543,
+ "p50Ms": 0.005,
+ "p95Ms": 14.386,
+ "maxMs": 25.589,
+ "mainThreadMs": 76.3,
+ "backgroundMs": 0,
+ "items": 1901
+ },
+ "marker.visualProps": {
+ "count": 133,
+ "totalMs": 1.76,
+ "avgMs": 0.013,
+ "p50Ms": 0.005,
+ "p95Ms": 0.039,
+ "maxMs": 0.21,
+ "mainThreadMs": 1.76,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 484.1,
+ "afterLoadMB": 467.1,
+ "afterInteractionMB": 475,
+ "afterCleanupMB": 471,
+ "peakMB": 484.1,
+ "loadDeltaMB": -17,
+ "interactionDeltaMB": 7.9,
+ "retainedAfterCleanupMB": -13.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 484.1,
+ "residentMB": 632.2,
+ "javaHeapMB": 101.7,
+ "nativeHeapMB": 218.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 467.1,
+ "residentMB": 615.4,
+ "javaHeapMB": 101.5,
+ "nativeHeapMB": 199.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 475,
+ "residentMB": 623,
+ "javaHeapMB": 104.1,
+ "nativeHeapMB": 197.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 471,
+ "residentMB": 619.2,
+ "javaHeapMB": 104.4,
+ "nativeHeapMB": 192.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 351888,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 80
+ },
+ "android": {
+ "javaBytesAllocated": 48717744,
+ "gcCount": 4,
+ "gcTimeMs": 331,
+ "blockingGcCount": 1,
+ "nativeHeapDeltaBytes": -2179280
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1763,
+ "wallMs": 5980,
+ "percent": 29.5,
+ "threadsBefore": 132,
+ "threadsAfter": 133,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-updates",
+ "name": "10k markers + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "1 % of 10k markers move at 5 Hz for 5 s while the camera pans slowly.",
+ "recordedAt": "2026-09-10T14:32:05.101Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7537,
+ "load": {
+ "commitMs": 17.13,
+ "readyMs": 774,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.66,
+ "backgroundMs": 0.52,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.78,
+ "avgMs": 0.892,
+ "p50Ms": 0,
+ "p95Ms": 1.783,
+ "maxMs": 1.783,
+ "mainThreadMs": 1.78,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.07,
+ "avgMs": 0.033,
+ "p50Ms": 0.02,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.017,
+ "p50Ms": 0.015,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.049,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.46,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.01,
+ "maxMs": 0.132,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.37,
+ "avgMs": 0.683,
+ "p50Ms": 0.003,
+ "p95Ms": 1.363,
+ "maxMs": 1.363,
+ "mainThreadMs": 1.37,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005947874999999991,
+ "allocatedBytes": 2720272,
+ "heapSizeAfterBytes": 83886080
+ }
+ },
+ "frames": {
+ "frames": 399,
+ "durationMs": 6658.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 399,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 16.96,
+ "p50": 16.96,
+ "p95": 16.96,
+ "p99": 16.96,
+ "worst": 16.96
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.1,
+ "inputHandling": 0,
+ "animation": 4.6,
+ "layoutMeasure": 0.4,
+ "draw": 0.7,
+ "sync": 0.5,
+ "commandIssue": 3.4,
+ "swapBuffers": 31.1,
+ "gpu": 69.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 1.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.2,
+ "swapBuffers": 10.6,
+ "gpu": 23.5,
+ "total": 33.9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 795,
+ "p50": 0.07,
+ "p95": 0.97,
+ "p99": 9.24,
+ "max": 11.19
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 19.74,
+ "max": 22.07
+ },
+ "lateFrames": 0,
+ "busyMs": 273,
+ "busyRatio": 0.041,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6659.8,
+ "commits": {
+ "count": 25,
+ "totalMs": 255.01,
+ "avgMs": 10.2,
+ "p95Ms": 13.412,
+ "maxMs": 16.497
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 8.258,
+ "maxMs": 10.491
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 1.071,
+ "maxMs": 2.081
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 469,
+ "mainThreadMs": 61.33,
+ "backgroundMs": 16.32,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.76,
+ "avgMs": 0.152,
+ "p50Ms": 0.109,
+ "p95Ms": 0.272,
+ "maxMs": 0.272,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 59,
+ "totalMs": 1.11,
+ "avgMs": 0.019,
+ "p50Ms": 0.014,
+ "p95Ms": 0.039,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.11,
+ "items": 590000
+ },
+ "markers.viewportFilter": {
+ "count": 59,
+ "totalMs": 1.6,
+ "avgMs": 0.027,
+ "p50Ms": 0.019,
+ "p95Ms": 0.123,
+ "maxMs": 0.145,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.6,
+ "items": 8259
+ },
+ "markers.diff": {
+ "count": 59,
+ "totalMs": 1.52,
+ "avgMs": 0.026,
+ "p50Ms": 0.019,
+ "p95Ms": 0.06,
+ "maxMs": 0.221,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.52,
+ "items": 4877
+ },
+ "markers.viewportCompute": {
+ "count": 59,
+ "totalMs": 4.41,
+ "avgMs": 0.075,
+ "p50Ms": 0.056,
+ "p95Ms": 0.187,
+ "maxMs": 0.308,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.41,
+ "items": 8259
+ },
+ "markers.applyDiff": {
+ "count": 57,
+ "totalMs": 6.41,
+ "avgMs": 0.112,
+ "p50Ms": 0.087,
+ "p95Ms": 0.406,
+ "maxMs": 0.842,
+ "mainThreadMs": 6.41,
+ "backgroundMs": 0,
+ "items": 150
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 26.04,
+ "avgMs": 1.041,
+ "p50Ms": 0.873,
+ "p95Ms": 2.008,
+ "maxMs": 2.062,
+ "mainThreadMs": 26.04,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 26.77,
+ "avgMs": 1.071,
+ "p50Ms": 0.894,
+ "p95Ms": 2.036,
+ "maxMs": 2.081,
+ "mainThreadMs": 26.77,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 25,
+ "totalMs": 7.67,
+ "avgMs": 0.307,
+ "p50Ms": 0.273,
+ "p95Ms": 0.529,
+ "maxMs": 0.562,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.67,
+ "items": 250000
+ },
+ "marker.visualProps": {
+ "count": 96,
+ "totalMs": 1.36,
+ "avgMs": 0.014,
+ "p50Ms": 0.007,
+ "p95Ms": 0.036,
+ "maxMs": 0.196,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 471.1,
+ "afterLoadMB": 533.5,
+ "afterInteractionMB": 492.4,
+ "afterCleanupMB": 488.6,
+ "peakMB": 533.5,
+ "loadDeltaMB": 62.4,
+ "interactionDeltaMB": -41.1,
+ "retainedAfterCleanupMB": 17.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 471.1,
+ "residentMB": 619.2,
+ "javaHeapMB": 104.5,
+ "nativeHeapMB": 193,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 533.5,
+ "residentMB": 681.6,
+ "javaHeapMB": 109.9,
+ "nativeHeapMB": 251.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 492.4,
+ "residentMB": 640.7,
+ "javaHeapMB": 104.5,
+ "nativeHeapMB": 214.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 488.6,
+ "residentMB": 636.7,
+ "javaHeapMB": 104.7,
+ "nativeHeapMB": 210.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 23592432,
+ "gcCount": 6,
+ "gcTimeMs": 0.009613916000000056,
+ "heapSizeAfterMB": 84
+ },
+ "android": {
+ "javaBytesAllocated": 97296224,
+ "gcCount": 4,
+ "gcTimeMs": 322,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -38818448
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1568,
+ "wallMs": 6666,
+ "percent": 23.5,
+ "threadsBefore": 136,
+ "threadsAfter": 134,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 26,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 260000,
+ "coordinates": 260000,
+ "estimatedBytes": 18613491
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 716252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 5422.96,
+ "commits": {
+ "count": 25,
+ "totalMs": 255.01,
+ "avgMs": 10.2,
+ "p95Ms": 13.412,
+ "maxMs": 16.497
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 8.258,
+ "maxMs": 10.491
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 1.071,
+ "maxMs": 2.081
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 414,
+ "mainThreadMs": 58.56,
+ "backgroundMs": 14.62,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.76,
+ "avgMs": 0.152,
+ "p50Ms": 0.109,
+ "p95Ms": 0.272,
+ "maxMs": 0.272,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 53,
+ "totalMs": 0.83,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.036,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.83,
+ "items": 530000
+ },
+ "markers.viewportFilter": {
+ "count": 53,
+ "totalMs": 1.4,
+ "avgMs": 0.026,
+ "p50Ms": 0.018,
+ "p95Ms": 0.123,
+ "maxMs": 0.145,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.4,
+ "items": 7417
+ },
+ "markers.diff": {
+ "count": 53,
+ "totalMs": 1.18,
+ "avgMs": 0.022,
+ "p50Ms": 0.019,
+ "p95Ms": 0.052,
+ "maxMs": 0.069,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.18,
+ "items": 4364
+ },
+ "markers.viewportCompute": {
+ "count": 53,
+ "totalMs": 3.55,
+ "avgMs": 0.067,
+ "p50Ms": 0.054,
+ "p95Ms": 0.171,
+ "maxMs": 0.187,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.55,
+ "items": 7417
+ },
+ "markers.applyDiff": {
+ "count": 51,
+ "totalMs": 4.19,
+ "avgMs": 0.082,
+ "p50Ms": 0.077,
+ "p95Ms": 0.231,
+ "maxMs": 0.406,
+ "mainThreadMs": 4.19,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 26.04,
+ "avgMs": 1.041,
+ "p50Ms": 0.873,
+ "p95Ms": 2.008,
+ "maxMs": 2.062,
+ "mainThreadMs": 26.04,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 26.77,
+ "avgMs": 1.071,
+ "p50Ms": 0.894,
+ "p95Ms": 2.036,
+ "maxMs": 2.081,
+ "mainThreadMs": 26.77,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 25,
+ "totalMs": 7.67,
+ "avgMs": 0.307,
+ "p50Ms": 0.273,
+ "p95Ms": 0.529,
+ "maxMs": 0.562,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.67,
+ "items": 250000
+ },
+ "marker.visualProps": {
+ "count": 71,
+ "totalMs": 0.81,
+ "avgMs": 0.011,
+ "p50Ms": 0.007,
+ "p95Ms": 0.03,
+ "maxMs": 0.057,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.009613916000000056,
+ "allocatedBytes": 23341760,
+ "heapSizeAfterBytes": 88080384
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-polyline",
+ "name": "10k markers + 10k-point polyline",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "A 10k-point route over 10k markers: three route updates, then a pan.",
+ "recordedAt": "2026-09-10T14:32:14.331Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5351,
+ "load": {
+ "commitMs": 10.58,
+ "readyMs": 798,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 3.84,
+ "backgroundMs": 0.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 1.29,
+ "avgMs": 0.646,
+ "p50Ms": 0,
+ "p95Ms": 1.291,
+ "maxMs": 1.291,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.242,
+ "p50Ms": 0.242,
+ "p95Ms": 0.242,
+ "maxMs": 0.242,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 10000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.081,
+ "p50Ms": 0.081,
+ "p95Ms": 0.081,
+ "maxMs": 0.081,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.025,
+ "p50Ms": 0.021,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.05,
+ "avgMs": 0.027,
+ "p50Ms": 0.025,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.02,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.13,
+ "avgMs": 0.065,
+ "p50Ms": 0.064,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.91,
+ "avgMs": 0.014,
+ "p50Ms": 0.005,
+ "p95Ms": 0.011,
+ "maxMs": 0.541,
+ "mainThreadMs": 0.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.56,
+ "avgMs": 0.781,
+ "p50Ms": 0.003,
+ "p95Ms": 1.559,
+ "maxMs": 1.559,
+ "mainThreadMs": 1.56,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002673833999999986,
+ "allocatedBytes": 4612536,
+ "heapSizeAfterBytes": 88080384
+ }
+ },
+ "frames": {
+ "frames": 268,
+ "durationMs": 4474.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 268,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 18.71,
+ "p50": 18.71,
+ "p95": 18.71,
+ "p99": 18.71,
+ "worst": 18.71
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.4,
+ "inputHandling": 0,
+ "animation": 7.1,
+ "layoutMeasure": 2.2,
+ "draw": 5.7,
+ "sync": 6.9,
+ "commandIssue": 13.5,
+ "swapBuffers": 59.6,
+ "gpu": 58.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1.6,
+ "inputHandling": 0,
+ "animation": 2.7,
+ "layoutMeasure": 0.8,
+ "draw": 2.1,
+ "sync": 2.6,
+ "commandIssue": 5,
+ "swapBuffers": 22.3,
+ "gpu": 22,
+ "total": 37.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 526,
+ "p50": 0.07,
+ "p95": 0.25,
+ "p99": 4.94,
+ "max": 25.35
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.38,
+ "max": 22.72
+ },
+ "lateFrames": 0,
+ "busyMs": 129.4,
+ "busyRatio": 0.0289,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4478.1,
+ "commits": {
+ "count": 3,
+ "totalMs": 11.44,
+ "avgMs": 3.814,
+ "p95Ms": 6.174,
+ "maxMs": 6.174
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 13.244,
+ "maxMs": 17.057
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 3.124,
+ "maxMs": 5.551
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 186,
+ "mainThreadMs": 15.24,
+ "backgroundMs": 4.04,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 9.37,
+ "avgMs": 3.124,
+ "p50Ms": 1.935,
+ "p95Ms": 5.551,
+ "maxMs": 5.551,
+ "mainThreadMs": 9.37,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.89,
+ "avgMs": 0.178,
+ "p50Ms": 0.099,
+ "p95Ms": 0.433,
+ "maxMs": 0.433,
+ "mainThreadMs": 0.89,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.54,
+ "avgMs": 0.033,
+ "p50Ms": 0.019,
+ "p95Ms": 0.191,
+ "maxMs": 0.191,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.99,
+ "avgMs": 0.062,
+ "p50Ms": 0.02,
+ "p95Ms": 0.509,
+ "maxMs": 0.509,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.99,
+ "items": 2349
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.47,
+ "avgMs": 0.029,
+ "p50Ms": 0.017,
+ "p95Ms": 0.099,
+ "maxMs": 0.099,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 1315
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 2.05,
+ "avgMs": 0.128,
+ "p50Ms": 0.065,
+ "p95Ms": 0.753,
+ "maxMs": 0.753,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.05,
+ "items": 2349
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 3.79,
+ "avgMs": 0.237,
+ "p50Ms": 0.182,
+ "p95Ms": 0.591,
+ "maxMs": 0.591,
+ "mainThreadMs": 3.79,
+ "backgroundMs": 0,
+ "items": 174
+ },
+ "marker.visualProps": {
+ "count": 98,
+ "totalMs": 1.19,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.036,
+ "maxMs": 0.113,
+ "mainThreadMs": 1.19,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 488.7,
+ "afterLoadMB": 562.7,
+ "afterInteractionMB": 561.6,
+ "afterCleanupMB": 557.8,
+ "peakMB": 562.7,
+ "loadDeltaMB": 74,
+ "interactionDeltaMB": -1.1,
+ "retainedAfterCleanupMB": 69.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 488.7,
+ "residentMB": 636.9,
+ "javaHeapMB": 104.8,
+ "nativeHeapMB": 210.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 562.7,
+ "residentMB": 710.7,
+ "javaHeapMB": 112.2,
+ "nativeHeapMB": 276.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 561.6,
+ "residentMB": 709.9,
+ "javaHeapMB": 112.2,
+ "nativeHeapMB": 273.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 557.8,
+ "residentMB": 706,
+ "javaHeapMB": 112.3,
+ "nativeHeapMB": 269.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 4641448,
+ "gcCount": 2,
+ "gcTimeMs": 0.008003040999999989,
+ "heapSizeAfterMB": 84
+ },
+ "android": {
+ "javaBytesAllocated": 14493680,
+ "gcCount": 1,
+ "gcTimeMs": 194,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -3180320
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 958,
+ "wallMs": 4503,
+ "percent": 21.3,
+ "threadsBefore": 137,
+ "threadsAfter": 137,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 4,
+ "coordinates": 40000,
+ "estimatedBytes": 1791427
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 442.2,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.17,
+ "avgMs": 6.174,
+ "p95Ms": 6.174,
+ "maxMs": 6.174
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 15.482,
+ "maxMs": 15.482
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 5.551,
+ "maxMs": 5.551
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 5.55,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 5.55,
+ "avgMs": 5.551,
+ "p50Ms": 5.551,
+ "p95Ms": 5.551,
+ "maxMs": 5.551,
+ "mainThreadMs": 5.55,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005893957999999977,
+ "allocatedBytes": 1176008,
+ "heapSizeAfterBytes": 88080384
+ }
+ },
+ {
+ "index": 1,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 415.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.85,
+ "avgMs": 2.847,
+ "p95Ms": 2.847,
+ "maxMs": 2.847
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 7.193,
+ "maxMs": 7.193
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.888,
+ "maxMs": 1.888
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.89,
+ "avgMs": 1.888,
+ "p50Ms": 1.888,
+ "p95Ms": 1.888,
+ "maxMs": 1.888,
+ "mainThreadMs": 1.89,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1175224,
+ "heapSizeAfterBytes": 88080384
+ }
+ },
+ {
+ "index": 2,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 433.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.42,
+ "avgMs": 2.42,
+ "p95Ms": 2.42,
+ "maxMs": 2.42
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.057,
+ "maxMs": 17.057
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.935,
+ "maxMs": 1.935
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.93,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.93,
+ "avgMs": 1.935,
+ "p50Ms": 1.935,
+ "p95Ms": 1.935,
+ "maxMs": 1.935,
+ "mainThreadMs": 1.93,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0021090830000000116,
+ "allocatedBytes": 1175744,
+ "heapSizeAfterBytes": 88080384
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-10k-polygon",
+ "name": "10k markers + 200 polygons",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "200 polygons over 10k markers: three restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:32:23.508Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5296,
+ "load": {
+ "commitMs": 11.31,
+ "readyMs": 856,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 86,
+ "mainThreadMs": 5.69,
+ "backgroundMs": 0.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 2,
+ "totalMs": 3,
+ "avgMs": 1.502,
+ "p50Ms": 0,
+ "p95Ms": 3.004,
+ "maxMs": 3.004,
+ "mainThreadMs": 3,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.409,
+ "p50Ms": 0.409,
+ "p95Ms": 0.409,
+ "maxMs": 0.409,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 10000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.055,
+ "p50Ms": 0.055,
+ "p95Ms": 0.055,
+ "maxMs": 0.055,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.028,
+ "p50Ms": 0.02,
+ "p95Ms": 0.036,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 20000
+ },
+ "markers.viewportFilter": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.012,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.11,
+ "avgMs": 0.057,
+ "p50Ms": 0.051,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 64,
+ "totalMs": 0.97,
+ "avgMs": 0.015,
+ "p50Ms": 0.005,
+ "p95Ms": 0.016,
+ "maxMs": 0.455,
+ "mainThreadMs": 0.97,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 1.65,
+ "avgMs": 0.827,
+ "p50Ms": 0.003,
+ "p95Ms": 1.651,
+ "maxMs": 1.651,
+ "mainThreadMs": 1.65,
+ "backgroundMs": 0,
+ "items": 64
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0024540000000000117,
+ "allocatedBytes": 3409048,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ "frames": {
+ "frames": 264,
+ "durationMs": 4426.3,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.8,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.73,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 263,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0038,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 53.21,
+ "p50": 53.21,
+ "p95": 53.21,
+ "p99": 53.21,
+ "worst": 53.21
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 3.3,
+ "layoutMeasure": 0.6,
+ "draw": 0.4,
+ "sync": 0.4,
+ "commandIssue": 7.1,
+ "swapBuffers": 86.9,
+ "gpu": 86.5
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 3.5,
+ "layoutMeasure": 0.6,
+ "draw": 0.4,
+ "sync": 0.5,
+ "commandIssue": 7.5,
+ "swapBuffers": 92.5,
+ "gpu": 92,
+ "total": 106.4
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 527,
+ "p50": 0.07,
+ "p95": 0.2,
+ "p99": 0.71,
+ "max": 3.15
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.64,
+ "max": 43.72
+ },
+ "lateFrames": 1,
+ "busyMs": 54.4,
+ "busyRatio": 0.0123,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4427.6,
+ "commits": {
+ "count": 3,
+ "totalMs": 12.7,
+ "avgMs": 4.234,
+ "p95Ms": 6.483,
+ "maxMs": 6.483
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 13.532,
+ "maxMs": 17.22
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 13.706,
+ "maxMs": 26.523
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 185,
+ "mainThreadMs": 45.94,
+ "backgroundMs": 2.22,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 41.12,
+ "avgMs": 13.706,
+ "p50Ms": 7.988,
+ "p95Ms": 26.523,
+ "maxMs": 26.523,
+ "mainThreadMs": 41.12,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 0.68,
+ "avgMs": 0.137,
+ "p50Ms": 0.12,
+ "p95Ms": 0.235,
+ "maxMs": 0.235,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 16,
+ "totalMs": 0.32,
+ "avgMs": 0.02,
+ "p50Ms": 0.019,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 160000
+ },
+ "markers.viewportFilter": {
+ "count": 16,
+ "totalMs": 0.45,
+ "avgMs": 0.028,
+ "p50Ms": 0.027,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 2349
+ },
+ "markers.diff": {
+ "count": 16,
+ "totalMs": 0.32,
+ "avgMs": 0.02,
+ "p50Ms": 0.015,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.32,
+ "items": 1314
+ },
+ "markers.viewportCompute": {
+ "count": 16,
+ "totalMs": 1.14,
+ "avgMs": 0.071,
+ "p50Ms": 0.067,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 2349
+ },
+ "markers.applyDiff": {
+ "count": 16,
+ "totalMs": 3.1,
+ "avgMs": 0.194,
+ "p50Ms": 0.183,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 3.1,
+ "backgroundMs": 0,
+ "items": 172
+ },
+ "marker.visualProps": {
+ "count": 97,
+ "totalMs": 1.05,
+ "avgMs": 0.011,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.173,
+ "mainThreadMs": 1.05,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 558,
+ "afterLoadMB": 577.6,
+ "afterInteractionMB": 564.2,
+ "afterCleanupMB": 560.3,
+ "peakMB": 577.6,
+ "loadDeltaMB": 19.6,
+ "interactionDeltaMB": -13.4,
+ "retainedAfterCleanupMB": 2.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 558,
+ "residentMB": 706.1,
+ "javaHeapMB": 112.5,
+ "nativeHeapMB": 269.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 577.6,
+ "residentMB": 725.7,
+ "javaHeapMB": 116.2,
+ "nativeHeapMB": 285.8,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 564.2,
+ "residentMB": 712.2,
+ "javaHeapMB": 122.6,
+ "nativeHeapMB": 264.7,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 560.3,
+ "residentMB": 708.4,
+ "javaHeapMB": 122.8,
+ "nativeHeapMB": 260.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1459456,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 88
+ },
+ "android": {
+ "javaBytesAllocated": 60862816,
+ "gcCount": 2,
+ "gcTimeMs": 230,
+ "blockingGcCount": 0,
+ "nativeHeapDeltaBytes": -22190384
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 1694,
+ "wallMs": 4447,
+ "percent": 38.1,
+ "threadsBefore": 139,
+ "threadsAfter": 139,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 423.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.48,
+ "avgMs": 6.483,
+ "p95Ms": 6.483,
+ "maxMs": 6.483
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 17.22,
+ "maxMs": 17.22
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 26.523,
+ "maxMs": 26.523
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 26.52,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 26.52,
+ "avgMs": 26.523,
+ "p50Ms": 26.523,
+ "p95Ms": 26.523,
+ "maxMs": 26.523,
+ "mainThreadMs": 26.52,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 240608,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 415.92,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.91,
+ "avgMs": 4.91,
+ "p95Ms": 4.91,
+ "maxMs": 4.91
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 9.577,
+ "maxMs": 9.577
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 6.606,
+ "maxMs": 6.606
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 6.61,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 6.61,
+ "avgMs": 6.606,
+ "p50Ms": 6.606,
+ "p95Ms": 6.606,
+ "maxMs": 6.606,
+ "mainThreadMs": 6.61,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 240064,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 417.67,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.31,
+ "avgMs": 1.308,
+ "p95Ms": 1.308,
+ "maxMs": 1.308
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 13.798,
+ "maxMs": 13.798
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 7.988,
+ "maxMs": 7.988
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 7.99,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 7.99,
+ "avgMs": 7.988,
+ "p50Ms": 7.988,
+ "p95Ms": 7.988,
+ "maxMs": 7.988,
+ "mainThreadMs": 7.99,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 240416,
+ "heapSizeAfterBytes": 92274688
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "combined-all",
+ "name": "Markers + clustering + geometry + camera + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "10k clustered markers, a 5k-point route and 100 polygons; zoom sweep, pan, and 100 moving markers at 5 Hz.",
+ "recordedAt": "2026-09-10T14:32:36.554Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 8848,
+ "load": {
+ "commitMs": 10.08,
+ "readyMs": 684,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 23,
+ "mainThreadMs": 8.02,
+ "backgroundMs": 10.65,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.34,
+ "avgMs": 0.447,
+ "p50Ms": 0,
+ "p95Ms": 1.339,
+ "maxMs": 1.339,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.364,
+ "p50Ms": 0.364,
+ "p95Ms": 0.364,
+ "maxMs": 0.364,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 10000
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.79,
+ "avgMs": 0.396,
+ "p50Ms": 0.359,
+ "p95Ms": 0.433,
+ "maxMs": 0.433,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.79,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 4.31,
+ "avgMs": 2.157,
+ "p50Ms": 2.112,
+ "p95Ms": 2.201,
+ "maxMs": 2.201,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.31,
+ "items": 20000
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 52
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 5.15,
+ "avgMs": 2.576,
+ "p50Ms": 2.571,
+ "p95Ms": 2.582,
+ "maxMs": 2.582,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.15,
+ "items": 20000
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 6.62,
+ "avgMs": 3.311,
+ "p50Ms": 0.004,
+ "p95Ms": 6.619,
+ "maxMs": 6.619,
+ "mainThreadMs": 6.62,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.010935499999999987,
+ "allocatedBytes": 4103352,
+ "heapSizeAfterBytes": 92274688
+ }
+ },
+ "frames": {
+ "frames": 476,
+ "durationMs": 7965.9,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 8
+ },
+ "frameTimeMs": {
+ "average": 16.7,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 475,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0021,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.16,
+ "p50": 17.16,
+ "p95": 17.16,
+ "p99": 17.16,
+ "worst": 17.16
+ },
+ "phaseSharePct": {
+ "unknownDelay": 2.9,
+ "inputHandling": 0,
+ "animation": 3.3,
+ "layoutMeasure": 0.2,
+ "draw": 0.4,
+ "sync": 0.4,
+ "commandIssue": 4,
+ "swapBuffers": 39.8,
+ "gpu": 88.5
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 1,
+ "inputHandling": 0,
+ "animation": 1.1,
+ "layoutMeasure": 0.1,
+ "draw": 0.1,
+ "sync": 0.1,
+ "commandIssue": 1.4,
+ "swapBuffers": 13.7,
+ "gpu": 30.4,
+ "total": 34.3
+ },
+ "missedDeadline": 1
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 951,
+ "p50": 0.07,
+ "p95": 0.47,
+ "p99": 9.72,
+ "max": 30.01
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 19.51,
+ "max": 47.67
+ },
+ "lateFrames": 2,
+ "busyMs": 343.5,
+ "busyRatio": 0.0431,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 7967.2,
+ "commits": {
+ "count": 20,
+ "totalMs": 239.2,
+ "avgMs": 11.96,
+ "p95Ms": 18.799,
+ "maxMs": 28.656
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 9.907,
+ "maxMs": 17.886
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 1.015,
+ "maxMs": 3.14
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 874,
+ "mainThreadMs": 128.78,
+ "backgroundMs": 86.96,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 1.15,
+ "avgMs": 0.144,
+ "p50Ms": 0.114,
+ "p95Ms": 0.287,
+ "maxMs": 0.287,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 68,
+ "totalMs": 4.77,
+ "avgMs": 0.07,
+ "p50Ms": 0.022,
+ "p95Ms": 0.413,
+ "maxMs": 0.566,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.77,
+ "items": 680000
+ },
+ "markers.cluster": {
+ "count": 68,
+ "totalMs": 31.74,
+ "avgMs": 0.467,
+ "p50Ms": 0.142,
+ "p95Ms": 2.23,
+ "maxMs": 3.917,
+ "mainThreadMs": 0,
+ "backgroundMs": 31.74,
+ "items": 83339
+ },
+ "markers.diff": {
+ "count": 68,
+ "totalMs": 2.38,
+ "avgMs": 0.035,
+ "p50Ms": 0.021,
+ "p95Ms": 0.099,
+ "maxMs": 0.31,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.38,
+ "items": 6505
+ },
+ "markers.viewportCompute": {
+ "count": 68,
+ "totalMs": 39.5,
+ "avgMs": 0.581,
+ "p50Ms": 0.201,
+ "p95Ms": 2.668,
+ "maxMs": 4.794,
+ "mainThreadMs": 0,
+ "backgroundMs": 39.5,
+ "items": 83339
+ },
+ "markers.applyDiff": {
+ "count": 67,
+ "totalMs": 83.22,
+ "avgMs": 1.242,
+ "p50Ms": 0.005,
+ "p95Ms": 5.116,
+ "maxMs": 33.996,
+ "mainThreadMs": 83.22,
+ "backgroundMs": 0,
+ "items": 3658
+ },
+ "marker.visualProps": {
+ "count": 467,
+ "totalMs": 4.7,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.316,
+ "mainThreadMs": 4.7,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 19.41,
+ "avgMs": 0.97,
+ "p50Ms": 0.756,
+ "p95Ms": 1.609,
+ "maxMs": 3.091,
+ "mainThreadMs": 19.41,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 20.3,
+ "avgMs": 1.015,
+ "p50Ms": 0.847,
+ "p95Ms": 1.627,
+ "maxMs": 3.14,
+ "mainThreadMs": 20.3,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 8.57,
+ "avgMs": 0.428,
+ "p50Ms": 0.29,
+ "p95Ms": 0.821,
+ "maxMs": 1.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.57,
+ "items": 200000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 560.4,
+ "afterLoadMB": 579.4,
+ "afterInteractionMB": 603.5,
+ "afterCleanupMB": 599.6,
+ "peakMB": 603.5,
+ "loadDeltaMB": 19,
+ "interactionDeltaMB": 24.1,
+ "retainedAfterCleanupMB": 39.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 560.4,
+ "residentMB": 708.5,
+ "javaHeapMB": 122.9,
+ "nativeHeapMB": 260.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 579.4,
+ "residentMB": 727.3,
+ "javaHeapMB": 114.6,
+ "nativeHeapMB": 284.4,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 603.5,
+ "residentMB": 751.8,
+ "javaHeapMB": 136.6,
+ "nativeHeapMB": 278.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 599.6,
+ "residentMB": 747.9,
+ "javaHeapMB": 136.8,
+ "nativeHeapMB": 273.9,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 19200856,
+ "gcCount": 5,
+ "gcTimeMs": 0.013021583000000003,
+ "heapSizeAfterMB": 92
+ },
+ "android": {
+ "javaBytesAllocated": 176565616,
+ "gcCount": 8,
+ "gcTimeMs": 780,
+ "blockingGcCount": 2,
+ "nativeHeapDeltaBytes": -6142656
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 3519,
+ "wallMs": 7973,
+ "percent": 44.1,
+ "threadsBefore": 142,
+ "threadsAfter": 142,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 21,
+ "polylines": 1,
+ "polygons": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 210000,
+ "coordinates": 210000,
+ "estimatedBytes": 19031295
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 907033
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 4397.6,
+ "commits": {
+ "count": 20,
+ "totalMs": 239.2,
+ "avgMs": 11.96,
+ "p95Ms": 18.799,
+ "maxMs": 28.656
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 9.907,
+ "maxMs": 17.886
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 1.015,
+ "maxMs": 3.14
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 566,
+ "mainThreadMs": 65.06,
+ "backgroundMs": 36.44,
+ "byName": {
+ "markers.candidates": {
+ "count": 48,
+ "totalMs": 1.38,
+ "avgMs": 0.029,
+ "p50Ms": 0.019,
+ "p95Ms": 0.08,
+ "maxMs": 0.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.38,
+ "items": 480000
+ },
+ "markers.cluster": {
+ "count": 48,
+ "totalMs": 10.72,
+ "avgMs": 0.223,
+ "p50Ms": 0.138,
+ "p95Ms": 0.543,
+ "maxMs": 2.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.72,
+ "items": 9305
+ },
+ "markers.diff": {
+ "count": 48,
+ "totalMs": 1.65,
+ "avgMs": 0.034,
+ "p50Ms": 0.021,
+ "p95Ms": 0.099,
+ "maxMs": 0.273,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.65,
+ "items": 4910
+ },
+ "markers.viewportCompute": {
+ "count": 48,
+ "totalMs": 14.13,
+ "avgMs": 0.294,
+ "p50Ms": 0.191,
+ "p95Ms": 0.643,
+ "maxMs": 2.499,
+ "mainThreadMs": 0,
+ "backgroundMs": 14.13,
+ "items": 9305
+ },
+ "markers.applyDiff": {
+ "count": 48,
+ "totalMs": 22.01,
+ "avgMs": 0.459,
+ "p50Ms": 0.004,
+ "p95Ms": 1.698,
+ "maxMs": 6.913,
+ "mainThreadMs": 22.01,
+ "backgroundMs": 0,
+ "items": 2022
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 19.41,
+ "avgMs": 0.97,
+ "p50Ms": 0.756,
+ "p95Ms": 1.609,
+ "maxMs": 3.091,
+ "mainThreadMs": 19.41,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 20.3,
+ "avgMs": 1.015,
+ "p50Ms": 0.847,
+ "p95Ms": 1.627,
+ "maxMs": 3.14,
+ "mainThreadMs": 20.3,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 8.57,
+ "avgMs": 0.428,
+ "p50Ms": 0.29,
+ "p95Ms": 0.821,
+ "maxMs": 1.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.57,
+ "items": 200000
+ },
+ "marker.visualProps": {
+ "count": 262,
+ "totalMs": 2.69,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.316,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 0.65,
+ "avgMs": 0.163,
+ "p50Ms": 0.114,
+ "p95Ms": 0.287,
+ "maxMs": 0.287,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.013021583000000003,
+ "allocatedBytes": 18805936,
+ "heapSizeAfterBytes": 96468992
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "stability-5m",
+ "name": "Stability, 5 minutes",
+ "group": "stability",
+ "tags": [
+ "long",
+ "baseline"
+ ],
+ "description": "5 minutes of pan legs, zoom sweeps and 1 % marker updates over 10k clustered markers, with a timeline checkpoint (frames, memory, CPU, GC) every minute. The question: does performance degrade over time?",
+ "recordedAt": "2026-09-10T14:37:43.789Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 302874,
+ "load": {
+ "commitMs": 12.22,
+ "readyMs": 828,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 9.03,
+ "backgroundMs": 5.99,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 5.52,
+ "avgMs": 1.839,
+ "p50Ms": 0,
+ "p95Ms": 5.517,
+ "maxMs": 5.517,
+ "mainThreadMs": 5.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 5.24,
+ "avgMs": 5.242,
+ "p50Ms": 5.242,
+ "p95Ms": 5.242,
+ "maxMs": 5.242,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.021,
+ "p50Ms": 0.015,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 0.3,
+ "avgMs": 0.15,
+ "p50Ms": 0.09,
+ "p95Ms": 0.211,
+ "maxMs": 0.211,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 126
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.38,
+ "avgMs": 0.189,
+ "p50Ms": 0.121,
+ "p95Ms": 0.258,
+ "maxMs": 0.258,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 49,
+ "totalMs": 0.8,
+ "avgMs": 0.016,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.262,
+ "mainThreadMs": 0.8,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 2.63,
+ "avgMs": 1.316,
+ "p50Ms": 0.003,
+ "p95Ms": 2.629,
+ "maxMs": 2.629,
+ "mainThreadMs": 2.63,
+ "backgroundMs": 0,
+ "items": 63
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003230041000000017,
+ "allocatedBytes": 2719144,
+ "heapSizeAfterBytes": 96468992
+ }
+ },
+ "frames": {
+ "frames": 18095,
+ "durationMs": 301618,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 297
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 1,
+ 0,
+ 0,
+ 18093,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0001,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 5,
+ "renderTotalMs": {
+ "average": 14.39,
+ "p50": 12.13,
+ "p95": 23.03,
+ "p99": 23.03,
+ "worst": 23.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.1,
+ "inputHandling": 0,
+ "animation": 10.1,
+ "layoutMeasure": 1.9,
+ "draw": 3.2,
+ "sync": 1.9,
+ "commandIssue": 15.6,
+ "swapBuffers": 52.7,
+ "gpu": 62.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.9,
+ "inputHandling": 0,
+ "animation": 9.6,
+ "layoutMeasure": 1.8,
+ "draw": 3,
+ "sync": 1.8,
+ "commandIssue": 14.8,
+ "swapBuffers": 50.1,
+ "gpu": 59.6,
+ "total": 95
+ },
+ "missedDeadline": 5
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 35852,
+ "p50": 0.07,
+ "p95": 0.21,
+ "p99": 1.2,
+ "max": 87.25
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.56,
+ "max": 108.67
+ },
+ "lateFrames": 15,
+ "busyMs": 5275,
+ "busyRatio": 0.0175,
+ "longTasks": {
+ "count": 2,
+ "totalMs": 147,
+ "maxMs": 92.7,
+ "source": "performance-observer"
+ },
+ "durationMs": 301892.2,
+ "commits": {
+ "count": 53,
+ "totalMs": 700.67,
+ "avgMs": 13.22,
+ "p95Ms": 23.726,
+ "maxMs": 39.896
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 53,
+ "avgMs": 10.054,
+ "maxMs": 20.313
+ },
+ "setterMs": {
+ "samples": 53,
+ "avgMs": 0.847,
+ "maxMs": 3.793
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 27430,
+ "mainThreadMs": 1208.94,
+ "backgroundMs": 732.75,
+ "byName": {
+ "camera.apply": {
+ "count": 424,
+ "totalMs": 63.76,
+ "avgMs": 0.15,
+ "p50Ms": 0.108,
+ "p95Ms": 0.308,
+ "maxMs": 5.48,
+ "mainThreadMs": 63.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 1560,
+ "totalMs": 39,
+ "avgMs": 0.025,
+ "p50Ms": 0.018,
+ "p95Ms": 0.057,
+ "maxMs": 0.522,
+ "mainThreadMs": 0,
+ "backgroundMs": 39,
+ "items": 15600000
+ },
+ "markers.cluster": {
+ "count": 1560,
+ "totalMs": 274.81,
+ "avgMs": 0.176,
+ "p50Ms": 0.119,
+ "p95Ms": 0.399,
+ "maxMs": 4.215,
+ "mainThreadMs": 0,
+ "backgroundMs": 274.81,
+ "items": 383347
+ },
+ "markers.diff": {
+ "count": 1560,
+ "totalMs": 41.08,
+ "avgMs": 0.026,
+ "p50Ms": 0.019,
+ "p95Ms": 0.052,
+ "maxMs": 0.493,
+ "mainThreadMs": 0,
+ "backgroundMs": 41.08,
+ "items": 164055
+ },
+ "markers.viewportCompute": {
+ "count": 1560,
+ "totalMs": 364.27,
+ "avgMs": 0.234,
+ "p50Ms": 0.165,
+ "p95Ms": 0.514,
+ "maxMs": 4.292,
+ "mainThreadMs": 0,
+ "backgroundMs": 364.27,
+ "items": 383347
+ },
+ "markers.applyDiff": {
+ "count": 1547,
+ "totalMs": 892.68,
+ "avgMs": 0.577,
+ "p50Ms": 0.093,
+ "p95Ms": 2.515,
+ "maxMs": 17.03,
+ "mainThreadMs": 892.68,
+ "backgroundMs": 0,
+ "items": 105927
+ },
+ "marker.visualProps": {
+ "count": 19060,
+ "totalMs": 164.42,
+ "avgMs": 0.009,
+ "p50Ms": 0.006,
+ "p95Ms": 0.018,
+ "maxMs": 1.461,
+ "mainThreadMs": 164.42,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 53,
+ "totalMs": 43.19,
+ "avgMs": 0.815,
+ "p50Ms": 0.699,
+ "p95Ms": 1.366,
+ "maxMs": 3.705,
+ "mainThreadMs": 43.19,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.set": {
+ "count": 53,
+ "totalMs": 44.89,
+ "avgMs": 0.847,
+ "p50Ms": 0.734,
+ "p95Ms": 1.394,
+ "maxMs": 3.793,
+ "mainThreadMs": 44.89,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.indexBuild": {
+ "count": 53,
+ "totalMs": 13.59,
+ "avgMs": 0.256,
+ "p50Ms": 0.222,
+ "p95Ms": 0.403,
+ "maxMs": 0.809,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.59,
+ "items": 530000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 599.7,
+ "afterLoadMB": 615.3,
+ "afterInteractionMB": 540.2,
+ "afterCleanupMB": 536.2,
+ "peakMB": 714.4,
+ "loadDeltaMB": 15.6,
+ "interactionDeltaMB": -75.1,
+ "retainedAfterCleanupMB": -63.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 599.7,
+ "residentMB": 748.3,
+ "javaHeapMB": 136.9,
+ "nativeHeapMB": 274,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 615.3,
+ "residentMB": 763.4,
+ "javaHeapMB": 117.1,
+ "nativeHeapMB": 308.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-1",
+ "footprintMB": 664.3,
+ "residentMB": 812.4,
+ "javaHeapMB": 128.3,
+ "nativeHeapMB": 342.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-2",
+ "footprintMB": 639.7,
+ "residentMB": 787.9,
+ "javaHeapMB": 127.1,
+ "nativeHeapMB": 318.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-3",
+ "footprintMB": 703.7,
+ "residentMB": 851.9,
+ "javaHeapMB": 129.2,
+ "nativeHeapMB": 377.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-4",
+ "footprintMB": 714.4,
+ "residentMB": 863.4,
+ "javaHeapMB": 127.4,
+ "nativeHeapMB": 387.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 540.2,
+ "residentMB": 688.6,
+ "javaHeapMB": 126.1,
+ "nativeHeapMB": 213.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 536.2,
+ "residentMB": 684.5,
+ "javaHeapMB": 126.3,
+ "nativeHeapMB": 208.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 75565976,
+ "gcCount": 20,
+ "gcTimeMs": 0.1172547490000001,
+ "heapSizeAfterMB": 100
+ },
+ "android": {
+ "javaBytesAllocated": 1030501120,
+ "gcCount": 179,
+ "gcTimeMs": 16383,
+ "blockingGcCount": 6,
+ "nativeHeapDeltaBytes": -99853520
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 68478,
+ "wallMs": 301973,
+ "percent": 22.7,
+ "threadsBefore": 145,
+ "threadsAfter": 138,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 54,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 540000,
+ "coordinates": 540000,
+ "estimatedBytes": 48912139
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 906252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [
+ {
+ "index": 0,
+ "label": "minute-1",
+ "atMs": 62674,
+ "frames": {
+ "frames": 3757,
+ "durationMs": 62623.4,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 1,
+ 0,
+ 0,
+ 3755,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0003,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 23.03,
+ "p50": 23.03,
+ "p95": 23.03,
+ "p99": 23.03,
+ "worst": 23.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.8,
+ "inputHandling": 0,
+ "animation": 15.7,
+ "layoutMeasure": 2.8,
+ "draw": 4.6,
+ "sync": 1.9,
+ "commandIssue": 15.8,
+ "swapBuffers": 56.7,
+ "gpu": 56.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.4,
+ "inputHandling": 0,
+ "animation": 3.6,
+ "layoutMeasure": 0.6,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 3.6,
+ "swapBuffers": 13.1,
+ "gpu": 13,
+ "total": 23
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-1",
+ "footprintMB": 664.3,
+ "residentMB": 812.4,
+ "javaHeapMB": 128.3,
+ "nativeHeapMB": 342.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 26.1,
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.02297300000000002,
+ "allocatedBytes": 12090232,
+ "heapSizeAfterBytes": 96468992
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5794,
+ "mainThreadMs": 326.22,
+ "backgroundMs": 193.28,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 19.84,
+ "avgMs": 0.225,
+ "p50Ms": 0.136,
+ "p95Ms": 0.35,
+ "maxMs": 5.48,
+ "mainThreadMs": 19.84,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 326,
+ "totalMs": 10.44,
+ "avgMs": 0.032,
+ "p50Ms": 0.021,
+ "p95Ms": 0.075,
+ "maxMs": 0.522,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.44,
+ "items": 3260000
+ },
+ "markers.cluster": {
+ "count": 326,
+ "totalMs": 73.73,
+ "avgMs": 0.226,
+ "p50Ms": 0.141,
+ "p95Ms": 0.593,
+ "maxMs": 4.215,
+ "mainThreadMs": 0,
+ "backgroundMs": 73.73,
+ "items": 78999
+ },
+ "markers.diff": {
+ "count": 326,
+ "totalMs": 9.91,
+ "avgMs": 0.03,
+ "p50Ms": 0.021,
+ "p95Ms": 0.068,
+ "maxMs": 0.42,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.91,
+ "items": 34308
+ },
+ "markers.viewportCompute": {
+ "count": 326,
+ "totalMs": 96.47,
+ "avgMs": 0.296,
+ "p50Ms": 0.199,
+ "p95Ms": 0.829,
+ "maxMs": 4.292,
+ "mainThreadMs": 0,
+ "backgroundMs": 96.47,
+ "items": 78999
+ },
+ "markers.applyDiff": {
+ "count": 322,
+ "totalMs": 244.52,
+ "avgMs": 0.759,
+ "p50Ms": 0.116,
+ "p95Ms": 3.171,
+ "maxMs": 17.03,
+ "mainThreadMs": 244.52,
+ "backgroundMs": 0,
+ "items": 22278
+ },
+ "marker.visualProps": {
+ "count": 4047,
+ "totalMs": 38.8,
+ "avgMs": 0.01,
+ "p50Ms": 0.006,
+ "p95Ms": 0.02,
+ "maxMs": 1.179,
+ "mainThreadMs": 38.8,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 11.28,
+ "avgMs": 1.026,
+ "p50Ms": 0.729,
+ "p95Ms": 3.705,
+ "maxMs": 3.705,
+ "mainThreadMs": 11.28,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 11.79,
+ "avgMs": 1.072,
+ "p50Ms": 0.787,
+ "p95Ms": 3.793,
+ "maxMs": 3.793,
+ "mainThreadMs": 11.79,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 2.73,
+ "avgMs": 0.248,
+ "p50Ms": 0.215,
+ "p95Ms": 0.336,
+ "maxMs": 0.336,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.73,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 1,
+ "label": "minute-2",
+ "atMs": 125322,
+ "frames": {
+ "frames": 3755,
+ "durationMs": 62591.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3755,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.13,
+ "p50": 17.13,
+ "p95": 17.13,
+ "p99": 17.13,
+ "worst": 17.13
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.2,
+ "inputHandling": 0,
+ "animation": 3.7,
+ "layoutMeasure": 0.8,
+ "draw": 1.2,
+ "sync": 1.5,
+ "commandIssue": 8.7,
+ "swapBuffers": 20.4,
+ "gpu": 79.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 0.6,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.3,
+ "commandIssue": 1.5,
+ "swapBuffers": 3.5,
+ "gpu": 13.6,
+ "total": 17.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-2",
+ "footprintMB": 639.7,
+ "residentMB": 787.9,
+ "javaHeapMB": 127.1,
+ "nativeHeapMB": 318.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 22.2,
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.023281542000000044,
+ "allocatedBytes": 13653008,
+ "heapSizeAfterBytes": 100663296
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5696,
+ "mainThreadMs": 247.13,
+ "backgroundMs": 141.25,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 11.51,
+ "avgMs": 0.131,
+ "p50Ms": 0.104,
+ "p95Ms": 0.246,
+ "maxMs": 0.512,
+ "mainThreadMs": 11.51,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 324,
+ "totalMs": 6.95,
+ "avgMs": 0.021,
+ "p50Ms": 0.016,
+ "p95Ms": 0.044,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.95,
+ "items": 3240000
+ },
+ "markers.cluster": {
+ "count": 324,
+ "totalMs": 53.14,
+ "avgMs": 0.164,
+ "p50Ms": 0.121,
+ "p95Ms": 0.352,
+ "maxMs": 2.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 53.14,
+ "items": 79441
+ },
+ "markers.diff": {
+ "count": 324,
+ "totalMs": 8,
+ "avgMs": 0.025,
+ "p50Ms": 0.019,
+ "p95Ms": 0.05,
+ "maxMs": 0.326,
+ "mainThreadMs": 0,
+ "backgroundMs": 8,
+ "items": 34085
+ },
+ "markers.viewportCompute": {
+ "count": 324,
+ "totalMs": 69.98,
+ "avgMs": 0.216,
+ "p50Ms": 0.164,
+ "p95Ms": 0.483,
+ "maxMs": 2.256,
+ "mainThreadMs": 0,
+ "backgroundMs": 69.98,
+ "items": 79441
+ },
+ "markers.applyDiff": {
+ "count": 321,
+ "totalMs": 185.47,
+ "avgMs": 0.578,
+ "p50Ms": 0.109,
+ "p95Ms": 2.515,
+ "maxMs": 5.788,
+ "mainThreadMs": 185.47,
+ "backgroundMs": 0,
+ "items": 21950
+ },
+ "marker.visualProps": {
+ "count": 3958,
+ "totalMs": 33.02,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.017,
+ "maxMs": 0.28,
+ "mainThreadMs": 33.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 8.4,
+ "avgMs": 0.764,
+ "p50Ms": 0.727,
+ "p95Ms": 1.077,
+ "maxMs": 1.077,
+ "mainThreadMs": 8.4,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 8.72,
+ "avgMs": 0.793,
+ "p50Ms": 0.752,
+ "p95Ms": 1.111,
+ "maxMs": 1.111,
+ "mainThreadMs": 8.72,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 3.18,
+ "avgMs": 0.289,
+ "p50Ms": 0.208,
+ "p95Ms": 0.809,
+ "maxMs": 0.809,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.18,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 2,
+ "label": "minute-3",
+ "atMs": 187980,
+ "frames": {
+ "frames": 3755,
+ "durationMs": 62592.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3755,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 10.66,
+ "p50": 10.66,
+ "p95": 10.66,
+ "p99": 10.66,
+ "worst": 10.66
+ },
+ "phaseSharePct": {
+ "unknownDelay": 5.2,
+ "inputHandling": 0,
+ "animation": 4.5,
+ "layoutMeasure": 1.1,
+ "draw": 2.3,
+ "sync": 2.1,
+ "commandIssue": 16,
+ "swapBuffers": 66.9,
+ "gpu": 65.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.5,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.7,
+ "swapBuffers": 7.1,
+ "gpu": 7,
+ "total": 10.7
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-3",
+ "footprintMB": 703.7,
+ "residentMB": 851.9,
+ "javaHeapMB": 129.2,
+ "nativeHeapMB": 377.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 21.5,
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.02360562399999999,
+ "allocatedBytes": 13636152,
+ "heapSizeAfterBytes": 100663296
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5631,
+ "mainThreadMs": 228.63,
+ "backgroundMs": 137.12,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 12.36,
+ "avgMs": 0.14,
+ "p50Ms": 0.107,
+ "p95Ms": 0.279,
+ "maxMs": 0.562,
+ "mainThreadMs": 12.36,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 325,
+ "totalMs": 7.08,
+ "avgMs": 0.022,
+ "p50Ms": 0.017,
+ "p95Ms": 0.049,
+ "maxMs": 0.157,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.08,
+ "items": 3250000
+ },
+ "markers.cluster": {
+ "count": 325,
+ "totalMs": 51.41,
+ "avgMs": 0.158,
+ "p50Ms": 0.112,
+ "p95Ms": 0.354,
+ "maxMs": 2.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 51.41,
+ "items": 81471
+ },
+ "markers.diff": {
+ "count": 325,
+ "totalMs": 7.92,
+ "avgMs": 0.024,
+ "p50Ms": 0.018,
+ "p95Ms": 0.042,
+ "maxMs": 0.47,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.92,
+ "items": 34130
+ },
+ "markers.viewportCompute": {
+ "count": 325,
+ "totalMs": 68.07,
+ "avgMs": 0.209,
+ "p50Ms": 0.156,
+ "p95Ms": 0.441,
+ "maxMs": 2.141,
+ "mainThreadMs": 0,
+ "backgroundMs": 68.07,
+ "items": 81471
+ },
+ "markers.applyDiff": {
+ "count": 323,
+ "totalMs": 165.65,
+ "avgMs": 0.513,
+ "p50Ms": 0.084,
+ "p95Ms": 2.34,
+ "maxMs": 6.289,
+ "mainThreadMs": 165.65,
+ "backgroundMs": 0,
+ "items": 21839
+ },
+ "marker.visualProps": {
+ "count": 3887,
+ "totalMs": 33.28,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.017,
+ "maxMs": 1.461,
+ "mainThreadMs": 33.28,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 8.52,
+ "avgMs": 0.775,
+ "p50Ms": 0.685,
+ "p95Ms": 1.547,
+ "maxMs": 1.547,
+ "mainThreadMs": 8.52,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 8.82,
+ "avgMs": 0.802,
+ "p50Ms": 0.734,
+ "p95Ms": 1.583,
+ "maxMs": 1.583,
+ "mainThreadMs": 8.82,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 2.64,
+ "avgMs": 0.24,
+ "p50Ms": 0.228,
+ "p95Ms": 0.403,
+ "maxMs": 0.403,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.64,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 3,
+ "label": "minute-4",
+ "atMs": 250598,
+ "frames": {
+ "frames": 3751,
+ "durationMs": 62523.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 8.98,
+ "p50": 8.98,
+ "p95": 8.98,
+ "p99": 8.98,
+ "worst": 8.98
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4,
+ "inputHandling": 0,
+ "animation": 6.3,
+ "layoutMeasure": 2,
+ "draw": 2.8,
+ "sync": 3.1,
+ "commandIssue": 20.8,
+ "swapBuffers": 59.5,
+ "gpu": 58.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.4,
+ "inputHandling": 0,
+ "animation": 0.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 1.9,
+ "swapBuffers": 5.3,
+ "gpu": 5.2,
+ "total": 9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-4",
+ "footprintMB": 714.4,
+ "residentMB": 863.4,
+ "javaHeapMB": 127.4,
+ "nativeHeapMB": 387.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 20.5,
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.015305958000000008,
+ "allocatedBytes": 13420224,
+ "heapSizeAfterBytes": 104857600
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5644,
+ "mainThreadMs": 199.27,
+ "backgroundMs": 139.51,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 10.58,
+ "avgMs": 0.12,
+ "p50Ms": 0.091,
+ "p95Ms": 0.31,
+ "maxMs": 0.437,
+ "mainThreadMs": 10.58,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 323,
+ "totalMs": 7.5,
+ "avgMs": 0.023,
+ "p50Ms": 0.017,
+ "p95Ms": 0.042,
+ "maxMs": 0.451,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.5,
+ "items": 3230000
+ },
+ "markers.cluster": {
+ "count": 323,
+ "totalMs": 51.91,
+ "avgMs": 0.161,
+ "p50Ms": 0.112,
+ "p95Ms": 0.377,
+ "maxMs": 3.582,
+ "mainThreadMs": 0,
+ "backgroundMs": 51.91,
+ "items": 79498
+ },
+ "markers.diff": {
+ "count": 323,
+ "totalMs": 8.19,
+ "avgMs": 0.025,
+ "p50Ms": 0.019,
+ "p95Ms": 0.047,
+ "maxMs": 0.493,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.19,
+ "items": 33952
+ },
+ "markers.viewportCompute": {
+ "count": 323,
+ "totalMs": 69.47,
+ "avgMs": 0.215,
+ "p50Ms": 0.155,
+ "p95Ms": 0.446,
+ "maxMs": 4.184,
+ "mainThreadMs": 0,
+ "backgroundMs": 69.47,
+ "items": 79498
+ },
+ "markers.applyDiff": {
+ "count": 319,
+ "totalMs": 144.35,
+ "avgMs": 0.453,
+ "p50Ms": 0.091,
+ "p95Ms": 2.227,
+ "maxMs": 4.407,
+ "mainThreadMs": 144.35,
+ "backgroundMs": 0,
+ "items": 21886
+ },
+ "marker.visualProps": {
+ "count": 3912,
+ "totalMs": 28.82,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.015,
+ "maxMs": 0.433,
+ "mainThreadMs": 28.82,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 7.62,
+ "avgMs": 0.693,
+ "p50Ms": 0.688,
+ "p95Ms": 0.862,
+ "maxMs": 0.862,
+ "mainThreadMs": 7.62,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 7.9,
+ "avgMs": 0.719,
+ "p50Ms": 0.711,
+ "p95Ms": 0.886,
+ "maxMs": 0.886,
+ "mainThreadMs": 7.9,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 2.45,
+ "avgMs": 0.223,
+ "p50Ms": 0.212,
+ "p95Ms": 0.268,
+ "maxMs": 0.268,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.45,
+ "items": 110000
+ }
+ }
+ }
+ }
+ ],
+ "metrics": {
+ "cycles": 53
+ },
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ }
+ ],
+ "failures": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/stability-5m.json b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/stability-5m.json
new file mode 100644
index 0000000..2541af9
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/stability-5m.json
@@ -0,0 +1,1541 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-162544-6m8g",
+ "label": "baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo",
+ "scenario": "stability-5m",
+ "name": "Stability, 5 minutes",
+ "group": "stability",
+ "tags": [
+ "long",
+ "baseline"
+ ],
+ "description": "5 minutes of pan legs, zoom sweeps and 1 % marker updates over 10k clustered markers, with a timeline checkpoint (frames, memory, CPU, GC) every minute. The question: does performance degrade over time?",
+ "recordedAt": "2026-09-10T14:37:43.789Z",
+ "platform": "android",
+ "provider": "google",
+ "os": "android 15",
+ "device": {
+ "platform": "android",
+ "model": "sdk_gphone64_arm64",
+ "manufacturer": "Google",
+ "deviceName": "emu64a",
+ "osVersion": "15",
+ "apiLevel": 35,
+ "refreshRateHz": 60,
+ "supportedRefreshRatesHz": [
+ 60
+ ],
+ "screenScale": 2.625,
+ "screenWidthPx": 1080,
+ "screenHeightPx": 2400,
+ "isDebugBuild": false,
+ "isSimulator": true,
+ "cpuCores": 4,
+ "totalMemoryBytes": 4111405056,
+ "appVersion": "1.0.0 (1)",
+ "activity": "MainActivity"
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60.000003814697266,
+ "frameBudgetMs": 16.667,
+ "durationMs": 302874,
+ "load": {
+ "commitMs": 12.22,
+ "readyMs": 828,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 72,
+ "mainThreadMs": 9.03,
+ "backgroundMs": 5.99,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 5.52,
+ "avgMs": 1.839,
+ "p50Ms": 0,
+ "p95Ms": 5.517,
+ "maxMs": 5.517,
+ "mainThreadMs": 5.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 5.24,
+ "avgMs": 5.242,
+ "p50Ms": 5.242,
+ "p95Ms": 5.242,
+ "maxMs": 5.242,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 2,
+ "totalMs": 0.04,
+ "avgMs": 0.021,
+ "p50Ms": 0.015,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 20000
+ },
+ "markers.cluster": {
+ "count": 2,
+ "totalMs": 0.3,
+ "avgMs": 0.15,
+ "p50Ms": 0.09,
+ "p95Ms": 0.211,
+ "maxMs": 0.211,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 162
+ },
+ "markers.diff": {
+ "count": 2,
+ "totalMs": 0.03,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 126
+ },
+ "markers.viewportCompute": {
+ "count": 2,
+ "totalMs": 0.38,
+ "avgMs": 0.189,
+ "p50Ms": 0.121,
+ "p95Ms": 0.258,
+ "maxMs": 0.258,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 162
+ },
+ "marker.visualProps": {
+ "count": 49,
+ "totalMs": 0.8,
+ "avgMs": 0.016,
+ "p50Ms": 0.005,
+ "p95Ms": 0.014,
+ "maxMs": 0.262,
+ "mainThreadMs": 0.8,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.applyDiff": {
+ "count": 2,
+ "totalMs": 2.63,
+ "avgMs": 1.316,
+ "p50Ms": 0.003,
+ "p95Ms": 2.629,
+ "maxMs": 2.629,
+ "mainThreadMs": 2.63,
+ "backgroundMs": 0,
+ "items": 63
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.003230041000000017,
+ "allocatedBytes": 2719144,
+ "heapSizeAfterBytes": 96468992
+ }
+ },
+ "frames": {
+ "frames": 18095,
+ "durationMs": 301618,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 297
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 1,
+ 0,
+ 0,
+ 18093,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0001,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 5,
+ "renderTotalMs": {
+ "average": 14.39,
+ "p50": 12.13,
+ "p95": 23.03,
+ "p99": 23.03,
+ "worst": 23.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 3.1,
+ "inputHandling": 0,
+ "animation": 10.1,
+ "layoutMeasure": 1.9,
+ "draw": 3.2,
+ "sync": 1.9,
+ "commandIssue": 15.6,
+ "swapBuffers": 52.7,
+ "gpu": 62.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 2.9,
+ "inputHandling": 0,
+ "animation": 9.6,
+ "layoutMeasure": 1.8,
+ "draw": 3,
+ "sync": 1.8,
+ "commandIssue": 14.8,
+ "swapBuffers": 50.1,
+ "gpu": 59.6,
+ "total": 95
+ },
+ "missedDeadline": 5
+ }
+ },
+ "js": {
+ "lagSource": "js-queue-ping",
+ "lagMs": {
+ "samples": 35852,
+ "p50": 0.07,
+ "p95": 0.21,
+ "p99": 1.2,
+ "max": 87.25
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.56,
+ "max": 108.67
+ },
+ "lateFrames": 15,
+ "busyMs": 5275,
+ "busyRatio": 0.0175,
+ "longTasks": {
+ "count": 2,
+ "totalMs": 147,
+ "maxMs": 92.7,
+ "source": "performance-observer"
+ },
+ "durationMs": 301892.2,
+ "commits": {
+ "count": 53,
+ "totalMs": 700.67,
+ "avgMs": 13.22,
+ "p95Ms": 23.726,
+ "maxMs": 39.896
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 53,
+ "avgMs": 10.054,
+ "maxMs": 20.313
+ },
+ "setterMs": {
+ "samples": 53,
+ "avgMs": 0.847,
+ "maxMs": 3.793
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 27430,
+ "mainThreadMs": 1208.94,
+ "backgroundMs": 732.75,
+ "byName": {
+ "camera.apply": {
+ "count": 424,
+ "totalMs": 63.76,
+ "avgMs": 0.15,
+ "p50Ms": 0.108,
+ "p95Ms": 0.308,
+ "maxMs": 5.48,
+ "mainThreadMs": 63.76,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 1560,
+ "totalMs": 39,
+ "avgMs": 0.025,
+ "p50Ms": 0.018,
+ "p95Ms": 0.057,
+ "maxMs": 0.522,
+ "mainThreadMs": 0,
+ "backgroundMs": 39,
+ "items": 15600000
+ },
+ "markers.cluster": {
+ "count": 1560,
+ "totalMs": 274.81,
+ "avgMs": 0.176,
+ "p50Ms": 0.119,
+ "p95Ms": 0.399,
+ "maxMs": 4.215,
+ "mainThreadMs": 0,
+ "backgroundMs": 274.81,
+ "items": 383347
+ },
+ "markers.diff": {
+ "count": 1560,
+ "totalMs": 41.08,
+ "avgMs": 0.026,
+ "p50Ms": 0.019,
+ "p95Ms": 0.052,
+ "maxMs": 0.493,
+ "mainThreadMs": 0,
+ "backgroundMs": 41.08,
+ "items": 164055
+ },
+ "markers.viewportCompute": {
+ "count": 1560,
+ "totalMs": 364.27,
+ "avgMs": 0.234,
+ "p50Ms": 0.165,
+ "p95Ms": 0.514,
+ "maxMs": 4.292,
+ "mainThreadMs": 0,
+ "backgroundMs": 364.27,
+ "items": 383347
+ },
+ "markers.applyDiff": {
+ "count": 1547,
+ "totalMs": 892.68,
+ "avgMs": 0.577,
+ "p50Ms": 0.093,
+ "p95Ms": 2.515,
+ "maxMs": 17.03,
+ "mainThreadMs": 892.68,
+ "backgroundMs": 0,
+ "items": 105927
+ },
+ "marker.visualProps": {
+ "count": 19060,
+ "totalMs": 164.42,
+ "avgMs": 0.009,
+ "p50Ms": 0.006,
+ "p95Ms": 0.018,
+ "maxMs": 1.461,
+ "mainThreadMs": 164.42,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 53,
+ "totalMs": 43.19,
+ "avgMs": 0.815,
+ "p50Ms": 0.699,
+ "p95Ms": 1.366,
+ "maxMs": 3.705,
+ "mainThreadMs": 43.19,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.set": {
+ "count": 53,
+ "totalMs": 44.89,
+ "avgMs": 0.847,
+ "p50Ms": 0.734,
+ "p95Ms": 1.394,
+ "maxMs": 3.793,
+ "mainThreadMs": 44.89,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.indexBuild": {
+ "count": 53,
+ "totalMs": 13.59,
+ "avgMs": 0.256,
+ "p50Ms": 0.222,
+ "p95Ms": 0.403,
+ "maxMs": 0.809,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.59,
+ "items": 530000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 599.7,
+ "afterLoadMB": 615.3,
+ "afterInteractionMB": 540.2,
+ "afterCleanupMB": 536.2,
+ "peakMB": 714.4,
+ "loadDeltaMB": 15.6,
+ "interactionDeltaMB": -75.1,
+ "retainedAfterCleanupMB": -63.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 599.7,
+ "residentMB": 748.3,
+ "javaHeapMB": 136.9,
+ "nativeHeapMB": 274,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 615.3,
+ "residentMB": 763.4,
+ "javaHeapMB": 117.1,
+ "nativeHeapMB": 308.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-1",
+ "footprintMB": 664.3,
+ "residentMB": 812.4,
+ "javaHeapMB": 128.3,
+ "nativeHeapMB": 342.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-2",
+ "footprintMB": 639.7,
+ "residentMB": 787.9,
+ "javaHeapMB": 127.1,
+ "nativeHeapMB": 318.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-3",
+ "footprintMB": 703.7,
+ "residentMB": 851.9,
+ "javaHeapMB": 129.2,
+ "nativeHeapMB": 377.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "checkpoint:minute-4",
+ "footprintMB": 714.4,
+ "residentMB": 863.4,
+ "javaHeapMB": 127.4,
+ "nativeHeapMB": 387.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 540.2,
+ "residentMB": 688.6,
+ "javaHeapMB": 126.1,
+ "nativeHeapMB": 213.3,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 536.2,
+ "residentMB": 684.5,
+ "javaHeapMB": 126.3,
+ "nativeHeapMB": 208.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 75565976,
+ "gcCount": 20,
+ "gcTimeMs": 0.1172547490000001,
+ "heapSizeAfterMB": 100
+ },
+ "android": {
+ "javaBytesAllocated": 1030501120,
+ "gcCount": 179,
+ "gcTimeMs": 16383,
+ "blockingGcCount": 6,
+ "nativeHeapDeltaBytes": -99853520
+ },
+ "ios": null
+ },
+ "cpu": {
+ "processCpuMs": 68478,
+ "wallMs": 301973,
+ "percent": 22.7,
+ "threadsBefore": 145,
+ "threadsAfter": 138,
+ "thermalBefore": "none",
+ "thermalAfter": "none",
+ "batteryLevel": 1,
+ "batteryState": "notCharging",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 54,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 540000,
+ "coordinates": 540000,
+ "estimatedBytes": 48912139
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 906252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [
+ {
+ "index": 0,
+ "label": "minute-1",
+ "atMs": 62674,
+ "frames": {
+ "frames": 3757,
+ "durationMs": 62623.4,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 1,
+ 0,
+ 0,
+ 3755,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0003,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 23.03,
+ "p50": 23.03,
+ "p95": 23.03,
+ "p99": 23.03,
+ "worst": 23.03
+ },
+ "phaseSharePct": {
+ "unknownDelay": 1.8,
+ "inputHandling": 0,
+ "animation": 15.7,
+ "layoutMeasure": 2.8,
+ "draw": 4.6,
+ "sync": 1.9,
+ "commandIssue": 15.8,
+ "swapBuffers": 56.7,
+ "gpu": 56.3
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.4,
+ "inputHandling": 0,
+ "animation": 3.6,
+ "layoutMeasure": 0.6,
+ "draw": 1.1,
+ "sync": 0.4,
+ "commandIssue": 3.6,
+ "swapBuffers": 13.1,
+ "gpu": 13,
+ "total": 23
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-1",
+ "footprintMB": 664.3,
+ "residentMB": 812.4,
+ "javaHeapMB": 128.3,
+ "nativeHeapMB": 342.1,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 26.1,
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.02297300000000002,
+ "allocatedBytes": 12090232,
+ "heapSizeAfterBytes": 96468992
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5794,
+ "mainThreadMs": 326.22,
+ "backgroundMs": 193.28,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 19.84,
+ "avgMs": 0.225,
+ "p50Ms": 0.136,
+ "p95Ms": 0.35,
+ "maxMs": 5.48,
+ "mainThreadMs": 19.84,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 326,
+ "totalMs": 10.44,
+ "avgMs": 0.032,
+ "p50Ms": 0.021,
+ "p95Ms": 0.075,
+ "maxMs": 0.522,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.44,
+ "items": 3260000
+ },
+ "markers.cluster": {
+ "count": 326,
+ "totalMs": 73.73,
+ "avgMs": 0.226,
+ "p50Ms": 0.141,
+ "p95Ms": 0.593,
+ "maxMs": 4.215,
+ "mainThreadMs": 0,
+ "backgroundMs": 73.73,
+ "items": 78999
+ },
+ "markers.diff": {
+ "count": 326,
+ "totalMs": 9.91,
+ "avgMs": 0.03,
+ "p50Ms": 0.021,
+ "p95Ms": 0.068,
+ "maxMs": 0.42,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.91,
+ "items": 34308
+ },
+ "markers.viewportCompute": {
+ "count": 326,
+ "totalMs": 96.47,
+ "avgMs": 0.296,
+ "p50Ms": 0.199,
+ "p95Ms": 0.829,
+ "maxMs": 4.292,
+ "mainThreadMs": 0,
+ "backgroundMs": 96.47,
+ "items": 78999
+ },
+ "markers.applyDiff": {
+ "count": 322,
+ "totalMs": 244.52,
+ "avgMs": 0.759,
+ "p50Ms": 0.116,
+ "p95Ms": 3.171,
+ "maxMs": 17.03,
+ "mainThreadMs": 244.52,
+ "backgroundMs": 0,
+ "items": 22278
+ },
+ "marker.visualProps": {
+ "count": 4047,
+ "totalMs": 38.8,
+ "avgMs": 0.01,
+ "p50Ms": 0.006,
+ "p95Ms": 0.02,
+ "maxMs": 1.179,
+ "mainThreadMs": 38.8,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 11.28,
+ "avgMs": 1.026,
+ "p50Ms": 0.729,
+ "p95Ms": 3.705,
+ "maxMs": 3.705,
+ "mainThreadMs": 11.28,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 11.79,
+ "avgMs": 1.072,
+ "p50Ms": 0.787,
+ "p95Ms": 3.793,
+ "maxMs": 3.793,
+ "mainThreadMs": 11.79,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 2.73,
+ "avgMs": 0.248,
+ "p50Ms": 0.215,
+ "p95Ms": 0.336,
+ "maxMs": 0.336,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.73,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 1,
+ "label": "minute-2",
+ "atMs": 125322,
+ "frames": {
+ "frames": 3755,
+ "durationMs": 62591.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3755,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 17.13,
+ "p50": 17.13,
+ "p95": 17.13,
+ "p99": 17.13,
+ "worst": 17.13
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4.2,
+ "inputHandling": 0,
+ "animation": 3.7,
+ "layoutMeasure": 0.8,
+ "draw": 1.2,
+ "sync": 1.5,
+ "commandIssue": 8.7,
+ "swapBuffers": 20.4,
+ "gpu": 79.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.7,
+ "inputHandling": 0,
+ "animation": 0.6,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.3,
+ "commandIssue": 1.5,
+ "swapBuffers": 3.5,
+ "gpu": 13.6,
+ "total": 17.1
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-2",
+ "footprintMB": 639.7,
+ "residentMB": 787.9,
+ "javaHeapMB": 127.1,
+ "nativeHeapMB": 318.2,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 22.2,
+ "hermes": {
+ "available": true,
+ "gcCount": 3,
+ "gcTimeMs": 0.023281542000000044,
+ "allocatedBytes": 13653008,
+ "heapSizeAfterBytes": 100663296
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5696,
+ "mainThreadMs": 247.13,
+ "backgroundMs": 141.25,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 11.51,
+ "avgMs": 0.131,
+ "p50Ms": 0.104,
+ "p95Ms": 0.246,
+ "maxMs": 0.512,
+ "mainThreadMs": 11.51,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 324,
+ "totalMs": 6.95,
+ "avgMs": 0.021,
+ "p50Ms": 0.016,
+ "p95Ms": 0.044,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.95,
+ "items": 3240000
+ },
+ "markers.cluster": {
+ "count": 324,
+ "totalMs": 53.14,
+ "avgMs": 0.164,
+ "p50Ms": 0.121,
+ "p95Ms": 0.352,
+ "maxMs": 2.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 53.14,
+ "items": 79441
+ },
+ "markers.diff": {
+ "count": 324,
+ "totalMs": 8,
+ "avgMs": 0.025,
+ "p50Ms": 0.019,
+ "p95Ms": 0.05,
+ "maxMs": 0.326,
+ "mainThreadMs": 0,
+ "backgroundMs": 8,
+ "items": 34085
+ },
+ "markers.viewportCompute": {
+ "count": 324,
+ "totalMs": 69.98,
+ "avgMs": 0.216,
+ "p50Ms": 0.164,
+ "p95Ms": 0.483,
+ "maxMs": 2.256,
+ "mainThreadMs": 0,
+ "backgroundMs": 69.98,
+ "items": 79441
+ },
+ "markers.applyDiff": {
+ "count": 321,
+ "totalMs": 185.47,
+ "avgMs": 0.578,
+ "p50Ms": 0.109,
+ "p95Ms": 2.515,
+ "maxMs": 5.788,
+ "mainThreadMs": 185.47,
+ "backgroundMs": 0,
+ "items": 21950
+ },
+ "marker.visualProps": {
+ "count": 3958,
+ "totalMs": 33.02,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.017,
+ "maxMs": 0.28,
+ "mainThreadMs": 33.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 8.4,
+ "avgMs": 0.764,
+ "p50Ms": 0.727,
+ "p95Ms": 1.077,
+ "maxMs": 1.077,
+ "mainThreadMs": 8.4,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 8.72,
+ "avgMs": 0.793,
+ "p50Ms": 0.752,
+ "p95Ms": 1.111,
+ "maxMs": 1.111,
+ "mainThreadMs": 8.72,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 3.18,
+ "avgMs": 0.289,
+ "p50Ms": 0.208,
+ "p95Ms": 0.809,
+ "maxMs": 0.809,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.18,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 2,
+ "label": "minute-3",
+ "atMs": 187980,
+ "frames": {
+ "frames": 3755,
+ "durationMs": 62592.7,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3755,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 10.66,
+ "p50": 10.66,
+ "p95": 10.66,
+ "p99": 10.66,
+ "worst": 10.66
+ },
+ "phaseSharePct": {
+ "unknownDelay": 5.2,
+ "inputHandling": 0,
+ "animation": 4.5,
+ "layoutMeasure": 1.1,
+ "draw": 2.3,
+ "sync": 2.1,
+ "commandIssue": 16,
+ "swapBuffers": 66.9,
+ "gpu": 65.8
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.5,
+ "inputHandling": 0,
+ "animation": 0.5,
+ "layoutMeasure": 0.1,
+ "draw": 0.2,
+ "sync": 0.2,
+ "commandIssue": 1.7,
+ "swapBuffers": 7.1,
+ "gpu": 7,
+ "total": 10.7
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-3",
+ "footprintMB": 703.7,
+ "residentMB": 851.9,
+ "javaHeapMB": 129.2,
+ "nativeHeapMB": 377.6,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 21.5,
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.02360562399999999,
+ "allocatedBytes": 13636152,
+ "heapSizeAfterBytes": 100663296
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5631,
+ "mainThreadMs": 228.63,
+ "backgroundMs": 137.12,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 12.36,
+ "avgMs": 0.14,
+ "p50Ms": 0.107,
+ "p95Ms": 0.279,
+ "maxMs": 0.562,
+ "mainThreadMs": 12.36,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 325,
+ "totalMs": 7.08,
+ "avgMs": 0.022,
+ "p50Ms": 0.017,
+ "p95Ms": 0.049,
+ "maxMs": 0.157,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.08,
+ "items": 3250000
+ },
+ "markers.cluster": {
+ "count": 325,
+ "totalMs": 51.41,
+ "avgMs": 0.158,
+ "p50Ms": 0.112,
+ "p95Ms": 0.354,
+ "maxMs": 2.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 51.41,
+ "items": 81471
+ },
+ "markers.diff": {
+ "count": 325,
+ "totalMs": 7.92,
+ "avgMs": 0.024,
+ "p50Ms": 0.018,
+ "p95Ms": 0.042,
+ "maxMs": 0.47,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.92,
+ "items": 34130
+ },
+ "markers.viewportCompute": {
+ "count": 325,
+ "totalMs": 68.07,
+ "avgMs": 0.209,
+ "p50Ms": 0.156,
+ "p95Ms": 0.441,
+ "maxMs": 2.141,
+ "mainThreadMs": 0,
+ "backgroundMs": 68.07,
+ "items": 81471
+ },
+ "markers.applyDiff": {
+ "count": 323,
+ "totalMs": 165.65,
+ "avgMs": 0.513,
+ "p50Ms": 0.084,
+ "p95Ms": 2.34,
+ "maxMs": 6.289,
+ "mainThreadMs": 165.65,
+ "backgroundMs": 0,
+ "items": 21839
+ },
+ "marker.visualProps": {
+ "count": 3887,
+ "totalMs": 33.28,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.017,
+ "maxMs": 1.461,
+ "mainThreadMs": 33.28,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 8.52,
+ "avgMs": 0.775,
+ "p50Ms": 0.685,
+ "p95Ms": 1.547,
+ "maxMs": 1.547,
+ "mainThreadMs": 8.52,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 8.82,
+ "avgMs": 0.802,
+ "p50Ms": 0.734,
+ "p95Ms": 1.583,
+ "maxMs": 1.583,
+ "mainThreadMs": 8.82,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 2.64,
+ "avgMs": 0.24,
+ "p50Ms": 0.228,
+ "p95Ms": 0.403,
+ "maxMs": 0.403,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.64,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 3,
+ "label": "minute-4",
+ "atMs": 250598,
+ "frames": {
+ "frames": 3751,
+ "durationMs": 62523.1,
+ "refreshRateHz": 60.000003814697266,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 62
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3751,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0,
+ "android": {
+ "frames": 1,
+ "renderTotalMs": {
+ "average": 8.98,
+ "p50": 8.98,
+ "p95": 8.98,
+ "p99": 8.98,
+ "worst": 8.98
+ },
+ "phaseSharePct": {
+ "unknownDelay": 4,
+ "inputHandling": 0,
+ "animation": 6.3,
+ "layoutMeasure": 2,
+ "draw": 2.8,
+ "sync": 3.1,
+ "commandIssue": 20.8,
+ "swapBuffers": 59.5,
+ "gpu": 58.2
+ },
+ "phaseSumsMs": {
+ "unknownDelay": 0.4,
+ "inputHandling": 0,
+ "animation": 0.6,
+ "layoutMeasure": 0.2,
+ "draw": 0.3,
+ "sync": 0.3,
+ "commandIssue": 1.9,
+ "swapBuffers": 5.3,
+ "gpu": 5.2,
+ "total": 9
+ },
+ "missedDeadline": 1
+ }
+ },
+ "memory": {
+ "label": "minute-4",
+ "footprintMB": 714.4,
+ "residentMB": 863.4,
+ "javaHeapMB": 127.4,
+ "nativeHeapMB": 387.5,
+ "mallocBlocks": null,
+ "mallocMB": null
+ },
+ "cpuPercent": 20.5,
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.015305958000000008,
+ "allocatedBytes": 13420224,
+ "heapSizeAfterBytes": 104857600
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 5644,
+ "mainThreadMs": 199.27,
+ "backgroundMs": 139.51,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 10.58,
+ "avgMs": 0.12,
+ "p50Ms": 0.091,
+ "p95Ms": 0.31,
+ "maxMs": 0.437,
+ "mainThreadMs": 10.58,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 323,
+ "totalMs": 7.5,
+ "avgMs": 0.023,
+ "p50Ms": 0.017,
+ "p95Ms": 0.042,
+ "maxMs": 0.451,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.5,
+ "items": 3230000
+ },
+ "markers.cluster": {
+ "count": 323,
+ "totalMs": 51.91,
+ "avgMs": 0.161,
+ "p50Ms": 0.112,
+ "p95Ms": 0.377,
+ "maxMs": 3.582,
+ "mainThreadMs": 0,
+ "backgroundMs": 51.91,
+ "items": 79498
+ },
+ "markers.diff": {
+ "count": 323,
+ "totalMs": 8.19,
+ "avgMs": 0.025,
+ "p50Ms": 0.019,
+ "p95Ms": 0.047,
+ "maxMs": 0.493,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.19,
+ "items": 33952
+ },
+ "markers.viewportCompute": {
+ "count": 323,
+ "totalMs": 69.47,
+ "avgMs": 0.215,
+ "p50Ms": 0.155,
+ "p95Ms": 0.446,
+ "maxMs": 4.184,
+ "mainThreadMs": 0,
+ "backgroundMs": 69.47,
+ "items": 79498
+ },
+ "markers.applyDiff": {
+ "count": 319,
+ "totalMs": 144.35,
+ "avgMs": 0.453,
+ "p50Ms": 0.091,
+ "p95Ms": 2.227,
+ "maxMs": 4.407,
+ "mainThreadMs": 144.35,
+ "backgroundMs": 0,
+ "items": 21886
+ },
+ "marker.visualProps": {
+ "count": 3912,
+ "totalMs": 28.82,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.015,
+ "maxMs": 0.433,
+ "mainThreadMs": 28.82,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 7.62,
+ "avgMs": 0.693,
+ "p50Ms": 0.688,
+ "p95Ms": 0.862,
+ "maxMs": 0.862,
+ "mainThreadMs": 7.62,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 7.9,
+ "avgMs": 0.719,
+ "p50Ms": 0.711,
+ "p95Ms": 0.886,
+ "maxMs": 0.886,
+ "mainThreadMs": 7.9,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 2.45,
+ "avgMs": 0.223,
+ "p50Ms": 0.212,
+ "p95Ms": 0.268,
+ "maxMs": 0.268,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.45,
+ "items": 110000
+ }
+ }
+ }
+ }
+ ],
+ "metrics": {
+ "cycles": 53
+ },
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/summary.md b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/summary.md
new file mode 100644
index 0000000..c493cb5
--- /dev/null
+++ b/performance/results/baseline/android/google-sdk-gphone64-arm64-release-probes/summary.md
@@ -0,0 +1,207 @@
+Run 20260910-162544-6m8g (baseline run 3 (JS-queue probe), Android emulator API 35 arm64, solo) · android 15 · Google sdk_gphone64_arm64 · 60 Hz · provider google
+Build: release, Hermes, probes · NOT production-representative (simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement)
+Recorded 2026-09-10T14:25:47.462Z → 2026-09-10T14:37:43.810Z
+
+| Scenario | FPS avg | Frame p95 | Frame p99 | Worst frame | Jank ratio | JS lag p95 | JS commit avg | Native main-thread | RAM after | RAM Δ interaction | JS allocated | CPU |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| markers-100 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.20 ms | N/A | 1.54 ms | 178 MB | 18 MB | 145 KB | 18 % |
+| markers-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.24 ms | N/A | 3.67 ms | 180 MB | -5 MB | 157 KB | 20 % |
+| markers-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | N/A | 7.62 ms | 200 MB | -2 MB | 174 KB | 22 % |
+| markers-50k | 59.3 | 16.7 ms | 16.7 ms | 50.0 ms | 0.6 % | 0.23 ms | N/A | 28.8 ms | 253 MB | -7 MB | 249 KB | 39 % |
+| markers-children-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.27 ms | N/A | 2.96 ms | 240 MB | -36 MB | 157 KB | 25 % |
+| markers-10k-rich | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.18 ms | N/A | 4.21 ms | 253 MB | 54 MB | 176 KB | 14 % |
+| camera-fast-pan-0 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | N/A | 0.88 ms | 267 MB | 33 MB | 167 KB | 17 % |
+| camera-fast-pan-1k | 59.7 | 16.7 ms | 16.7 ms | 33.3 ms | 0.4 % | 0.23 ms | N/A | 3.36 ms | 291 MB | 36 MB | 206 KB | 19 % |
+| camera-idle-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.55 ms | N/A | 0.00 ms | 270 MB | 4 MB | 209 KB | 5 % |
+| camera-slow-pan-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 6.04 ms | 220 MB | -19 MB | 349 KB | 14 % |
+| camera-fast-pan-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.17 ms | N/A | 9.23 ms | 269 MB | -17 MB | 254 KB | 23 % |
+| camera-continuous-pan-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 12.7 ms | 229 MB | 6 MB | 389 KB | 12 % |
+| camera-zoom-in-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.20 ms | N/A | 51.2 ms | 263 MB | -31 MB | 577 KB | 25 % |
+| camera-zoom-out-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.18 ms | N/A | 42.5 ms | 272 MB | 22 MB | 434 KB | 25 % |
+| camera-rapid-zoom-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 42.9 ms | 335 MB | 86 MB | 427 KB | 34 % |
+| camera-rotate-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.25 ms | N/A | 45.3 ms | 257 MB | -38 MB | 301 KB | 32 % |
+| camera-pitch-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | N/A | 1.52 ms | 287 MB | -29 MB | 137 KB | 50 % |
+| camera-rapid-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.27 ms | N/A | 17.6 ms | 293 MB | -60 MB | 351 KB | 27 % |
+| camera-fast-pan-50k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.19 ms | N/A | 36.0 ms | 334 MB | -18 MB | 364 KB | 36 % |
+| mutations-10k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.66 ms | 16.0 ms | 170.6 ms | 314 MB | -54 MB | 43.6 MB | 12 % |
+| mutations-1k-children | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.37 ms | 4.88 ms | 25.9 ms | 334 MB | -40 MB | 28.7 MB | 7 % |
+| mutations-continuous-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.39 ms | 2.58 ms | 31.7 ms | 333 MB | 16 MB | 6.7 MB | 12 % |
+| mutations-continuous-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 8.04 ms | 12.3 ms | 90.0 ms | 328 MB | -69 MB | 44.5 MB | 23 % |
+| polyline-100 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.30 ms | 0.66 ms | 4.72 ms | 340 MB | -46 MB | 553 KB | 12 % |
+| polyline-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.35 ms | 1.02 ms | 6.84 ms | 334 MB | -64 MB | 1.7 MB | 13 % |
+| polyline-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.28 ms | 1.66 ms | 27.0 ms | 371 MB | -25 MB | 9.5 MB | 13 % |
+| polyline-100k | 58.6 | 16.7 ms | 33.3 ms | 33.3 ms | 2.4 % | 41.0 ms | 6.03 ms | 120.5 ms | 422 MB | 69 MB | 90.8 MB | 29 % |
+| polygon-100 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.32 ms | 0.73 ms | 3.90 ms | 415 MB | 49 MB | 386 KB | 11 % |
+| polygon-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.26 ms | 0.82 ms | 6.39 ms | 420 MB | 51 MB | 1.1 MB | 11 % |
+| polygon-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.38 ms | 1.39 ms | 19.4 ms | 442 MB | 67 MB | 6.1 MB | 12 % |
+| polylines-200x50 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.21 ms | 1.96 ms | 37.4 ms | 428 MB | -2 MB | 2.6 MB | 24 % |
+| polygons-200x20 | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.27 ms | 1.18 ms | 17.8 ms | 390 MB | -9 MB | 1.3 MB | 37 % |
+| cluster-1k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.22 ms | 1.58 ms | 74.6 ms | 470 MB | 68 MB | 811 KB | 14 % |
+| cluster-10k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.21 ms | 11.2 ms | 80.6 ms | 391 MB | -94 MB | 1.6 MB | 22 % |
+| cluster-50k | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.24 ms | 62.3 ms | 175.2 ms | 447 MB | -5 MB | 5.0 MB | 34 % |
+| combined-10k-camera | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.16 ms | N/A | 26.2 ms | 488 MB | -24 MB | 459 KB | 28 % |
+| combined-10k-cluster-camera | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.25 ms | N/A | 79.2 ms | 475 MB | 8 MB | 344 KB | 30 % |
+| combined-10k-updates | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.97 ms | 10.2 ms | 61.3 ms | 492 MB | -41 MB | 22.5 MB | 24 % |
+| combined-10k-polyline | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.25 ms | 3.81 ms | 15.2 ms | 562 MB | -1 MB | 4.4 MB | 21 % |
+| combined-10k-polygon | 59.8 | 16.7 ms | 16.7 ms | 33.3 ms | 0.4 % | 0.20 ms | 4.23 ms | 45.9 ms | 564 MB | -13 MB | 1.4 MB | 38 % |
+| combined-all | 59.9 | 16.7 ms | 16.7 ms | 33.3 ms | 0.2 % | 0.47 ms | 12.0 ms | 128.8 ms | 604 MB | 24 MB | 18.3 MB | 44 % |
+| stability-5m | 60.0 | 16.7 ms | 16.7 ms | 33.3 ms | 0.0 % | 0.21 ms | 13.2 ms | 1208.9 ms | 540 MB | -75 MB | 72.1 MB | 23 % |
+
+#### mutations-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 16.7 ms | 14.3 ms | 0.98 ms | 0.98 ms | 0.94 ms | 0.30 ms | 0.06 ms | 0.00 ms | 1001 KB |
+| remove-1 | 1 | 16.7 ms | 15.2 ms | 1.43 ms | 1.43 ms | 1.35 ms | 0.51 ms | 0.08 ms | 0.01 ms | 910 KB |
+| update-1 | 1 | 17.2 ms | 16.3 ms | 1.33 ms | 1.33 ms | 1.30 ms | 0.34 ms | 0.06 ms | 0.00 ms | 910 KB |
+| update-10 | 10 | 18.8 ms | 17.0 ms | 1.23 ms | 1.23 ms | 1.20 ms | 0.54 ms | 0.06 ms | 0.00 ms | 911 KB |
+| update-100 | 100 | 16.7 ms | 15.6 ms | 2.12 ms | 2.12 ms | 2.03 ms | 0.92 ms | 0.08 ms | 0.01 ms | 921 KB |
+| update-1pct | 100 | 17.4 ms | 14.4 ms | 1.39 ms | 1.39 ms | 1.34 ms | 0.41 ms | 0.07 ms | 0.09 ms | 923 KB |
+| update-10pct | 1000 | 17.4 ms | 13.1 ms | 2.36 ms | 2.36 ms | 2.31 ms | 0.39 ms | 0.10 ms | 0.17 ms | 1.0 MB |
+| update-100pct | 10000 | 12.1 ms | 14.1 ms | 1.29 ms | 1.29 ms | 1.21 ms | 0.39 ms | 0.06 ms | 0.53 ms | 2.1 MB |
+
+JS commit cost vs. changed markers: empirical exponent -0.02 (0 = flat, 1 = linear).
+
+#### mutations-1k-children steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | polylines.set | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 6.82 ms | 5.80 ms | 0.24 ms | 0.26 ms | 0.22 ms | 0.30 ms | 0.05 ms | 0.01 ms | 0.02 ms | 0.00 ms | 702 KB |
+| remove-1 | 1 | 4.00 ms | 10.1 ms | 0.27 ms | 0.27 ms | 0.23 ms | 0.25 ms | 0.04 ms | 0.00 ms | 0.02 ms | 0.00 ms | 696 KB |
+| update-1 | 1 | 4.44 ms | 9.37 ms | 0.34 ms | 0.34 ms | 0.31 ms | 0.27 ms | 0.04 ms | 0.00 ms | 0.01 ms | 0.00 ms | 694 KB |
+| update-10 | 10 | 5.30 ms | 8.34 ms | 0.19 ms | 0.19 ms | 0.17 ms | 0.17 ms | 0.03 ms | 0.00 ms | 0.01 ms | 0.00 ms | 695 KB |
+| update-100 | 100 | 4.50 ms | 9.70 ms | 0.30 ms | 0.30 ms | 0.25 ms | 0.15 ms | 0.02 ms | 0.06 ms | 0.01 ms | 0.00 ms | 707 KB |
+| update-1pct | 10 | 5.03 ms | 10.3 ms | 0.40 ms | 0.40 ms | 0.36 ms | 0.49 ms | 0.03 ms | 0.00 ms | 0.01 ms | 0.00 ms | 696 KB |
+| update-10pct | 100 | 4.98 ms | 9.77 ms | 0.25 ms | 0.25 ms | 0.21 ms | 0.53 ms | 0.04 ms | 0.00 ms | 0.02 ms | 0.00 ms | 706 KB |
+| update-100pct | 1000 | 3.49 ms | 8.83 ms | 0.28 ms | 0.28 ms | 0.26 ms | 0.36 ms | 0.02 ms | 0.20 ms | 0.01 ms | 0.00 ms | 814 KB |
+
+JS commit cost vs. changed markers: empirical exponent -0.04 (0 = flat, 1 = linear).
+
+#### mutations-continuous-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 2.58 ms | 13.7 ms | 0.29 ms | 14.7 ms | 12.6 ms | 15.9 ms | 2.04 ms | 3.59 ms | 6.5 MB |
+
+#### mutations-continuous-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 12.3 ms | 7.07 ms | 0.91 ms | 45.6 ms | 44.1 ms | 16.1 ms | 2.32 ms | 0.19 ms | 44.3 MB |
+
+#### polyline-100 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 100 | 0.55 ms | 13.3 ms | 0.46 ms | 0.46 ms | 36 KB |
+| perturb | 100 | 0.62 ms | 12.5 ms | 0.41 ms | 0.41 ms | 36 KB |
+
+#### polyline-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 1000 | 0.97 ms | 12.1 ms | 0.64 ms | 0.64 ms | 167 KB |
+| perturb | 1000 | 1.08 ms | 12.3 ms | 0.73 ms | 0.73 ms | 177 KB |
+
+#### polyline-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 10000 | 1.37 ms | 9.61 ms | 3.00 ms | 3.00 ms | 1.0 MB |
+| perturb | 10000 | 1.76 ms | 3.75 ms | 2.75 ms | 2.75 ms | 1.1 MB |
+
+#### polyline-100k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 100000 | 6.12 ms | 16.0 ms | 15.4 ms | 15.4 ms | 9.9 MB |
+| perturb | 100000 | 6.00 ms | 11.8 ms | 14.5 ms | 14.5 ms | 11.0 MB |
+
+#### polygon-100 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 100 | 0.79 ms | 12.8 ms | 0.83 ms | 0.83 ms | 36 KB |
+
+#### polygon-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 1000 | 0.80 ms | 13.6 ms | 1.05 ms | 1.05 ms | 167 KB |
+
+#### polygon-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 10000 | 1.16 ms | 6.55 ms | 3.49 ms | 3.49 ms | 1.0 MB |
+
+#### polylines-200x50 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle-all | | 2.10 ms | 7.44 ms | 12.2 ms | 12.2 ms | 525 KB |
+
+#### polygons-200x20 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle-all | | 1.10 ms | 13.8 ms | 5.66 ms | 5.66 ms | 233 KB |
+
+#### cluster-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| zoom-sweep | | N/A | N/A | N/A | N/A | N/A | N/A | 12.8 ms | 68.9 ms | 220 KB |
+| pan | | N/A | N/A | N/A | N/A | N/A | N/A | 10.3 ms | 1.13 ms | 109 KB |
+| update-1pct | 10 | 1.58 ms | 13.7 ms | 0.26 ms | 0.26 ms | 0.24 ms | 0.26 ms | 0.86 ms | 0.10 ms | 148 KB |
+
+#### cluster-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| zoom-sweep | | N/A | N/A | N/A | N/A | N/A | N/A | 33.5 ms | 72.9 ms | 253 KB |
+| pan | | N/A | N/A | N/A | N/A | N/A | N/A | 47.4 ms | 1.46 ms | 110 KB |
+| update-1pct | 100 | 11.2 ms | 6.10 ms | 1.08 ms | 1.08 ms | 1.07 ms | 0.31 ms | 4.19 ms | 0.18 ms | 932 KB |
+
+#### cluster-50k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| zoom-sweep | | N/A | N/A | N/A | N/A | N/A | N/A | 242.8 ms | 163.9 ms | 219 KB |
+| pan | | N/A | N/A | N/A | N/A | N/A | N/A | 248.8 ms | 2.05 ms | 110 KB |
+| update-1pct | 500 | 62.3 ms | 15.4 ms | 2.95 ms | 2.95 ms | 2.93 ms | 0.67 ms | 22.9 ms | 0.15 ms | 4.3 MB |
+
+#### combined-10k-updates steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| updates-while-panning | | 10.2 ms | 8.26 ms | 1.07 ms | 26.8 ms | 26.0 ms | 7.67 ms | 3.55 ms | 4.19 ms | 22.3 MB |
+
+#### combined-10k-polyline steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| route-update | | 2.85 ms | 15.5 ms | 1.94 ms | 1.93 ms | 1.1 MB |
+
+#### combined-10k-polygon steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle-all | | 4.91 ms | 13.8 ms | 7.99 ms | 7.99 ms | 235 KB |
+
+#### combined-all steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| updates-while-panning | | 12.0 ms | 9.91 ms | 1.01 ms | 20.3 ms | 19.4 ms | 8.57 ms | 14.1 ms | 22.0 ms | 17.9 MB |
+
+#### stability-5m timeline
+
+| Window | At | FPS | p95 | p99 | Worst | Jank | RAM | CPU | JS alloc | Native main |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| minute-1 | 63 s | 60.0 | 16.7 ms | 16.7 ms | 33.3 ms | 0.0 % | 664 MB | 26 % | 11.5 MB | 326.2 ms |
+| minute-2 | 125 s | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 640 MB | 22 % | 13.0 MB | 247.1 ms |
+| minute-3 | 188 s | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 704 MB | 22 % | 13.0 MB | 228.6 ms |
+| minute-4 | 251 s | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 714 MB | 21 % | 12.8 MB | 199.3 ms |
+
+Drift first → last window: FPS 0.0, RAM 50 MB.
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-continuous-pan-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-continuous-pan-10k.json
new file mode 100644
index 0000000..d1fbbe0
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-continuous-pan-10k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-continuous-pan-10k",
+ "name": "Camera continuous-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six seconds of back-to-back pan legs with no settle between them. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:19.824Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7058,
+ "load": {
+ "commitMs": 9.31,
+ "readyMs": 104,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 8.06,
+ "backgroundMs": 5.87,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.31,
+ "avgMs": 0.438,
+ "p50Ms": 0.515,
+ "p95Ms": 0.798,
+ "maxMs": 0.798,
+ "mainThreadMs": 1.31,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.54,
+ "avgMs": 0.271,
+ "p50Ms": 0.003,
+ "p95Ms": 0.538,
+ "maxMs": 0.538,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.76,
+ "avgMs": 1.921,
+ "p50Ms": 2.044,
+ "p95Ms": 2.26,
+ "maxMs": 2.26,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.76,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.055,
+ "p50Ms": 0.055,
+ "p95Ms": 0.055,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.114,
+ "p50Ms": 0.114,
+ "p95Ms": 0.114,
+ "maxMs": 0.114,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 6.07,
+ "avgMs": 0.1,
+ "p50Ms": 0.01,
+ "p95Ms": 0.016,
+ "maxMs": 5.413,
+ "mainThreadMs": 6.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0027192499999999994,
+ "allocatedBytes": 4452264,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 369,
+ "durationMs": 6242.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.89,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 41.68,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 364,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0108,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 375,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.55,
+ "max": 0.69
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.14,
+ "max": 17.36
+ },
+ "lateFrames": 0,
+ "busyMs": 46.5,
+ "busyRatio": 0.0074,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6242.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 488,
+ "mainThreadMs": 23.99,
+ "backgroundMs": 8.42,
+ "byName": {
+ "camera.apply": {
+ "count": 15,
+ "totalMs": 8.43,
+ "avgMs": 0.562,
+ "p50Ms": 0.598,
+ "p95Ms": 0.848,
+ "maxMs": 0.848,
+ "mainThreadMs": 8.43,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 74,
+ "totalMs": 2.28,
+ "avgMs": 0.031,
+ "p50Ms": 0.01,
+ "p95Ms": 0.039,
+ "maxMs": 1.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.28,
+ "items": 740000
+ },
+ "markers.viewportFilter": {
+ "count": 74,
+ "totalMs": 0.51,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.017,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 3148
+ },
+ "markers.diff": {
+ "count": 74,
+ "totalMs": 1.08,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.031,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.08,
+ "items": 633
+ },
+ "markers.viewportCompute": {
+ "count": 74,
+ "totalMs": 4.55,
+ "avgMs": 0.061,
+ "p50Ms": 0.043,
+ "p95Ms": 0.104,
+ "maxMs": 1.212,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.55,
+ "items": 3148
+ },
+ "markers.applyDiff": {
+ "count": 74,
+ "totalMs": 13.56,
+ "avgMs": 0.183,
+ "p50Ms": 0.176,
+ "p95Ms": 0.522,
+ "maxMs": 0.969,
+ "mainThreadMs": 13.56,
+ "backgroundMs": 0,
+ "items": 188
+ },
+ "annotation.viewFor": {
+ "count": 67,
+ "totalMs": 1.94,
+ "avgMs": 0.029,
+ "p50Ms": 0.026,
+ "p95Ms": 0.073,
+ "maxMs": 0.094,
+ "mainThreadMs": 1.94,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 36,
+ "totalMs": 0.07,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 67
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 249.1,
+ "afterLoadMB": 230.7,
+ "afterInteractionMB": 306.2,
+ "afterCleanupMB": 226.7,
+ "peakMB": 306.2,
+ "loadDeltaMB": -18.4,
+ "interactionDeltaMB": 75.5,
+ "retainedAfterCleanupMB": -22.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 249.1,
+ "residentMB": 349.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 210973,
+ "mallocMB": 106.4
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 230.7,
+ "residentMB": 331.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 288786,
+ "mallocMB": 127.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 306.2,
+ "residentMB": 408.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 371768,
+ "mallocMB": 148.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 226.7,
+ "residentMB": 376.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 197910,
+ "mallocMB": 102.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 362624,
+ "gcCount": 1,
+ "gcTimeMs": 0.0024543750000000017,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 82982,
+ "mallocBytesDelta": 22356528
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1673,
+ "wallMs": 6253,
+ "percent": 26.8,
+ "threadsBefore": 23,
+ "threadsAfter": 20,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-0.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-0.json
new file mode 100644
index 0000000..d340d1c
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-0.json
@@ -0,0 +1,336 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-0",
+ "name": "Camera fast-pan, 0 markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 0 markers.",
+ "recordedAt": "2026-09-10T14:08:36.490Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4546,
+ "load": {
+ "commitMs": 1.11,
+ "readyMs": 80,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 55224,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 221,
+ "durationMs": 3733.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.82,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 48.05,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 219,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0045,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 224,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.57,
+ "max": 0.62
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.29
+ },
+ "lateFrames": 0,
+ "busyMs": 25.2,
+ "busyRatio": 0.0067,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3734.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 2.37,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 2.37,
+ "avgMs": 0.338,
+ "p50Ms": 0.302,
+ "p95Ms": 0.544,
+ "maxMs": 0.544,
+ "mainThreadMs": 2.37,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 220.9,
+ "afterLoadMB": 211.9,
+ "afterInteractionMB": 320.9,
+ "afterCleanupMB": 171,
+ "peakMB": 320.9,
+ "loadDeltaMB": -9,
+ "interactionDeltaMB": 109,
+ "retainedAfterCleanupMB": -49.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 220.9,
+ "residentMB": 380.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 215506,
+ "mallocMB": 105.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 211.9,
+ "residentMB": 338.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 283124,
+ "mallocMB": 126.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 320.9,
+ "residentMB": 403.7,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 426557,
+ "mallocMB": 158.3
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 171,
+ "residentMB": 362.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 130459,
+ "mallocMB": 92.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 122040,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 143433,
+ "mallocBytesDelta": 33805536
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1275,
+ "wallMs": 3737,
+ "percent": 34.1,
+ "threadsBefore": 21,
+ "threadsAfter": 24,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "region": 1
+ },
+ "payload": {},
+ "largestUpdate": {},
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-10k.json
new file mode 100644
index 0000000..42c3a83
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-10k.json
@@ -0,0 +1,515 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-10k",
+ "name": "Camera fast-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:09.723Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4553,
+ "load": {
+ "commitMs": 10.55,
+ "readyMs": 88,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 17.08,
+ "backgroundMs": 4.1,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.35,
+ "avgMs": 0.449,
+ "p50Ms": 0.6,
+ "p95Ms": 0.747,
+ "maxMs": 0.747,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.62,
+ "avgMs": 0.31,
+ "p50Ms": 0.003,
+ "p95Ms": 0.617,
+ "maxMs": 0.617,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.99,
+ "avgMs": 1.331,
+ "p50Ms": 1.344,
+ "p95Ms": 1.462,
+ "maxMs": 1.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.99,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.094,
+ "p50Ms": 0.094,
+ "p95Ms": 0.094,
+ "maxMs": 0.094,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 15,
+ "avgMs": 0.246,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 14.359,
+ "mainThreadMs": 15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0020168750000000013,
+ "allocatedBytes": 4453272,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 221,
+ "durationMs": 3737.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 60,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.89,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 24.58,
+ "worst": 42.08,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 218,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.009,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 225,
+ "p50": 0.06,
+ "p95": 0.41,
+ "p99": 0.5,
+ "max": 0.77
+ },
+ "frameGapMs": {
+ "p50": 16.72,
+ "p95": 17.08,
+ "max": 17.44
+ },
+ "lateFrames": 0,
+ "busyMs": 28.9,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3737.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 276,
+ "mainThreadMs": 10.6,
+ "backgroundMs": 2.77,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 2.45,
+ "avgMs": 0.35,
+ "p50Ms": 0.309,
+ "p95Ms": 0.64,
+ "maxMs": 0.64,
+ "mainThreadMs": 2.45,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.62,
+ "avgMs": 0.018,
+ "p50Ms": 0.009,
+ "p95Ms": 0.082,
+ "maxMs": 0.099,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 350000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 0.22,
+ "avgMs": 0.006,
+ "p50Ms": 0.004,
+ "p95Ms": 0.027,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 1372
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.46,
+ "avgMs": 0.013,
+ "p50Ms": 0.011,
+ "p95Ms": 0.018,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 324
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 1.48,
+ "avgMs": 0.042,
+ "p50Ms": 0.029,
+ "p95Ms": 0.127,
+ "maxMs": 0.197,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.48,
+ "items": 1372
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 7.03,
+ "avgMs": 0.201,
+ "p50Ms": 0.174,
+ "p95Ms": 0.47,
+ "maxMs": 0.692,
+ "mainThreadMs": 7.03,
+ "backgroundMs": 0,
+ "items": 197
+ },
+ "annotation.viewFor": {
+ "count": 73,
+ "totalMs": 1.09,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.042,
+ "maxMs": 0.056,
+ "mainThreadMs": 1.09,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 21,
+ "totalMs": 0.04,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 73
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 177.1,
+ "afterLoadMB": 213.4,
+ "afterInteractionMB": 339.1,
+ "afterCleanupMB": 248.3,
+ "peakMB": 339.1,
+ "loadDeltaMB": 36.3,
+ "interactionDeltaMB": 125.7,
+ "retainedAfterCleanupMB": 71.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 177.1,
+ "residentMB": 348,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 116183,
+ "mallocMB": 92.2
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 213.4,
+ "residentMB": 354.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 277709,
+ "mallocMB": 126.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 339.1,
+ "residentMB": 403.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 429659,
+ "mallocMB": 166.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 248.3,
+ "residentMB": 381.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 210251,
+ "mallocMB": 106.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 220256,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 151950,
+ "mallocBytesDelta": 42755328
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1117,
+ "wallMs": 3741,
+ "percent": 29.9,
+ "threadsBefore": 20,
+ "threadsAfter": 25,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-1k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-1k.json
new file mode 100644
index 0000000..c9cd645
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-1k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-1k",
+ "name": "Camera fast-pan, 1k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 1000 markers.",
+ "recordedAt": "2026-09-10T14:08:42.757Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4542,
+ "load": {
+ "commitMs": 2.97,
+ "readyMs": 94,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 19.44,
+ "backgroundMs": 0.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.13,
+ "avgMs": 0.043,
+ "p50Ms": 0.064,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.038,
+ "p50Ms": 0.003,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.45,
+ "avgMs": 0.149,
+ "p50Ms": 0.146,
+ "p95Ms": 0.172,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 19.19,
+ "avgMs": 4.797,
+ "p50Ms": 0.015,
+ "p95Ms": 19.135,
+ "maxMs": 19.135,
+ "mainThreadMs": 19.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005713166999999998,
+ "allocatedBytes": 518888,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 221,
+ "durationMs": 3722.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.82,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 50.99,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 220,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0045,
+ "droppedFrames": 2,
+ "longFrames": 1,
+ "overBudgetFrames": 1
+ },
+ "js": {
+ "lagMs": {
+ "samples": 224,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.61,
+ "max": 0.7
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.37
+ },
+ "lateFrames": 0,
+ "busyMs": 21.9,
+ "busyRatio": 0.0059,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3723.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 187,
+ "mainThreadMs": 4.73,
+ "backgroundMs": 1.44,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 3.47,
+ "avgMs": 0.496,
+ "p50Ms": 0.37,
+ "p95Ms": 1.202,
+ "maxMs": 1.202,
+ "mainThreadMs": 3.47,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.29,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.021,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.29,
+ "items": 35000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 0.03,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.3,
+ "avgMs": 0.009,
+ "p50Ms": 0.004,
+ "p95Ms": 0.022,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 24
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 0.82,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.039,
+ "maxMs": 0.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.82,
+ "items": 128
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 1.1,
+ "avgMs": 0.031,
+ "p50Ms": 0.001,
+ "p95Ms": 0.21,
+ "maxMs": 0.222,
+ "mainThreadMs": 1.1,
+ "backgroundMs": 0,
+ "items": 8
+ },
+ "annotation.viewFor": {
+ "count": 3,
+ "totalMs": 0.15,
+ "avgMs": 0.051,
+ "p50Ms": 0.056,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 3
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 171.7,
+ "afterLoadMB": 189,
+ "afterInteractionMB": 321.9,
+ "afterCleanupMB": 236.8,
+ "peakMB": 321.9,
+ "loadDeltaMB": 17.3,
+ "interactionDeltaMB": 132.9,
+ "retainedAfterCleanupMB": 65.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 171.7,
+ "residentMB": 363.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 131172,
+ "mallocMB": 93.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 189,
+ "residentMB": 389.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 281978,
+ "mallocMB": 120.7
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 321.9,
+ "residentMB": 370,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 429326,
+ "mallocMB": 153.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 236.8,
+ "residentMB": 358,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 218272,
+ "mallocMB": 100.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 182920,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 147348,
+ "mallocBytesDelta": 34757280
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1147,
+ "wallMs": 3726,
+ "percent": 30.8,
+ "threadsBefore": 24,
+ "threadsAfter": 24,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-50k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-50k.json
new file mode 100644
index 0000000..c272ce0
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-fast-pan-50k.json
@@ -0,0 +1,515 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-50k",
+ "name": "Camera fast-pan, 50k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 50000 markers.",
+ "recordedAt": "2026-09-10T14:10:15.078Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4560,
+ "load": {
+ "commitMs": 43.56,
+ "readyMs": 166,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 308,
+ "mainThreadMs": 16.98,
+ "backgroundMs": 95.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 6.11,
+ "avgMs": 2.037,
+ "p50Ms": 2.807,
+ "p95Ms": 3.302,
+ "maxMs": 3.302,
+ "mainThreadMs": 6.11,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 2.86,
+ "avgMs": 1.428,
+ "p50Ms": 0.004,
+ "p95Ms": 2.852,
+ "maxMs": 2.852,
+ "mainThreadMs": 2.86,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 95.49,
+ "avgMs": 31.831,
+ "p50Ms": 10.64,
+ "p95Ms": 75.634,
+ "maxMs": 75.634,
+ "mainThreadMs": 0,
+ "backgroundMs": 95.49,
+ "items": 150000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 413
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.077,
+ "p50Ms": 0.077,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 287
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 413
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.358,
+ "p50Ms": 0.358,
+ "p95Ms": 0.358,
+ "maxMs": 0.358,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 287
+ },
+ "annotation.viewFor": {
+ "count": 287,
+ "totalMs": 7.62,
+ "avgMs": 0.027,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 4.541,
+ "mainThreadMs": 7.62,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 287
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 7,
+ "gcTimeMs": 0.006978581999999997,
+ "allocatedBytes": 21715000,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 218,
+ "durationMs": 3741.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.4,
+ "p50": 59,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.13,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 35.1,
+ "worst": 47.52,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 212,
+ 1,
+ 1,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 5,
+ "jankRatio": 0.0229,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 225,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.58,
+ "max": 0.92
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.18,
+ "max": 17.59
+ },
+ "lateFrames": 0,
+ "busyMs": 29.6,
+ "busyRatio": 0.0079,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3742.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 507,
+ "mainThreadMs": 28.85,
+ "backgroundMs": 7.54,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 3.09,
+ "avgMs": 0.442,
+ "p50Ms": 0.333,
+ "p95Ms": 0.955,
+ "maxMs": 0.955,
+ "mainThreadMs": 3.09,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 2.05,
+ "avgMs": 0.059,
+ "p50Ms": 0.042,
+ "p95Ms": 0.2,
+ "maxMs": 0.24,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.05,
+ "items": 1750000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 0.56,
+ "avgMs": 0.016,
+ "p50Ms": 0.013,
+ "p95Ms": 0.035,
+ "maxMs": 0.063,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 6374
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.98,
+ "avgMs": 0.028,
+ "p50Ms": 0.026,
+ "p95Ms": 0.054,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.98,
+ "items": 1585
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 3.95,
+ "avgMs": 0.113,
+ "p50Ms": 0.088,
+ "p95Ms": 0.306,
+ "maxMs": 0.359,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.95,
+ "items": 6374
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 23.35,
+ "avgMs": 0.667,
+ "p50Ms": 0.423,
+ "p95Ms": 1.912,
+ "maxMs": 7.467,
+ "mainThreadMs": 23.35,
+ "backgroundMs": 0,
+ "items": 860
+ },
+ "annotation.viewFor": {
+ "count": 303,
+ "totalMs": 2.35,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.021,
+ "maxMs": 0.05,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 22,
+ "totalMs": 0.06,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.005,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 303
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 241.1,
+ "afterLoadMB": 267.8,
+ "afterInteractionMB": 402,
+ "afterCleanupMB": 279.6,
+ "peakMB": 402,
+ "loadDeltaMB": 26.7,
+ "interactionDeltaMB": 134.2,
+ "retainedAfterCleanupMB": 38.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 241.1,
+ "residentMB": 396.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 244416,
+ "mallocMB": 112.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 267.8,
+ "residentMB": 474.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 346099,
+ "mallocMB": 181.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 402,
+ "residentMB": 486.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 489290,
+ "mallocMB": 232.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 279.6,
+ "residentMB": 430.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 245000,
+ "mallocMB": 137.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 301600,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 143191,
+ "mallocBytesDelta": 53568048
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1391,
+ "wallMs": 3751,
+ "percent": 37.1,
+ "threadsBefore": 21,
+ "threadsAfter": 25,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-idle-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-idle-10k.json
new file mode 100644
index 0000000..539a99a
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-idle-10k.json
@@ -0,0 +1,425 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-idle-10k",
+ "name": "Camera idle, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "No camera movement for 5 s; measures the resting cost of the scene. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:08:51.624Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5834,
+ "load": {
+ "commitMs": 11.2,
+ "readyMs": 95,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 10.65,
+ "backgroundMs": 4.78,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.27,
+ "avgMs": 0.423,
+ "p50Ms": 0.601,
+ "p95Ms": 0.667,
+ "maxMs": 0.667,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.62,
+ "avgMs": 0.312,
+ "p50Ms": 0.002,
+ "p95Ms": 0.622,
+ "maxMs": 0.622,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.65,
+ "avgMs": 1.551,
+ "p50Ms": 1.507,
+ "p95Ms": 1.975,
+ "maxMs": 1.975,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.65,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 8.64,
+ "avgMs": 0.142,
+ "p50Ms": 0.011,
+ "p95Ms": 0.023,
+ "maxMs": 7.919,
+ "mainThreadMs": 8.64,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001865791999999998,
+ "allocatedBytes": 4455984,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 300,
+ "durationMs": 5014.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 300,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0
+ },
+ "js": {
+ "lagMs": {
+ "samples": 302,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.54,
+ "max": 0.74
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.15,
+ "max": 17.41
+ },
+ "lateFrames": 0,
+ "busyMs": 33,
+ "busyRatio": 0.0066,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5014.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "byName": {}
+ },
+ "memory": {
+ "beforeMB": 237.5,
+ "afterLoadMB": 226.1,
+ "afterInteractionMB": 233.4,
+ "afterCleanupMB": 194.2,
+ "peakMB": 237.5,
+ "loadDeltaMB": -11.4,
+ "interactionDeltaMB": 7.3,
+ "retainedAfterCleanupMB": -43.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 237.5,
+ "residentMB": 352.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 218975,
+ "mallocMB": 101.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 226.1,
+ "residentMB": 378.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 295680,
+ "mallocMB": 130.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 233.4,
+ "residentMB": 339.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 275073,
+ "mallocMB": 132.6
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 194.2,
+ "residentMB": 317,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 195869,
+ "mallocMB": 104.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 122056,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -20607,
+ "mallocBytesDelta": 2124384
+ }
+ },
+ "cpu": {
+ "processCpuMs": 86,
+ "wallMs": 5019,
+ "percent": 1.7,
+ "threadsBefore": 23,
+ "threadsAfter": 8,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-pitch-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-pitch-10k.json
new file mode 100644
index 0000000..d802169
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-pitch-10k.json
@@ -0,0 +1,492 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-pitch-10k",
+ "name": "Camera pitch, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Pitch to 45°, 60°, back to 0° at street zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:57.941Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3320,
+ "load": {
+ "commitMs": 12.87,
+ "readyMs": 71,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.61,
+ "backgroundMs": 4.56,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.34,
+ "avgMs": 0.447,
+ "p50Ms": 0.617,
+ "p95Ms": 0.724,
+ "maxMs": 0.724,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.64,
+ "avgMs": 0.319,
+ "p50Ms": 0.003,
+ "p95Ms": 0.636,
+ "maxMs": 0.636,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.46,
+ "avgMs": 1.486,
+ "p50Ms": 1.357,
+ "p95Ms": 1.856,
+ "maxMs": 1.856,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.46,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.52,
+ "avgMs": 0.09,
+ "p50Ms": 0.011,
+ "p95Ms": 0.015,
+ "maxMs": 4.801,
+ "mainThreadMs": 5.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0024575839999999988,
+ "allocatedBytes": 4452512,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 145,
+ "durationMs": 2500.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58,
+ "p50": 60,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.24,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 34.25,
+ "worst": 47.05,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 140,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0276,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 151,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.92,
+ "max": 1.65
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.15,
+ "max": 18.32
+ },
+ "lateFrames": 0,
+ "busyMs": 21.7,
+ "busyRatio": 0.0087,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2500.8,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 123,
+ "mainThreadMs": 4.29,
+ "backgroundMs": 2.02,
+ "byName": {
+ "camera.apply": {
+ "count": 3,
+ "totalMs": 1.95,
+ "avgMs": 0.652,
+ "p50Ms": 0.696,
+ "p95Ms": 0.984,
+ "maxMs": 0.984,
+ "mainThreadMs": 1.95,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 24,
+ "totalMs": 0.46,
+ "avgMs": 0.019,
+ "p50Ms": 0.014,
+ "p95Ms": 0.041,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 240000
+ },
+ "markers.viewportFilter": {
+ "count": 24,
+ "totalMs": 0.13,
+ "avgMs": 0.005,
+ "p50Ms": 0.003,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 1209
+ },
+ "markers.diff": {
+ "count": 24,
+ "totalMs": 0.33,
+ "avgMs": 0.014,
+ "p50Ms": 0.01,
+ "p95Ms": 0.027,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.33,
+ "items": 172
+ },
+ "markers.viewportCompute": {
+ "count": 24,
+ "totalMs": 1.1,
+ "avgMs": 0.046,
+ "p50Ms": 0.035,
+ "p95Ms": 0.081,
+ "maxMs": 0.132,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.1,
+ "items": 1209
+ },
+ "markers.applyDiff": {
+ "count": 24,
+ "totalMs": 2.34,
+ "avgMs": 0.097,
+ "p50Ms": 0.001,
+ "p95Ms": 0.429,
+ "maxMs": 0.524,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 237.3,
+ "afterLoadMB": 231.6,
+ "afterInteractionMB": 344.9,
+ "afterCleanupMB": 242.7,
+ "peakMB": 344.9,
+ "loadDeltaMB": -5.7,
+ "interactionDeltaMB": 113.3,
+ "retainedAfterCleanupMB": 5.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 237.3,
+ "residentMB": 439.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249931,
+ "mallocMB": 111.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 231.6,
+ "residentMB": 374,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 327000,
+ "mallocMB": 132.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 344.9,
+ "residentMB": 459.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 490973,
+ "mallocMB": 190.1
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 242.7,
+ "residentMB": 448.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256128,
+ "mallocMB": 113.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 125776,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 163973,
+ "mallocBytesDelta": 60085760
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1065,
+ "wallMs": 2505,
+ "percent": 42.5,
+ "threadsBefore": 22,
+ "threadsAfter": 40,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rapid-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rapid-10k.json
new file mode 100644
index 0000000..36845cf
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rapid-10k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-rapid-10k",
+ "name": "Camera rapid, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Twenty 150 ms flicks mixing small pans and half-zoom steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:10:05.858Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4908,
+ "load": {
+ "commitMs": 10.25,
+ "readyMs": 69,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.46,
+ "backgroundMs": 4.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.19,
+ "avgMs": 0.396,
+ "p50Ms": 0.575,
+ "p95Ms": 0.613,
+ "maxMs": 0.613,
+ "mainThreadMs": 1.19,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.63,
+ "avgMs": 0.315,
+ "p50Ms": 0.003,
+ "p95Ms": 0.628,
+ "maxMs": 0.628,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.89,
+ "avgMs": 1.298,
+ "p50Ms": 1.308,
+ "p95Ms": 1.318,
+ "maxMs": 1.318,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.89,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.064,
+ "p50Ms": 0.064,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.52,
+ "avgMs": 0.09,
+ "p50Ms": 0.011,
+ "p95Ms": 0.015,
+ "maxMs": 4.796,
+ "mainThreadMs": 5.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016690840000000012,
+ "allocatedBytes": 4452264,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 234,
+ "durationMs": 4092,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.3,
+ "p50": 57,
+ "p95": 54,
+ "p99": 54,
+ "worstWindow": 54,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.45,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.51,
+ "worst": 45.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 223,
+ 1,
+ 1,
+ 9,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0427,
+ "droppedFrames": 11,
+ "longFrames": 0,
+ "overBudgetFrames": 11
+ },
+ "js": {
+ "lagMs": {
+ "samples": 246,
+ "p50": 0.04,
+ "p95": 0.5,
+ "p99": 0.87,
+ "max": 1.61
+ },
+ "frameGapMs": {
+ "p50": 16.71,
+ "p95": 17.17,
+ "max": 18.28
+ },
+ "lateFrames": 0,
+ "busyMs": 36.7,
+ "busyRatio": 0.009,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4092.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 328,
+ "mainThreadMs": 17.66,
+ "backgroundMs": 3.04,
+ "byName": {
+ "camera.apply": {
+ "count": 21,
+ "totalMs": 9.64,
+ "avgMs": 0.459,
+ "p50Ms": 0.416,
+ "p95Ms": 0.845,
+ "maxMs": 0.933,
+ "mainThreadMs": 9.64,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 44,
+ "totalMs": 0.58,
+ "avgMs": 0.013,
+ "p50Ms": 0.011,
+ "p95Ms": 0.026,
+ "maxMs": 0.042,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 440000
+ },
+ "markers.viewportFilter": {
+ "count": 44,
+ "totalMs": 0.23,
+ "avgMs": 0.005,
+ "p50Ms": 0.004,
+ "p95Ms": 0.009,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 2046
+ },
+ "markers.diff": {
+ "count": 44,
+ "totalMs": 0.57,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.024,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.57,
+ "items": 301
+ },
+ "markers.viewportCompute": {
+ "count": 44,
+ "totalMs": 1.66,
+ "avgMs": 0.038,
+ "p50Ms": 0.031,
+ "p95Ms": 0.078,
+ "maxMs": 0.085,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.66,
+ "items": 2046
+ },
+ "markers.applyDiff": {
+ "count": 44,
+ "totalMs": 6.81,
+ "avgMs": 0.155,
+ "p50Ms": 0.167,
+ "p95Ms": 0.33,
+ "maxMs": 0.805,
+ "mainThreadMs": 6.81,
+ "backgroundMs": 0,
+ "items": 171
+ },
+ "annotation.viewFor": {
+ "count": 60,
+ "totalMs": 1.17,
+ "avgMs": 0.02,
+ "p50Ms": 0.012,
+ "p95Ms": 0.035,
+ "maxMs": 0.116,
+ "mainThreadMs": 1.17,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 27,
+ "totalMs": 0.04,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 243.5,
+ "afterLoadMB": 232.2,
+ "afterInteractionMB": 315.7,
+ "afterCleanupMB": 240.7,
+ "peakMB": 315.7,
+ "loadDeltaMB": -11.3,
+ "interactionDeltaMB": 83.5,
+ "retainedAfterCleanupMB": -2.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 243.5,
+ "residentMB": 449.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256826,
+ "mallocMB": 113.4
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 232.2,
+ "residentMB": 406.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 320737,
+ "mallocMB": 136.9
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 315.7,
+ "residentMB": 389,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 455840,
+ "mallocMB": 166.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 240.7,
+ "residentMB": 395,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 246829,
+ "mallocMB": 112.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 298896,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 135103,
+ "mallocBytesDelta": 30893968
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1501,
+ "wallMs": 4097,
+ "percent": 36.6,
+ "threadsBefore": 23,
+ "threadsAfter": 23,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rapid-zoom-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rapid-zoom-10k.json
new file mode 100644
index 0000000..1ff8a2a
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rapid-zoom-10k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-rapid-zoom-10k",
+ "name": "Camera rapid-zoom, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Ten alternating zoom jumps of 300 ms each across three octaves. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:44.441Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4494,
+ "load": {
+ "commitMs": 8.31,
+ "readyMs": 112,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 9.98,
+ "backgroundMs": 6,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.62,
+ "avgMs": 0.541,
+ "p50Ms": 0.518,
+ "p95Ms": 1.105,
+ "maxMs": 1.105,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.56,
+ "avgMs": 0.278,
+ "p50Ms": 0.002,
+ "p95Ms": 0.553,
+ "maxMs": 0.553,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.84,
+ "avgMs": 1.945,
+ "p50Ms": 1.901,
+ "p95Ms": 2.427,
+ "maxMs": 2.427,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.84,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.043,
+ "p50Ms": 0.043,
+ "p95Ms": 0.043,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.093,
+ "p50Ms": 0.093,
+ "p95Ms": 0.093,
+ "maxMs": 0.093,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.092,
+ "p50Ms": 0.092,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 7.69,
+ "avgMs": 0.126,
+ "p50Ms": 0.01,
+ "p95Ms": 0.017,
+ "maxMs": 7.012,
+ "mainThreadMs": 7.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0012638339999999984,
+ "allocatedBytes": 4452248,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 214,
+ "durationMs": 3675.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.4,
+ "p50": 58.5,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.13,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 37.59,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 208,
+ 0,
+ 1,
+ 5,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 6,
+ "jankRatio": 0.028,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 221,
+ "p50": 0,
+ "p95": 0.54,
+ "p99": 0.6,
+ "max": 0.97
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.21,
+ "max": 17.63
+ },
+ "lateFrames": 0,
+ "busyMs": 27.4,
+ "busyRatio": 0.0075,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3676.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 503,
+ "mainThreadMs": 14.88,
+ "backgroundMs": 6.12,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 3.04,
+ "avgMs": 0.304,
+ "p50Ms": 0.28,
+ "p95Ms": 0.67,
+ "maxMs": 0.67,
+ "mainThreadMs": 3.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 36,
+ "totalMs": 1.63,
+ "avgMs": 0.045,
+ "p50Ms": 0.013,
+ "p95Ms": 0.259,
+ "maxMs": 0.514,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.63,
+ "items": 360000
+ },
+ "markers.viewportFilter": {
+ "count": 36,
+ "totalMs": 0.7,
+ "avgMs": 0.019,
+ "p50Ms": 0.006,
+ "p95Ms": 0.038,
+ "maxMs": 0.348,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 3574
+ },
+ "markers.diff": {
+ "count": 36,
+ "totalMs": 0.62,
+ "avgMs": 0.017,
+ "p50Ms": 0.013,
+ "p95Ms": 0.031,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 1442
+ },
+ "markers.viewportCompute": {
+ "count": 36,
+ "totalMs": 3.18,
+ "avgMs": 0.088,
+ "p50Ms": 0.044,
+ "p95Ms": 0.327,
+ "maxMs": 0.909,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.18,
+ "items": 3574
+ },
+ "markers.applyDiff": {
+ "count": 36,
+ "totalMs": 6.8,
+ "avgMs": 0.189,
+ "p50Ms": 0.074,
+ "p95Ms": 0.751,
+ "maxMs": 1.183,
+ "mainThreadMs": 6.8,
+ "backgroundMs": 0,
+ "items": 647
+ },
+ "annotation.viewFor": {
+ "count": 298,
+ "totalMs": 5,
+ "avgMs": 0.017,
+ "p50Ms": 0.004,
+ "p95Ms": 0.031,
+ "maxMs": 1.254,
+ "mainThreadMs": 5,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 15,
+ "totalMs": 0.04,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 298
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 271,
+ "afterLoadMB": 236.6,
+ "afterInteractionMB": 344.5,
+ "afterCleanupMB": 248.5,
+ "peakMB": 344.5,
+ "loadDeltaMB": -34.4,
+ "interactionDeltaMB": 107.9,
+ "retainedAfterCleanupMB": -22.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 271,
+ "residentMB": 388.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 238091,
+ "mallocMB": 114.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 236.6,
+ "residentMB": 361.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 317358,
+ "mallocMB": 139.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 344.5,
+ "residentMB": 427.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 527000,
+ "mallocMB": 185.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 248.5,
+ "residentMB": 422.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249485,
+ "mallocMB": 115.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 289856,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 209642,
+ "mallocBytesDelta": 48577696
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1502,
+ "wallMs": 3682,
+ "percent": 40.8,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rotate-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rotate-10k.json
new file mode 100644
index 0000000..423bb38
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-rotate-10k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-rotate-10k",
+ "name": "Camera rotate, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four heading changes of 90° at city zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:51.608Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4140,
+ "load": {
+ "commitMs": 12.18,
+ "readyMs": 93,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.1,
+ "backgroundMs": 4.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.15,
+ "avgMs": 0.385,
+ "p50Ms": 0.52,
+ "p95Ms": 0.634,
+ "maxMs": 0.634,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.54,
+ "avgMs": 0.272,
+ "p50Ms": 0.003,
+ "p95Ms": 0.541,
+ "maxMs": 0.541,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.05,
+ "avgMs": 1.349,
+ "p50Ms": 1.24,
+ "p95Ms": 1.613,
+ "maxMs": 1.613,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.05,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.047,
+ "p50Ms": 0.047,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.113,
+ "p50Ms": 0.113,
+ "p95Ms": 0.113,
+ "maxMs": 0.113,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.27,
+ "avgMs": 0.086,
+ "p50Ms": 0.01,
+ "p95Ms": 0.013,
+ "maxMs": 4.625,
+ "mainThreadMs": 5.27,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0015190830000000044,
+ "allocatedBytes": 4462248,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 193,
+ "durationMs": 3321.3,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.2,
+ "p50": 60,
+ "p95": 54,
+ "p99": 54,
+ "worstWindow": 54,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.18,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 47.88,
+ "worst": 71.21,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 189,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0155,
+ "droppedFrames": 6,
+ "longFrames": 1,
+ "overBudgetFrames": 4
+ },
+ "js": {
+ "lagMs": {
+ "samples": 200,
+ "p50": 0,
+ "p95": 0.46,
+ "p99": 0.54,
+ "max": 0.64
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.12,
+ "max": 17.3
+ },
+ "lateFrames": 0,
+ "busyMs": 22.3,
+ "busyRatio": 0.0067,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3321.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 227,
+ "mainThreadMs": 8.35,
+ "backgroundMs": 2.92,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.75,
+ "avgMs": 0.438,
+ "p50Ms": 0.33,
+ "p95Ms": 0.575,
+ "maxMs": 0.575,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 32,
+ "totalMs": 0.57,
+ "avgMs": 0.018,
+ "p50Ms": 0.012,
+ "p95Ms": 0.051,
+ "maxMs": 0.076,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.57,
+ "items": 320000
+ },
+ "markers.viewportFilter": {
+ "count": 32,
+ "totalMs": 0.25,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.02,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1879
+ },
+ "markers.diff": {
+ "count": 32,
+ "totalMs": 0.52,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 583
+ },
+ "markers.viewportCompute": {
+ "count": 32,
+ "totalMs": 1.58,
+ "avgMs": 0.049,
+ "p50Ms": 0.037,
+ "p95Ms": 0.101,
+ "maxMs": 0.136,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 1879
+ },
+ "markers.applyDiff": {
+ "count": 32,
+ "totalMs": 5.48,
+ "avgMs": 0.171,
+ "p50Ms": 0.057,
+ "p95Ms": 0.491,
+ "maxMs": 0.527,
+ "mainThreadMs": 5.48,
+ "backgroundMs": 0,
+ "items": 149
+ },
+ "annotation.viewFor": {
+ "count": 49,
+ "totalMs": 1.09,
+ "avgMs": 0.022,
+ "p50Ms": 0.013,
+ "p95Ms": 0.055,
+ "maxMs": 0.099,
+ "mainThreadMs": 1.09,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 49
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 245.9,
+ "afterLoadMB": 233.7,
+ "afterInteractionMB": 305.8,
+ "afterCleanupMB": 236.7,
+ "peakMB": 305.8,
+ "loadDeltaMB": -12.2,
+ "interactionDeltaMB": 72.1,
+ "retainedAfterCleanupMB": -9.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 245.9,
+ "residentMB": 429.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249315,
+ "mallocMB": 112.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 233.7,
+ "residentMB": 364.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 324617,
+ "mallocMB": 136.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 305.8,
+ "residentMB": 449.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 406686,
+ "mallocMB": 157
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 236.7,
+ "residentMB": 438.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249242,
+ "mallocMB": 111.6
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 176040,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 82069,
+ "mallocBytesDelta": 21575552
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1075,
+ "wallMs": 3324,
+ "percent": 32.3,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-slow-pan-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-slow-pan-10k.json
new file mode 100644
index 0000000..91a2293
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-slow-pan-10k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-slow-pan-10k",
+ "name": "Camera slow-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four slow animated pan legs (1.2 s each, small steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:02.140Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7476,
+ "load": {
+ "commitMs": 9.43,
+ "readyMs": 97,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.79,
+ "backgroundMs": 4.34,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.38,
+ "avgMs": 0.46,
+ "p50Ms": 0.535,
+ "p95Ms": 0.845,
+ "maxMs": 0.845,
+ "mainThreadMs": 1.38,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.56,
+ "avgMs": 0.282,
+ "p50Ms": 0.003,
+ "p95Ms": 0.561,
+ "maxMs": 0.561,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.2,
+ "avgMs": 1.401,
+ "p50Ms": 1.322,
+ "p95Ms": 1.778,
+ "maxMs": 1.778,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.2,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.075,
+ "p50Ms": 0.075,
+ "p95Ms": 0.075,
+ "maxMs": 0.075,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.156,
+ "p50Ms": 0.156,
+ "p95Ms": 0.156,
+ "maxMs": 0.156,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.66,
+ "avgMs": 0.093,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 5.028,
+ "mainThreadMs": 5.66,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0031082090000000007,
+ "allocatedBytes": 4455528,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 394,
+ "durationMs": 6657.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 60,
+ "p95": 56,
+ "p99": 56,
+ "worstWindow": 56,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.88,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 45.82,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 389,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0102,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 400,
+ "p50": 0.01,
+ "p95": 0.47,
+ "p99": 0.54,
+ "max": 0.63
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.14,
+ "max": 17.29
+ },
+ "lateFrames": 0,
+ "busyMs": 53.4,
+ "busyRatio": 0.008,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6658.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 371,
+ "mainThreadMs": 11.58,
+ "backgroundMs": 5.86,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.35,
+ "avgMs": 0.471,
+ "p50Ms": 0.485,
+ "p95Ms": 0.691,
+ "maxMs": 0.691,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 65,
+ "totalMs": 1.08,
+ "avgMs": 0.017,
+ "p50Ms": 0.011,
+ "p95Ms": 0.039,
+ "maxMs": 0.094,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.08,
+ "items": 650000
+ },
+ "markers.viewportFilter": {
+ "count": 65,
+ "totalMs": 0.49,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 2828
+ },
+ "markers.diff": {
+ "count": 65,
+ "totalMs": 1.12,
+ "avgMs": 0.017,
+ "p50Ms": 0.014,
+ "p95Ms": 0.036,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.12,
+ "items": 743
+ },
+ "markers.viewportCompute": {
+ "count": 65,
+ "totalMs": 3.18,
+ "avgMs": 0.049,
+ "p50Ms": 0.042,
+ "p95Ms": 0.093,
+ "maxMs": 0.187,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.18,
+ "items": 2828
+ },
+ "markers.applyDiff": {
+ "count": 65,
+ "totalMs": 8.3,
+ "avgMs": 0.128,
+ "p50Ms": 0.037,
+ "p95Ms": 0.379,
+ "maxMs": 0.74,
+ "mainThreadMs": 8.3,
+ "backgroundMs": 0,
+ "items": 95
+ },
+ "annotation.viewFor": {
+ "count": 22,
+ "totalMs": 0.9,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.067,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.9,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 19,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.9,
+ "afterLoadMB": 221.4,
+ "afterInteractionMB": 307.6,
+ "afterCleanupMB": 227.4,
+ "peakMB": 307.6,
+ "loadDeltaMB": 26.5,
+ "interactionDeltaMB": 86.2,
+ "retainedAfterCleanupMB": 32.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.9,
+ "residentMB": 302.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 196588,
+ "mallocMB": 105
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 221.4,
+ "residentMB": 348.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 277873,
+ "mallocMB": 129.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 307.6,
+ "residentMB": 345.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 363518,
+ "mallocMB": 151.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 227.4,
+ "residentMB": 348.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 201162,
+ "mallocMB": 105.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 299840,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 85645,
+ "mallocBytesDelta": 22640096
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1846,
+ "wallMs": 6664,
+ "percent": 27.7,
+ "threadsBefore": 21,
+ "threadsAfter": 20,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-zoom-in-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-zoom-in-10k.json
new file mode 100644
index 0000000..26621cb
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-zoom-in-10k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-zoom-in-10k",
+ "name": "Camera zoom-in, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from country scale into street scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:28.407Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5485,
+ "load": {
+ "commitMs": 9.65,
+ "readyMs": 162,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 18.11,
+ "backgroundMs": 3.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.26,
+ "avgMs": 0.421,
+ "p50Ms": 0.51,
+ "p95Ms": 0.753,
+ "maxMs": 0.753,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.53,
+ "avgMs": 0.265,
+ "p50Ms": 0.002,
+ "p95Ms": 0.527,
+ "maxMs": 0.527,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.51,
+ "avgMs": 1.17,
+ "p50Ms": 1.158,
+ "p95Ms": 1.219,
+ "maxMs": 1.219,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.51,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.077,
+ "p50Ms": 0.077,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 16.22,
+ "avgMs": 0.266,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 15.554,
+ "mainThreadMs": 16.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001207459000000001,
+ "allocatedBytes": 4454752,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 267,
+ "durationMs": 4666.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.4,
+ "p50": 58,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 17.42,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 41.25,
+ "worst": 46.04,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 255,
+ 2,
+ 2,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0375,
+ "droppedFrames": 12,
+ "longFrames": 0,
+ "overBudgetFrames": 12
+ },
+ "js": {
+ "lagMs": {
+ "samples": 281,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.75,
+ "max": 0.76
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.18,
+ "max": 17.43
+ },
+ "lateFrames": 0,
+ "busyMs": 40.6,
+ "busyRatio": 0.0087,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4667.1,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2276,
+ "mainThreadMs": 45.92,
+ "backgroundMs": 16.84,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.82,
+ "avgMs": 0.365,
+ "p50Ms": 0.291,
+ "p95Ms": 0.623,
+ "maxMs": 0.623,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 45,
+ "totalMs": 2.76,
+ "avgMs": 0.061,
+ "p50Ms": 0.017,
+ "p95Ms": 0.208,
+ "maxMs": 0.368,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.76,
+ "items": 450000
+ },
+ "markers.viewportFilter": {
+ "count": 45,
+ "totalMs": 3.32,
+ "avgMs": 0.074,
+ "p50Ms": 0.012,
+ "p95Ms": 0.322,
+ "maxMs": 0.356,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.32,
+ "items": 15779
+ },
+ "markers.diff": {
+ "count": 45,
+ "totalMs": 2.18,
+ "avgMs": 0.049,
+ "p50Ms": 0.025,
+ "p95Ms": 0.107,
+ "maxMs": 0.651,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.18,
+ "items": 5431
+ },
+ "markers.viewportCompute": {
+ "count": 45,
+ "totalMs": 8.57,
+ "avgMs": 0.191,
+ "p50Ms": 0.064,
+ "p95Ms": 0.619,
+ "maxMs": 1.153,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.57,
+ "items": 15779
+ },
+ "markers.applyDiff": {
+ "count": 45,
+ "totalMs": 32.08,
+ "avgMs": 0.713,
+ "p50Ms": 0.212,
+ "p95Ms": 2.687,
+ "maxMs": 3.627,
+ "mainThreadMs": 32.08,
+ "backgroundMs": 0,
+ "items": 4125
+ },
+ "annotation.viewFor": {
+ "count": 2032,
+ "totalMs": 11.89,
+ "avgMs": 0.006,
+ "p50Ms": 0.004,
+ "p95Ms": 0.012,
+ "maxMs": 0.169,
+ "mainThreadMs": 11.89,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.13,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 2032
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 226.8,
+ "afterLoadMB": 221.6,
+ "afterInteractionMB": 417.7,
+ "afterCleanupMB": 266.8,
+ "peakMB": 417.7,
+ "loadDeltaMB": -5.2,
+ "interactionDeltaMB": 196.1,
+ "retainedAfterCleanupMB": 40,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 226.8,
+ "residentMB": 373.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 198618,
+ "mallocMB": 102.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 221.6,
+ "residentMB": 351,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 274419,
+ "mallocMB": 132.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 417.7,
+ "residentMB": 464.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 705102,
+ "mallocMB": 236.3
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 266.8,
+ "residentMB": 460,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 222412,
+ "mallocMB": 112.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 705976,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 430683,
+ "mallocBytesDelta": 108938272
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2206,
+ "wallMs": 4676,
+ "percent": 47.2,
+ "threadsBefore": 20,
+ "threadsAfter": 33,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-zoom-out-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-zoom-out-10k.json
new file mode 100644
index 0000000..8a19113
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/camera-zoom-out-10k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-zoom-out-10k",
+ "name": "Camera zoom-out, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from street scale out to country scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:36.907Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5475,
+ "load": {
+ "commitMs": 8.2,
+ "readyMs": 87,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 8.31,
+ "backgroundMs": 4.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.47,
+ "avgMs": 0.489,
+ "p50Ms": 0.515,
+ "p95Ms": 0.951,
+ "maxMs": 0.951,
+ "mainThreadMs": 1.47,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.273,
+ "p50Ms": 0.008,
+ "p95Ms": 0.538,
+ "maxMs": 0.538,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.34,
+ "avgMs": 1.447,
+ "p50Ms": 1.357,
+ "p95Ms": 1.638,
+ "maxMs": 1.638,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.34,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.077,
+ "p50Ms": 0.077,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 6.2,
+ "avgMs": 0.102,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 5.542,
+ "mainThreadMs": 6.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0029221670000000033,
+ "allocatedBytes": 4452248,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 269,
+ "durationMs": 4657.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.8,
+ "p50": 58,
+ "p95": 52.3,
+ "p99": 52.3,
+ "worstWindow": 52.3,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 17.29,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 35.48,
+ "worst": 40.94,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 259,
+ 0,
+ 2,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0372,
+ "droppedFrames": 10,
+ "longFrames": 0,
+ "overBudgetFrames": 10
+ },
+ "js": {
+ "lagMs": {
+ "samples": 280,
+ "p50": 0,
+ "p95": 0.46,
+ "p99": 0.58,
+ "max": 0.67
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.13,
+ "max": 17.34
+ },
+ "lateFrames": 0,
+ "busyMs": 29,
+ "busyRatio": 0.0062,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4658.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1482,
+ "mainThreadMs": 28.09,
+ "backgroundMs": 14.1,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.91,
+ "avgMs": 0.383,
+ "p50Ms": 0.369,
+ "p95Ms": 0.594,
+ "maxMs": 0.594,
+ "mainThreadMs": 1.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 45,
+ "totalMs": 2.44,
+ "avgMs": 0.054,
+ "p50Ms": 0.016,
+ "p95Ms": 0.265,
+ "maxMs": 0.306,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.44,
+ "items": 450000
+ },
+ "markers.viewportFilter": {
+ "count": 45,
+ "totalMs": 2.91,
+ "avgMs": 0.065,
+ "p50Ms": 0.005,
+ "p95Ms": 0.359,
+ "maxMs": 1.107,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.91,
+ "items": 10947
+ },
+ "markers.diff": {
+ "count": 45,
+ "totalMs": 1.36,
+ "avgMs": 0.03,
+ "p50Ms": 0.012,
+ "p95Ms": 0.139,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.36,
+ "items": 3738
+ },
+ "markers.viewportCompute": {
+ "count": 45,
+ "totalMs": 7.39,
+ "avgMs": 0.164,
+ "p50Ms": 0.051,
+ "p95Ms": 0.651,
+ "maxMs": 1.572,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.39,
+ "items": 10947
+ },
+ "markers.applyDiff": {
+ "count": 45,
+ "totalMs": 16.67,
+ "avgMs": 0.37,
+ "p50Ms": 0.037,
+ "p95Ms": 2.368,
+ "maxMs": 4.32,
+ "mainThreadMs": 16.67,
+ "backgroundMs": 0,
+ "items": 2179
+ },
+ "annotation.viewFor": {
+ "count": 1230,
+ "totalMs": 9.41,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.013,
+ "maxMs": 0.129,
+ "mainThreadMs": 9.41,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 22,
+ "totalMs": 0.1,
+ "avgMs": 0.004,
+ "p50Ms": 0.002,
+ "p95Ms": 0.013,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1230
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 267.9,
+ "afterLoadMB": 225.6,
+ "afterInteractionMB": 411.6,
+ "afterCleanupMB": 270.8,
+ "peakMB": 411.6,
+ "loadDeltaMB": -42.3,
+ "interactionDeltaMB": 186,
+ "retainedAfterCleanupMB": 2.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 267.9,
+ "residentMB": 437.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 223121,
+ "mallocMB": 113.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 225.6,
+ "residentMB": 435.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 302844,
+ "mallocMB": 137.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 411.6,
+ "residentMB": 469.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 744899,
+ "mallocMB": 238.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 270.8,
+ "residentMB": 395.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 240396,
+ "mallocMB": 114.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 476616,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 442055,
+ "mallocBytesDelta": 105709664
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2176,
+ "wallMs": 4666,
+ "percent": 46.6,
+ "threadsBefore": 22,
+ "threadsAfter": 29,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-10k.json
new file mode 100644
index 0000000..13f2423
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-10k.json
@@ -0,0 +1,932 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "cluster-10k",
+ "name": "Clustering, 10k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "10000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:12:51.563Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10892,
+ "load": {
+ "commitMs": 11.38,
+ "readyMs": 106,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 48,
+ "mainThreadMs": 3.84,
+ "backgroundMs": 80.92,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.27,
+ "avgMs": 0.424,
+ "p50Ms": 0.585,
+ "p95Ms": 0.686,
+ "maxMs": 0.686,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.6,
+ "avgMs": 0.3,
+ "p50Ms": 0.002,
+ "p95Ms": 0.597,
+ "maxMs": 0.597,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 4.46,
+ "avgMs": 1.116,
+ "p50Ms": 1.183,
+ "p95Ms": 1.687,
+ "maxMs": 1.687,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.46,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 1.82,
+ "avgMs": 1.824,
+ "p50Ms": 1.824,
+ "p95Ms": 1.824,
+ "maxMs": 1.824,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.82,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 35.19,
+ "avgMs": 35.191,
+ "p50Ms": 35.191,
+ "p95Ms": 35.191,
+ "maxMs": 35.191,
+ "mainThreadMs": 0,
+ "backgroundMs": 35.19,
+ "items": 10000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 1.14,
+ "avgMs": 1.138,
+ "p50Ms": 1.138,
+ "p95Ms": 1.138,
+ "maxMs": 1.138,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 26
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 38.31,
+ "avgMs": 38.309,
+ "p50Ms": 38.309,
+ "p95Ms": 38.309,
+ "maxMs": 38.309,
+ "mainThreadMs": 0,
+ "backgroundMs": 38.31,
+ "items": 10000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.072,
+ "p50Ms": 0.072,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 26
+ },
+ "annotation.viewFor": {
+ "count": 26,
+ "totalMs": 1.88,
+ "avgMs": 0.072,
+ "p50Ms": 0.035,
+ "p95Ms": 0.265,
+ "maxMs": 0.6,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0012099170000000048,
+ "allocatedBytes": 4445624,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ "frames": {
+ "frames": 592,
+ "durationMs": 10068.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.9,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.98,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 37.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 581,
+ 0,
+ 0,
+ 11,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 11,
+ "jankRatio": 0.0186,
+ "droppedFrames": 11,
+ "longFrames": 0,
+ "overBudgetFrames": 11
+ },
+ "js": {
+ "lagMs": {
+ "samples": 605,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.56,
+ "max": 1.66
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.18,
+ "max": 18.33
+ },
+ "lateFrames": 0,
+ "busyMs": 77.9,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10069.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.34,
+ "avgMs": 11.337,
+ "p95Ms": 11.337,
+ "maxMs": 11.337
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.25,
+ "maxMs": 1.25
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.354,
+ "maxMs": 2.354
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2821,
+ "mainThreadMs": 118.78,
+ "backgroundMs": 739.88,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 5.01,
+ "avgMs": 0.501,
+ "p50Ms": 0.375,
+ "p95Ms": 1.143,
+ "maxMs": 1.143,
+ "mainThreadMs": 5.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 86,
+ "totalMs": 72.15,
+ "avgMs": 0.839,
+ "p50Ms": 0.681,
+ "p95Ms": 2.332,
+ "maxMs": 9.738,
+ "mainThreadMs": 0,
+ "backgroundMs": 72.15,
+ "items": 860000
+ },
+ "markers.cluster": {
+ "count": 86,
+ "totalMs": 273.6,
+ "avgMs": 3.181,
+ "p50Ms": 2.696,
+ "p95Ms": 7.748,
+ "maxMs": 28.794,
+ "mainThreadMs": 0,
+ "backgroundMs": 273.6,
+ "items": 338815
+ },
+ "markers.diff": {
+ "count": 86,
+ "totalMs": 21.4,
+ "avgMs": 0.249,
+ "p50Ms": 0.257,
+ "p95Ms": 0.61,
+ "maxMs": 0.78,
+ "mainThreadMs": 0,
+ "backgroundMs": 21.4,
+ "items": 9760
+ },
+ "markers.viewportCompute": {
+ "count": 86,
+ "totalMs": 371.16,
+ "avgMs": 4.316,
+ "p50Ms": 3.703,
+ "p95Ms": 14.866,
+ "maxMs": 31.282,
+ "mainThreadMs": 0,
+ "backgroundMs": 371.16,
+ "items": 338815
+ },
+ "markers.applyDiff": {
+ "count": 86,
+ "totalMs": 69.08,
+ "avgMs": 0.803,
+ "p50Ms": 0.749,
+ "p95Ms": 1.765,
+ "maxMs": 3.077,
+ "mainThreadMs": 69.08,
+ "backgroundMs": 0,
+ "items": 5220
+ },
+ "annotation.viewFor": {
+ "count": 2308,
+ "totalMs": 41.33,
+ "avgMs": 0.018,
+ "p50Ms": 0.009,
+ "p95Ms": 0.037,
+ "maxMs": 8.107,
+ "mainThreadMs": 41.33,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 70,
+ "totalMs": 0.24,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.008,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 2308
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.76,
+ "p50Ms": 0.76,
+ "p95Ms": 0.76,
+ "maxMs": 0.76,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.35,
+ "avgMs": 2.354,
+ "p50Ms": 2.354,
+ "p95Ms": 2.354,
+ "maxMs": 2.354,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.576,
+ "p50Ms": 1.576,
+ "p95Ms": 1.576,
+ "maxMs": 1.576,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 10000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.4,
+ "afterLoadMB": 293.9,
+ "afterInteractionMB": 426.5,
+ "afterCleanupMB": 206.1,
+ "peakMB": 426.5,
+ "loadDeltaMB": 99.5,
+ "interactionDeltaMB": 132.6,
+ "retainedAfterCleanupMB": 11.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.4,
+ "residentMB": 392.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 126253,
+ "mallocMB": 93.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 293.9,
+ "residentMB": 375,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 342244,
+ "mallocMB": 162
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 426.5,
+ "residentMB": 411.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 585811,
+ "mallocMB": 240
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 206.1,
+ "residentMB": 419.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 126383,
+ "mallocMB": 104.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 3176552,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 243567,
+ "mallocBytesDelta": 81767952
+ }
+ },
+ "cpu": {
+ "processCpuMs": 3381,
+ "wallMs": 10075,
+ "percent": 33.6,
+ "threadsBefore": 20,
+ "threadsAfter": 12,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 20000,
+ "coordinates": 20000,
+ "estimatedBytes": 1811880
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5168.25,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2191,
+ "mainThreadMs": 79.83,
+ "backgroundMs": 387.83,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.42,
+ "avgMs": 0.484,
+ "p50Ms": 0.429,
+ "p95Ms": 0.741,
+ "maxMs": 0.741,
+ "mainThreadMs": 2.42,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 37.76,
+ "avgMs": 0.755,
+ "p50Ms": 0.126,
+ "p95Ms": 3.039,
+ "maxMs": 9.738,
+ "mainThreadMs": 0,
+ "backgroundMs": 37.76,
+ "items": 500000
+ },
+ "markers.cluster": {
+ "count": 50,
+ "totalMs": 145.23,
+ "avgMs": 2.905,
+ "p50Ms": 0.515,
+ "p95Ms": 14.669,
+ "maxMs": 28.794,
+ "mainThreadMs": 0,
+ "backgroundMs": 145.23,
+ "items": 135380
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 9.47,
+ "avgMs": 0.189,
+ "p50Ms": 0.063,
+ "p95Ms": 0.702,
+ "maxMs": 0.78,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.47,
+ "items": 4661
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 195.38,
+ "avgMs": 3.908,
+ "p50Ms": 0.771,
+ "p95Ms": 16.847,
+ "maxMs": 31.282,
+ "mainThreadMs": 0,
+ "backgroundMs": 195.38,
+ "items": 135380
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 41.98,
+ "avgMs": 0.84,
+ "p50Ms": 0.764,
+ "p95Ms": 2.004,
+ "maxMs": 3.077,
+ "mainThreadMs": 41.98,
+ "backgroundMs": 0,
+ "items": 3984
+ },
+ "annotation.viewFor": {
+ "count": 1891,
+ "totalMs": 35.25,
+ "avgMs": 0.019,
+ "p50Ms": 0.008,
+ "p95Ms": 0.037,
+ "maxMs": 8.107,
+ "mainThreadMs": 35.25,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 45,
+ "totalMs": 0.18,
+ "avgMs": 0.004,
+ "p50Ms": 0.003,
+ "p95Ms": 0.01,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1891
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 786272,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3659.86,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 622,
+ "mainThreadMs": 35.42,
+ "backgroundMs": 343.38,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.59,
+ "avgMs": 0.519,
+ "p50Ms": 0.375,
+ "p95Ms": 1.143,
+ "maxMs": 1.143,
+ "mainThreadMs": 2.59,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 33.81,
+ "avgMs": 0.966,
+ "p50Ms": 0.944,
+ "p95Ms": 1.354,
+ "maxMs": 2.54,
+ "mainThreadMs": 0,
+ "backgroundMs": 33.81,
+ "items": 350000
+ },
+ "markers.cluster": {
+ "count": 35,
+ "totalMs": 125.71,
+ "avgMs": 3.592,
+ "p50Ms": 3.366,
+ "p95Ms": 6.599,
+ "maxMs": 7.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 125.71,
+ "items": 198227
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 11.64,
+ "avgMs": 0.333,
+ "p50Ms": 0.314,
+ "p95Ms": 0.49,
+ "maxMs": 0.652,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.64,
+ "items": 4955
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 172.22,
+ "avgMs": 4.921,
+ "p50Ms": 4.645,
+ "p95Ms": 8.224,
+ "maxMs": 8.374,
+ "mainThreadMs": 0,
+ "backgroundMs": 172.22,
+ "items": 198227
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 26.69,
+ "avgMs": 0.763,
+ "p50Ms": 0.701,
+ "p95Ms": 1.422,
+ "maxMs": 1.774,
+ "mainThreadMs": 26.69,
+ "backgroundMs": 0,
+ "items": 1199
+ },
+ "annotation.viewFor": {
+ "count": 417,
+ "totalMs": 6.07,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.038,
+ "maxMs": 0.119,
+ "mainThreadMs": 6.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 25,
+ "totalMs": 0.06,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 417
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 417632,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000
+ },
+ "wallMs": 1227.56,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.34,
+ "avgMs": 11.337,
+ "p95Ms": 11.337,
+ "maxMs": 11.337
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.25,
+ "maxMs": 1.25
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.354,
+ "maxMs": 2.354
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.53,
+ "backgroundMs": 8.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.76,
+ "p50Ms": 0.76,
+ "p95Ms": 0.76,
+ "maxMs": 0.76,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.35,
+ "avgMs": 2.354,
+ "p50Ms": 2.354,
+ "p95Ms": 2.354,
+ "maxMs": 2.354,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.576,
+ "p50Ms": 1.576,
+ "p95Ms": 1.576,
+ "maxMs": 1.576,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.589,
+ "p50Ms": 0.589,
+ "p95Ms": 0.589,
+ "maxMs": 0.589,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 2.66,
+ "avgMs": 2.663,
+ "p50Ms": 2.663,
+ "p95Ms": 2.663,
+ "maxMs": 2.663,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.66,
+ "items": 5208
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.287,
+ "p50Ms": 0.287,
+ "p95Ms": 0.287,
+ "maxMs": 0.287,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.29,
+ "items": 144
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 3.55,
+ "avgMs": 3.555,
+ "p50Ms": 3.555,
+ "p95Ms": 3.555,
+ "maxMs": 3.555,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.55,
+ "items": 5208
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.412,
+ "p50Ms": 0.412,
+ "p95Ms": 0.412,
+ "maxMs": 0.412,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "items": 37
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1873776,
+ "heapSizeAfterBytes": 41943040
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-1k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-1k.json
new file mode 100644
index 0000000..c19b38b
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-1k.json
@@ -0,0 +1,932 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "cluster-1k",
+ "name": "Clustering, 1k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "1000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:12:37.625Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10865,
+ "load": {
+ "commitMs": 1.49,
+ "readyMs": 62,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 45,
+ "mainThreadMs": 4.36,
+ "backgroundMs": 1.84,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.11,
+ "avgMs": 0.038,
+ "p50Ms": 0.055,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.07,
+ "avgMs": 0.036,
+ "p50Ms": 0.003,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 0.52,
+ "avgMs": 0.13,
+ "p50Ms": 0.138,
+ "p95Ms": 0.194,
+ "maxMs": 0.194,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.171,
+ "p50Ms": 0.171,
+ "p95Ms": 0.171,
+ "maxMs": 0.171,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.437,
+ "p50Ms": 0.437,
+ "p95Ms": 0.437,
+ "maxMs": 0.437,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 1000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 23
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.663,
+ "p50Ms": 0.663,
+ "p95Ms": 0.663,
+ "maxMs": 0.663,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.66,
+ "items": 1000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.99,
+ "avgMs": 1.993,
+ "p50Ms": 1.993,
+ "p95Ms": 1.993,
+ "maxMs": 1.993,
+ "mainThreadMs": 1.99,
+ "backgroundMs": 0,
+ "items": 23
+ },
+ "annotation.viewFor": {
+ "count": 23,
+ "totalMs": 2.16,
+ "avgMs": 0.094,
+ "p50Ms": 0.036,
+ "p95Ms": 0.092,
+ "maxMs": 1.312,
+ "mainThreadMs": 2.16,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 23
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 544304,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 596,
+ "durationMs": 10046.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.4,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.83,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 34.66,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 590,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 6,
+ "jankRatio": 0.0101,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 603,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.59,
+ "max": 0.76
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.43
+ },
+ "lateFrames": 0,
+ "busyMs": 78.5,
+ "busyRatio": 0.0078,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10046.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.01,
+ "avgMs": 5.008,
+ "p95Ms": 5.008,
+ "maxMs": 5.008
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.408,
+ "maxMs": 0.408
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.373,
+ "maxMs": 0.373
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1432,
+ "mainThreadMs": 67.99,
+ "backgroundMs": 84.18,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 5.29,
+ "avgMs": 0.529,
+ "p50Ms": 0.52,
+ "p95Ms": 0.869,
+ "maxMs": 0.869,
+ "mainThreadMs": 5.29,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 86,
+ "totalMs": 10.6,
+ "avgMs": 0.123,
+ "p50Ms": 0.113,
+ "p95Ms": 0.298,
+ "maxMs": 0.569,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.6,
+ "items": 86000
+ },
+ "markers.cluster": {
+ "count": 86,
+ "totalMs": 27.01,
+ "avgMs": 0.314,
+ "p50Ms": 0.281,
+ "p95Ms": 0.755,
+ "maxMs": 1.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 27.01,
+ "items": 34044
+ },
+ "markers.diff": {
+ "count": 86,
+ "totalMs": 3.73,
+ "avgMs": 0.043,
+ "p50Ms": 0.038,
+ "p95Ms": 0.089,
+ "maxMs": 0.128,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.73,
+ "items": 5371
+ },
+ "markers.viewportCompute": {
+ "count": 86,
+ "totalMs": 42.6,
+ "avgMs": 0.495,
+ "p50Ms": 0.513,
+ "p95Ms": 1.021,
+ "maxMs": 1.422,
+ "mainThreadMs": 0,
+ "backgroundMs": 42.6,
+ "items": 34044
+ },
+ "markers.applyDiff": {
+ "count": 86,
+ "totalMs": 39.77,
+ "avgMs": 0.462,
+ "p50Ms": 0.456,
+ "p95Ms": 1.152,
+ "maxMs": 1.397,
+ "mainThreadMs": 39.77,
+ "backgroundMs": 0,
+ "items": 2027
+ },
+ "annotation.viewFor": {
+ "count": 928,
+ "totalMs": 22.28,
+ "avgMs": 0.024,
+ "p50Ms": 0.008,
+ "p95Ms": 0.046,
+ "maxMs": 7.57,
+ "mainThreadMs": 22.28,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 61,
+ "totalMs": 0.16,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 928
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.116,
+ "p50Ms": 0.116,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.373,
+ "p50Ms": 0.373,
+ "p95Ms": 0.373,
+ "maxMs": 0.373,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.236,
+ "p50Ms": 0.236,
+ "p95Ms": 0.236,
+ "maxMs": 0.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193.5,
+ "afterLoadMB": 252.4,
+ "afterInteractionMB": 407.9,
+ "afterCleanupMB": 195.1,
+ "peakMB": 407.9,
+ "loadDeltaMB": 58.9,
+ "interactionDeltaMB": 155.5,
+ "retainedAfterCleanupMB": 1.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193.5,
+ "residentMB": 382,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 142117,
+ "mallocMB": 94.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 252.4,
+ "residentMB": 454.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 356393,
+ "mallocMB": 152.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 407.9,
+ "residentMB": 339.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 574395,
+ "mallocMB": 222.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 195.1,
+ "residentMB": 389.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 130248,
+ "mallocMB": 95
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1120800,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 218002,
+ "mallocBytesDelta": 72998672
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2975,
+ "wallMs": 10050,
+ "percent": 29.6,
+ "threadsBefore": 22,
+ "threadsAfter": 11,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 2000,
+ "coordinates": 2000,
+ "estimatedBytes": 181192
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 90596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5161.74,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 987,
+ "mainThreadMs": 40.96,
+ "backgroundMs": 32.94,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.73,
+ "avgMs": 0.547,
+ "p50Ms": 0.52,
+ "p95Ms": 0.869,
+ "maxMs": 0.869,
+ "mainThreadMs": 2.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 3.71,
+ "avgMs": 0.074,
+ "p50Ms": 0.034,
+ "p95Ms": 0.298,
+ "maxMs": 0.357,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.71,
+ "items": 50000
+ },
+ "markers.cluster": {
+ "count": 50,
+ "totalMs": 10.87,
+ "avgMs": 0.217,
+ "p50Ms": 0.134,
+ "p95Ms": 0.527,
+ "maxMs": 1.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.87,
+ "items": 13618
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 1.58,
+ "avgMs": 0.032,
+ "p50Ms": 0.025,
+ "p95Ms": 0.059,
+ "maxMs": 0.128,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 2066
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 16.78,
+ "avgMs": 0.336,
+ "p50Ms": 0.237,
+ "p95Ms": 0.903,
+ "maxMs": 1.422,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.78,
+ "items": 13618
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 19.86,
+ "avgMs": 0.397,
+ "p50Ms": 0.383,
+ "p95Ms": 0.979,
+ "maxMs": 1.178,
+ "mainThreadMs": 19.86,
+ "backgroundMs": 0,
+ "items": 1431
+ },
+ "annotation.viewFor": {
+ "count": 696,
+ "totalMs": 18.26,
+ "avgMs": 0.026,
+ "p50Ms": 0.008,
+ "p95Ms": 0.046,
+ "maxMs": 7.57,
+ "mainThreadMs": 18.26,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 36,
+ "totalMs": 0.1,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 696
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 449120,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3661.99,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 437,
+ "mainThreadMs": 26.4,
+ "backgroundMs": 50.29,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.56,
+ "avgMs": 0.512,
+ "p50Ms": 0.521,
+ "p95Ms": 0.638,
+ "maxMs": 0.638,
+ "mainThreadMs": 2.56,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 6.81,
+ "avgMs": 0.195,
+ "p50Ms": 0.185,
+ "p95Ms": 0.31,
+ "maxMs": 0.569,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.81,
+ "items": 35000
+ },
+ "markers.cluster": {
+ "count": 35,
+ "totalMs": 15.89,
+ "avgMs": 0.454,
+ "p50Ms": 0.431,
+ "p95Ms": 0.758,
+ "maxMs": 0.812,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.89,
+ "items": 19903
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 2.12,
+ "avgMs": 0.061,
+ "p50Ms": 0.064,
+ "p95Ms": 0.099,
+ "maxMs": 0.109,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.12,
+ "items": 3211
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 25.46,
+ "avgMs": 0.727,
+ "p50Ms": 0.71,
+ "p95Ms": 1.103,
+ "maxMs": 1.207,
+ "mainThreadMs": 0,
+ "backgroundMs": 25.46,
+ "items": 19903
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 19.76,
+ "avgMs": 0.565,
+ "p50Ms": 0.533,
+ "p95Ms": 1.244,
+ "maxMs": 1.397,
+ "mainThreadMs": 19.76,
+ "backgroundMs": 0,
+ "items": 592
+ },
+ "annotation.viewFor": {
+ "count": 232,
+ "totalMs": 4.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.011,
+ "p95Ms": 0.045,
+ "maxMs": 0.135,
+ "mainThreadMs": 4.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 25,
+ "totalMs": 0.06,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 232
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 298144,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000
+ },
+ "wallMs": 1212.75,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.01,
+ "avgMs": 5.008,
+ "p95Ms": 5.008,
+ "maxMs": 5.008
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.408,
+ "maxMs": 0.408
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.373,
+ "maxMs": 0.373
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0.95,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.116,
+ "p50Ms": 0.116,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.373,
+ "p50Ms": 0.373,
+ "p95Ms": 0.373,
+ "maxMs": 0.373,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.236,
+ "p50Ms": 0.236,
+ "p95Ms": 0.236,
+ "maxMs": 0.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.074,
+ "p50Ms": 0.074,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 1000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.247,
+ "p50Ms": 0.247,
+ "p95Ms": 0.247,
+ "maxMs": 0.247,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 523
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 94
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.359,
+ "p50Ms": 0.359,
+ "p95Ms": 0.359,
+ "maxMs": 0.359,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 523
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.145,
+ "p50Ms": 0.145,
+ "p95Ms": 0.145,
+ "maxMs": 0.145,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 274592,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-50k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-50k.json
new file mode 100644
index 0000000..61fbf62
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/cluster-50k.json
@@ -0,0 +1,931 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "cluster-50k",
+ "name": "Clustering, 50k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline"
+ ],
+ "description": "50000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:13:07.226Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10925,
+ "load": {
+ "commitMs": 45.98,
+ "readyMs": 251,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 44,
+ "mainThreadMs": 12.61,
+ "backgroundMs": 1664.8,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 7.15,
+ "avgMs": 2.383,
+ "p50Ms": 3.169,
+ "p95Ms": 3.981,
+ "maxMs": 3.981,
+ "mainThreadMs": 7.15,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 4.04,
+ "avgMs": 2.02,
+ "p50Ms": 0.004,
+ "p95Ms": 4.035,
+ "maxMs": 4.035,
+ "mainThreadMs": 4.04,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 92.45,
+ "avgMs": 23.112,
+ "p50Ms": 22.342,
+ "p95Ms": 42.56,
+ "maxMs": 42.56,
+ "mainThreadMs": 0,
+ "backgroundMs": 92.45,
+ "items": 150000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 12.56,
+ "avgMs": 12.565,
+ "p50Ms": 12.565,
+ "p95Ms": 12.565,
+ "maxMs": 12.565,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.56,
+ "items": 50000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 770.72,
+ "avgMs": 770.721,
+ "p50Ms": 770.721,
+ "p95Ms": 770.721,
+ "maxMs": 770.721,
+ "mainThreadMs": 0,
+ "backgroundMs": 770.72,
+ "items": 50000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 2.87,
+ "avgMs": 2.872,
+ "p50Ms": 2.872,
+ "p95Ms": 2.872,
+ "maxMs": 2.872,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.87,
+ "items": 22
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 786.2,
+ "avgMs": 786.2,
+ "p50Ms": 786.2,
+ "p95Ms": 786.2,
+ "maxMs": 786.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 786.2,
+ "items": 50000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.129,
+ "p50Ms": 0.129,
+ "p95Ms": 0.129,
+ "maxMs": 0.129,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 22
+ },
+ "annotation.viewFor": {
+ "count": 22,
+ "totalMs": 1.26,
+ "avgMs": 0.057,
+ "p50Ms": 0.039,
+ "p95Ms": 0.084,
+ "maxMs": 0.383,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.0069257499999999805,
+ "allocatedBytes": 21551600,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ "frames": {
+ "frames": 590,
+ "durationMs": 10104.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.4,
+ "p50": 59,
+ "p95": 53,
+ "p99": 53,
+ "worstWindow": 53,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 17.12,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 34.13,
+ "worst": 87.81,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 579,
+ 1,
+ 2,
+ 6,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0169,
+ "droppedFrames": 16,
+ "longFrames": 2,
+ "overBudgetFrames": 10
+ },
+ "js": {
+ "lagMs": {
+ "samples": 604,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.76,
+ "max": 36.88
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.2,
+ "max": 53.55
+ },
+ "lateFrames": 2,
+ "busyMs": 135.3,
+ "busyRatio": 0.0134,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10105.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 49.31,
+ "avgMs": 49.313,
+ "p95Ms": 49.313,
+ "maxMs": 49.313
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.509,
+ "maxMs": 8.509
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 8.163,
+ "maxMs": 8.163
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2852,
+ "mainThreadMs": 128.38,
+ "backgroundMs": 7898.43,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 4.6,
+ "avgMs": 0.46,
+ "p50Ms": 0.396,
+ "p95Ms": 1.047,
+ "maxMs": 1.047,
+ "mainThreadMs": 4.6,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 86,
+ "totalMs": 211.01,
+ "avgMs": 2.454,
+ "p50Ms": 2.341,
+ "p95Ms": 5.98,
+ "maxMs": 17.924,
+ "mainThreadMs": 0,
+ "backgroundMs": 211.01,
+ "items": 4300000
+ },
+ "markers.cluster": {
+ "count": 86,
+ "totalMs": 3647.66,
+ "avgMs": 42.415,
+ "p50Ms": 26.156,
+ "p95Ms": 144.462,
+ "maxMs": 380.601,
+ "mainThreadMs": 0,
+ "backgroundMs": 3647.66,
+ "items": 1690380
+ },
+ "markers.diff": {
+ "count": 86,
+ "totalMs": 84.84,
+ "avgMs": 0.986,
+ "p50Ms": 1.128,
+ "p95Ms": 2.499,
+ "maxMs": 3.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 84.84,
+ "items": 12354
+ },
+ "markers.viewportCompute": {
+ "count": 86,
+ "totalMs": 3947.18,
+ "avgMs": 45.897,
+ "p50Ms": 31.007,
+ "p95Ms": 150.381,
+ "maxMs": 401.597,
+ "mainThreadMs": 0,
+ "backgroundMs": 3947.18,
+ "items": 1690380
+ },
+ "markers.applyDiff": {
+ "count": 58,
+ "totalMs": 64.55,
+ "avgMs": 1.113,
+ "p50Ms": 0.992,
+ "p95Ms": 2.874,
+ "maxMs": 3.067,
+ "mainThreadMs": 64.55,
+ "backgroundMs": 0,
+ "items": 5493
+ },
+ "annotation.viewFor": {
+ "count": 2387,
+ "totalMs": 47.4,
+ "avgMs": 0.02,
+ "p50Ms": 0.008,
+ "p95Ms": 0.045,
+ "maxMs": 11.991,
+ "mainThreadMs": 47.4,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 50,
+ "totalMs": 0.21,
+ "avgMs": 0.004,
+ "p50Ms": 0.002,
+ "p95Ms": 0.013,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 2387
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.46,
+ "avgMs": 3.461,
+ "p50Ms": 3.461,
+ "p95Ms": 3.461,
+ "maxMs": 3.461,
+ "mainThreadMs": 3.46,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 8.16,
+ "avgMs": 8.163,
+ "p50Ms": 8.163,
+ "p95Ms": 8.163,
+ "maxMs": 8.163,
+ "mainThreadMs": 8.16,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 7.74,
+ "avgMs": 7.742,
+ "p50Ms": 7.742,
+ "p95Ms": 7.742,
+ "maxMs": 7.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.74,
+ "items": 50000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.1,
+ "afterLoadMB": 336.3,
+ "afterInteractionMB": 466.8,
+ "afterCleanupMB": 308.3,
+ "peakMB": 466.8,
+ "loadDeltaMB": 142.2,
+ "interactionDeltaMB": 130.5,
+ "retainedAfterCleanupMB": 114.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.1,
+ "residentMB": 444.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 123191,
+ "mallocMB": 90.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 336.3,
+ "residentMB": 296,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 339702,
+ "mallocMB": 199.7
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 466.8,
+ "residentMB": 464.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 616516,
+ "mallocMB": 292.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 308.3,
+ "residentMB": 440.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 237558,
+ "mallocMB": 136.4
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 10311304,
+ "gcCount": 2,
+ "gcTimeMs": 0.008436748999999993,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 276814,
+ "mallocBytesDelta": 97202192
+ }
+ },
+ "cpu": {
+ "processCpuMs": 6595,
+ "wallMs": 10115,
+ "percent": 65.2,
+ "threadsBefore": 20,
+ "threadsAfter": 11,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100000,
+ "coordinates": 100000,
+ "estimatedBytes": 9057816
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 4528908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5170.66,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2439,
+ "mainThreadMs": 87.21,
+ "backgroundMs": 4306.68,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.57,
+ "avgMs": 0.514,
+ "p50Ms": 0.396,
+ "p95Ms": 1.047,
+ "maxMs": 1.047,
+ "mainThreadMs": 2.57,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 49,
+ "totalMs": 105.02,
+ "avgMs": 2.143,
+ "p50Ms": 0.618,
+ "p95Ms": 7.597,
+ "maxMs": 17.924,
+ "mainThreadMs": 0,
+ "backgroundMs": 105.02,
+ "items": 2450000
+ },
+ "markers.cluster": {
+ "count": 48,
+ "totalMs": 2016.61,
+ "avgMs": 42.013,
+ "p50Ms": 2.182,
+ "p95Ms": 360.193,
+ "maxMs": 380.601,
+ "mainThreadMs": 0,
+ "backgroundMs": 2016.61,
+ "items": 587204
+ },
+ "markers.diff": {
+ "count": 48,
+ "totalMs": 32.68,
+ "avgMs": 0.681,
+ "p50Ms": 0.202,
+ "p95Ms": 2.726,
+ "maxMs": 3.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 32.68,
+ "items": 6843
+ },
+ "markers.viewportCompute": {
+ "count": 48,
+ "totalMs": 2152.37,
+ "avgMs": 44.841,
+ "p50Ms": 3.013,
+ "p95Ms": 368.659,
+ "maxMs": 401.597,
+ "mainThreadMs": 0,
+ "backgroundMs": 2152.37,
+ "items": 587204
+ },
+ "markers.applyDiff": {
+ "count": 29,
+ "totalMs": 39.77,
+ "avgMs": 1.372,
+ "p50Ms": 1.292,
+ "p95Ms": 3.047,
+ "maxMs": 3.067,
+ "mainThreadMs": 39.77,
+ "backgroundMs": 0,
+ "items": 4433
+ },
+ "annotation.viewFor": {
+ "count": 2181,
+ "totalMs": 44.69,
+ "avgMs": 0.02,
+ "p50Ms": 0.007,
+ "p95Ms": 0.046,
+ "maxMs": 11.991,
+ "mainThreadMs": 44.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 31,
+ "totalMs": 0.17,
+ "avgMs": 0.006,
+ "p50Ms": 0.004,
+ "p95Ms": 0.015,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 2181
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 893048,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3660.33,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 405,
+ "mainThreadMs": 28.71,
+ "backgroundMs": 3526.8,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.03,
+ "avgMs": 0.405,
+ "p50Ms": 0.427,
+ "p95Ms": 0.453,
+ "maxMs": 0.453,
+ "mainThreadMs": 2.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.cluster": {
+ "count": 37,
+ "totalMs": 1605.76,
+ "avgMs": 43.399,
+ "p50Ms": 30.834,
+ "p95Ms": 128.367,
+ "maxMs": 132.648,
+ "mainThreadMs": 0,
+ "backgroundMs": 1605.76,
+ "items": 1077180
+ },
+ "markers.diff": {
+ "count": 37,
+ "totalMs": 51,
+ "avgMs": 1.378,
+ "p50Ms": 1.231,
+ "p95Ms": 2.429,
+ "maxMs": 2.499,
+ "mainThreadMs": 0,
+ "backgroundMs": 51,
+ "items": 5354
+ },
+ "markers.viewportCompute": {
+ "count": 37,
+ "totalMs": 1766.19,
+ "avgMs": 47.735,
+ "p50Ms": 34.984,
+ "p95Ms": 134.12,
+ "maxMs": 137.69,
+ "mainThreadMs": 0,
+ "backgroundMs": 1766.19,
+ "items": 1077180
+ },
+ "markers.candidates": {
+ "count": 36,
+ "totalMs": 103.84,
+ "avgMs": 2.885,
+ "p50Ms": 2.81,
+ "p95Ms": 4.162,
+ "maxMs": 4.427,
+ "mainThreadMs": 0,
+ "backgroundMs": 103.84,
+ "items": 1800000
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 23.93,
+ "avgMs": 0.855,
+ "p50Ms": 0.753,
+ "p95Ms": 1.663,
+ "maxMs": 1.767,
+ "mainThreadMs": 23.93,
+ "backgroundMs": 0,
+ "items": 990
+ },
+ "annotation.viewFor": {
+ "count": 206,
+ "totalMs": 2.71,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.026,
+ "maxMs": 0.064,
+ "mainThreadMs": 2.71,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 19,
+ "totalMs": 0.04,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 206
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 335896,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 500,
+ "total": 50000
+ },
+ "wallMs": 1264.75,
+ "commits": {
+ "count": 1,
+ "totalMs": 49.31,
+ "avgMs": 49.313,
+ "p95Ms": 49.313,
+ "maxMs": 49.313
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.509,
+ "maxMs": 8.509
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 8.163,
+ "maxMs": 8.163
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 12.46,
+ "backgroundMs": 64.95,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.46,
+ "avgMs": 3.461,
+ "p50Ms": 3.461,
+ "p95Ms": 3.461,
+ "maxMs": 3.461,
+ "mainThreadMs": 3.46,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 8.16,
+ "avgMs": 8.163,
+ "p50Ms": 8.163,
+ "p95Ms": 8.163,
+ "maxMs": 8.163,
+ "mainThreadMs": 8.16,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 7.74,
+ "avgMs": 7.742,
+ "p50Ms": 7.742,
+ "p95Ms": 7.742,
+ "maxMs": 7.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.74,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 2.14,
+ "avgMs": 2.144,
+ "p50Ms": 2.144,
+ "p95Ms": 2.144,
+ "maxMs": 2.144,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.14,
+ "items": 50000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 25.29,
+ "avgMs": 25.285,
+ "p50Ms": 25.285,
+ "p95Ms": 25.285,
+ "maxMs": 25.285,
+ "mainThreadMs": 0,
+ "backgroundMs": 25.29,
+ "items": 25996
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.161,
+ "p50Ms": 1.161,
+ "p95Ms": 1.161,
+ "maxMs": 1.161,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.16,
+ "items": 157
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 28.61,
+ "avgMs": 28.613,
+ "p50Ms": 28.613,
+ "p95Ms": 28.613,
+ "maxMs": 28.613,
+ "mainThreadMs": 0,
+ "backgroundMs": 28.61,
+ "items": 25996
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.84,
+ "avgMs": 0.84,
+ "p50Ms": 0.84,
+ "p95Ms": 0.84,
+ "maxMs": 0.84,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 70
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.008436748999999993,
+ "allocatedBytes": 8983520,
+ "heapSizeAfterBytes": 41943040
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-camera.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-camera.json
new file mode 100644
index 0000000..8005a41
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-camera.json
@@ -0,0 +1,515 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-camera",
+ "name": "10k markers + camera",
+ "group": "combined",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast pan legs and a zoom sweep with 10k markers (no clustering).",
+ "recordedAt": "2026-09-10T14:13:17.326Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7051,
+ "load": {
+ "commitMs": 9.51,
+ "readyMs": 111,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.8,
+ "backgroundMs": 3.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.34,
+ "avgMs": 0.446,
+ "p50Ms": 0.51,
+ "p95Ms": 0.828,
+ "maxMs": 0.828,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.53,
+ "avgMs": 0.266,
+ "p50Ms": 0.002,
+ "p95Ms": 0.53,
+ "maxMs": 0.53,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.65,
+ "avgMs": 1.218,
+ "p50Ms": 1.242,
+ "p95Ms": 1.268,
+ "maxMs": 1.268,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.65,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.093,
+ "p50Ms": 0.093,
+ "p95Ms": 0.093,
+ "maxMs": 0.093,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.084,
+ "p50Ms": 0.084,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.83,
+ "avgMs": 0.096,
+ "p50Ms": 0.01,
+ "p95Ms": 0.024,
+ "maxMs": 5.126,
+ "mainThreadMs": 5.83,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0008482079999999892,
+ "allocatedBytes": 4454304,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ "frames": {
+ "frames": 365,
+ "durationMs": 6234.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.7,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 17.03,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.39,
+ "worst": 48.85,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 357,
+ 1,
+ 1,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 7,
+ "jankRatio": 0.0192,
+ "droppedFrames": 8,
+ "longFrames": 0,
+ "overBudgetFrames": 8
+ },
+ "js": {
+ "lagMs": {
+ "samples": 375,
+ "p50": 0.01,
+ "p95": 0.5,
+ "p99": 0.62,
+ "max": 1.36
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.17,
+ "max": 18.03
+ },
+ "lateFrames": 0,
+ "busyMs": 51.7,
+ "busyRatio": 0.0083,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6235.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 519,
+ "mainThreadMs": 16.93,
+ "backgroundMs": 11.22,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 4.13,
+ "avgMs": 0.413,
+ "p50Ms": 0.363,
+ "p95Ms": 0.749,
+ "maxMs": 0.749,
+ "mainThreadMs": 4.13,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 59,
+ "totalMs": 3.78,
+ "avgMs": 0.064,
+ "p50Ms": 0.014,
+ "p95Ms": 0.241,
+ "maxMs": 1.533,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.78,
+ "items": 590000
+ },
+ "markers.viewportFilter": {
+ "count": 59,
+ "totalMs": 0.58,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.034,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 3652
+ },
+ "markers.diff": {
+ "count": 59,
+ "totalMs": 0.91,
+ "avgMs": 0.015,
+ "p50Ms": 0.013,
+ "p95Ms": 0.029,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.91,
+ "items": 1192
+ },
+ "markers.viewportCompute": {
+ "count": 59,
+ "totalMs": 5.96,
+ "avgMs": 0.101,
+ "p50Ms": 0.042,
+ "p95Ms": 0.293,
+ "maxMs": 1.593,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.96,
+ "items": 3652
+ },
+ "markers.applyDiff": {
+ "count": 59,
+ "totalMs": 10.4,
+ "avgMs": 0.176,
+ "p50Ms": 0.151,
+ "p95Ms": 0.62,
+ "maxMs": 0.966,
+ "mainThreadMs": 10.4,
+ "backgroundMs": 0,
+ "items": 415
+ },
+ "annotation.viewFor": {
+ "count": 182,
+ "totalMs": 2.34,
+ "avgMs": 0.013,
+ "p50Ms": 0.009,
+ "p95Ms": 0.034,
+ "maxMs": 0.103,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 32,
+ "totalMs": 0.06,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 182
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 309,
+ "afterLoadMB": 264.4,
+ "afterInteractionMB": 445.8,
+ "afterCleanupMB": 316.2,
+ "peakMB": 445.8,
+ "loadDeltaMB": -44.6,
+ "interactionDeltaMB": 181.4,
+ "retainedAfterCleanupMB": 7.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 309,
+ "residentMB": 408.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 237078,
+ "mallocMB": 136.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 264.4,
+ "residentMB": 404.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 310575,
+ "mallocMB": 147.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 445.8,
+ "residentMB": 453.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 636244,
+ "mallocMB": 233.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 316.2,
+ "residentMB": 419,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 255737,
+ "mallocMB": 130.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 375832,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 325669,
+ "mallocBytesDelta": 90437488
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2354,
+ "wallMs": 6242,
+ "percent": 37.7,
+ "threadsBefore": 21,
+ "threadsAfter": 28,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-cluster-camera.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-cluster-camera.json
new file mode 100644
index 0000000..23ddf4d
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-cluster-camera.json
@@ -0,0 +1,515 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-cluster-camera",
+ "name": "10k markers + clustering + camera",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom sweep and pan with 10k clustered markers at country scale.",
+ "recordedAt": "2026-09-10T14:13:27.176Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6785,
+ "load": {
+ "commitMs": 15.79,
+ "readyMs": 122,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 48,
+ "mainThreadMs": 3.85,
+ "backgroundMs": 35.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.23,
+ "avgMs": 0.409,
+ "p50Ms": 0.514,
+ "p95Ms": 0.713,
+ "maxMs": 0.713,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.53,
+ "avgMs": 0.264,
+ "p50Ms": 0.003,
+ "p95Ms": 0.525,
+ "maxMs": 0.525,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 3.55,
+ "avgMs": 0.888,
+ "p50Ms": 1.139,
+ "p95Ms": 1.198,
+ "maxMs": 1.198,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.55,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.251,
+ "p50Ms": 1.251,
+ "p95Ms": 1.251,
+ "maxMs": 1.251,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.25,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 13.93,
+ "avgMs": 13.93,
+ "p50Ms": 13.93,
+ "p95Ms": 13.93,
+ "maxMs": 13.93,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.93,
+ "items": 10000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.54,
+ "avgMs": 0.54,
+ "p50Ms": 0.54,
+ "p95Ms": 0.54,
+ "maxMs": 0.54,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 26
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 15.74,
+ "avgMs": 15.735,
+ "p50Ms": 15.735,
+ "p95Ms": 15.735,
+ "maxMs": 15.735,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.74,
+ "items": 10000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.055,
+ "p50Ms": 0.055,
+ "p95Ms": 0.055,
+ "maxMs": 0.055,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 26
+ },
+ "annotation.viewFor": {
+ "count": 26,
+ "totalMs": 2.02,
+ "avgMs": 0.078,
+ "p50Ms": 0.059,
+ "p95Ms": 0.17,
+ "maxMs": 0.235,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0034307909999999886,
+ "allocatedBytes": 4444992,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 355,
+ "durationMs": 5965,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.8,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.71,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 354,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0028,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1
+ },
+ "js": {
+ "lagMs": {
+ "samples": 358,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.56,
+ "max": 0.94
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.18,
+ "max": 17.61
+ },
+ "lateFrames": 0,
+ "busyMs": 47.3,
+ "busyRatio": 0.0079,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5965.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2061,
+ "mainThreadMs": 76.92,
+ "backgroundMs": 490.71,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 4.34,
+ "avgMs": 0.542,
+ "p50Ms": 0.524,
+ "p95Ms": 0.843,
+ "maxMs": 0.843,
+ "mainThreadMs": 4.34,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 57,
+ "totalMs": 50.15,
+ "avgMs": 0.88,
+ "p50Ms": 0.728,
+ "p95Ms": 1.933,
+ "maxMs": 8.527,
+ "mainThreadMs": 0,
+ "backgroundMs": 50.15,
+ "items": 570000
+ },
+ "markers.cluster": {
+ "count": 57,
+ "totalMs": 180.64,
+ "avgMs": 3.169,
+ "p50Ms": 2.829,
+ "p95Ms": 12.312,
+ "maxMs": 18.428,
+ "mainThreadMs": 0,
+ "backgroundMs": 180.64,
+ "items": 246328
+ },
+ "markers.diff": {
+ "count": 57,
+ "totalMs": 13.89,
+ "avgMs": 0.244,
+ "p50Ms": 0.247,
+ "p95Ms": 0.695,
+ "maxMs": 0.964,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.89,
+ "items": 7310
+ },
+ "markers.viewportCompute": {
+ "count": 57,
+ "totalMs": 246.04,
+ "avgMs": 4.316,
+ "p50Ms": 3.823,
+ "p95Ms": 14.687,
+ "maxMs": 27.69,
+ "mainThreadMs": 0,
+ "backgroundMs": 246.04,
+ "items": 246328
+ },
+ "markers.applyDiff": {
+ "count": 57,
+ "totalMs": 43.11,
+ "avgMs": 0.756,
+ "p50Ms": 0.843,
+ "p95Ms": 1.611,
+ "maxMs": 2.097,
+ "mainThreadMs": 43.11,
+ "backgroundMs": 0,
+ "items": 3784
+ },
+ "annotation.viewFor": {
+ "count": 1723,
+ "totalMs": 29.31,
+ "avgMs": 0.017,
+ "p50Ms": 0.007,
+ "p95Ms": 0.036,
+ "maxMs": 5.92,
+ "mainThreadMs": 29.31,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 45,
+ "totalMs": 0.16,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.009,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1723
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 316.2,
+ "afterLoadMB": 290.3,
+ "afterInteractionMB": 438,
+ "afterCleanupMB": 291.5,
+ "peakMB": 438,
+ "loadDeltaMB": -25.9,
+ "interactionDeltaMB": 147.7,
+ "retainedAfterCleanupMB": -24.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 316.2,
+ "residentMB": 420.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256338,
+ "mallocMB": 130.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 290.3,
+ "residentMB": 446.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 343856,
+ "mallocMB": 173
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 438,
+ "residentMB": 397.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 565932,
+ "mallocMB": 239.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 291.5,
+ "residentMB": 376.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249687,
+ "mallocMB": 128.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 702400,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 222076,
+ "mallocBytesDelta": 69975568
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2301,
+ "wallMs": 5977,
+ "percent": 38.5,
+ "threadsBefore": 22,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-polygon.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-polygon.json
new file mode 100644
index 0000000..b2e82e2
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-polygon.json
@@ -0,0 +1,701 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-polygon",
+ "name": "10k markers + 200 polygons",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "200 polygons over 10k markers: three restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:13:54.275Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5240,
+ "load": {
+ "commitMs": 13.21,
+ "readyMs": 99,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 24.93,
+ "backgroundMs": 5.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.21,
+ "avgMs": 0.405,
+ "p50Ms": 0.592,
+ "p95Ms": 0.622,
+ "maxMs": 0.622,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.64,
+ "avgMs": 0.319,
+ "p50Ms": 0.003,
+ "p95Ms": 0.635,
+ "maxMs": 0.635,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 17.63,
+ "avgMs": 8.816,
+ "p50Ms": 0,
+ "p95Ms": 17.631,
+ "maxMs": 17.631,
+ "mainThreadMs": 17.63,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.001,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.37,
+ "avgMs": 1.789,
+ "p50Ms": 1.936,
+ "p95Ms": 1.975,
+ "maxMs": 1.975,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.37,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.31,
+ "avgMs": 0.087,
+ "p50Ms": 0.01,
+ "p95Ms": 0.014,
+ "maxMs": 4.664,
+ "mainThreadMs": 5.31,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0036939590000000244,
+ "allocatedBytes": 5389904,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 256,
+ "durationMs": 4427.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58,
+ "p50": 60,
+ "p95": 53,
+ "p99": 53,
+ "worstWindow": 53,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 17.25,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 42.76,
+ "worst": 61.24,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 248,
+ 4,
+ 0,
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0156,
+ "droppedFrames": 9,
+ "longFrames": 1,
+ "overBudgetFrames": 8
+ },
+ "js": {
+ "lagMs": {
+ "samples": 266,
+ "p50": 0,
+ "p95": 0.56,
+ "p99": 0.7,
+ "max": 0.9
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.23,
+ "max": 17.57
+ },
+ "lateFrames": 0,
+ "busyMs": 37.8,
+ "busyRatio": 0.0085,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4427.9,
+ "commits": {
+ "count": 3,
+ "totalMs": 8.82,
+ "avgMs": 2.94,
+ "p95Ms": 4.246,
+ "maxMs": 4.246
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.687,
+ "maxMs": 1.215
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 43.293,
+ "maxMs": 55.24
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 206,
+ "mainThreadMs": 137.57,
+ "backgroundMs": 2.49,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 129.88,
+ "avgMs": 43.293,
+ "p50Ms": 37.883,
+ "p95Ms": 55.24,
+ "maxMs": 55.24,
+ "mainThreadMs": 129.88,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.02,
+ "avgMs": 0.403,
+ "p50Ms": 0.276,
+ "p95Ms": 0.808,
+ "maxMs": 0.808,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 0.52,
+ "avgMs": 0.017,
+ "p50Ms": 0.009,
+ "p95Ms": 0.097,
+ "maxMs": 0.114,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 300000
+ },
+ "markers.viewportFilter": {
+ "count": 30,
+ "totalMs": 0.17,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.017,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1196
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.41,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.025,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 312
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 1.38,
+ "avgMs": 0.046,
+ "p50Ms": 0.032,
+ "p95Ms": 0.112,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.38,
+ "items": 1196
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 4.96,
+ "avgMs": 0.165,
+ "p50Ms": 0.198,
+ "p95Ms": 0.371,
+ "maxMs": 0.505,
+ "mainThreadMs": 4.96,
+ "backgroundMs": 0,
+ "items": 119
+ },
+ "annotation.viewFor": {
+ "count": 34,
+ "totalMs": 0.68,
+ "avgMs": 0.02,
+ "p50Ms": 0.014,
+ "p95Ms": 0.05,
+ "maxMs": 0.075,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.02,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 34
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 307.5,
+ "afterLoadMB": 323.2,
+ "afterInteractionMB": 452.2,
+ "afterCleanupMB": 366.7,
+ "peakMB": 452.2,
+ "loadDeltaMB": 15.7,
+ "interactionDeltaMB": 129,
+ "retainedAfterCleanupMB": 59.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 307.5,
+ "residentMB": 397.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 220911,
+ "mallocMB": 154.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 323.2,
+ "residentMB": 387.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 322963,
+ "mallocMB": 179.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 452.2,
+ "residentMB": 408.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 428387,
+ "mallocMB": 218.3
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 366.7,
+ "residentMB": 412,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 225027,
+ "mallocMB": 164.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1948088,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 105424,
+ "mallocBytesDelta": 41158848
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1296,
+ "wallMs": 4443,
+ "percent": 29.2,
+ "threadsBefore": 26,
+ "threadsAfter": 23,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 418.81,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.25,
+ "avgMs": 4.246,
+ "p95Ms": 4.246,
+ "maxMs": 4.246
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.215,
+ "maxMs": 1.215
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 55.24,
+ "maxMs": 55.24
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 55.24,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 55.24,
+ "avgMs": 55.24,
+ "p50Ms": 55.24,
+ "p95Ms": 55.24,
+ "maxMs": 55.24,
+ "mainThreadMs": 55.24,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 365256,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 415.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.79,
+ "avgMs": 2.789,
+ "p95Ms": 2.789,
+ "maxMs": 2.789
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.563,
+ "maxMs": 0.563
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 36.756,
+ "maxMs": 36.756
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 36.76,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 36.76,
+ "avgMs": 36.756,
+ "p50Ms": 36.756,
+ "p95Ms": 36.756,
+ "maxMs": 36.756,
+ "mainThreadMs": 36.76,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 363656,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 416.31,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.79,
+ "avgMs": 1.786,
+ "p95Ms": 1.786,
+ "maxMs": 1.786
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.281,
+ "maxMs": 0.281
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 37.883,
+ "maxMs": 37.883
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 37.88,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 37.88,
+ "avgMs": 37.883,
+ "p50Ms": 37.883,
+ "p95Ms": 37.883,
+ "maxMs": 37.883,
+ "mainThreadMs": 37.88,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 364464,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-polyline.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-polyline.json
new file mode 100644
index 0000000..8e81986
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-polyline.json
@@ -0,0 +1,701 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-polyline",
+ "name": "10k markers + 10k-point polyline",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "A 10k-point route over 10k markers: three route updates, then a pan.",
+ "recordedAt": "2026-09-10T14:13:45.975Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5237,
+ "load": {
+ "commitMs": 9.89,
+ "readyMs": 113,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 16.4,
+ "backgroundMs": 3.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.31,
+ "avgMs": 0.437,
+ "p50Ms": 0.536,
+ "p95Ms": 0.775,
+ "maxMs": 0.775,
+ "mainThreadMs": 1.31,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.56,
+ "avgMs": 0.279,
+ "p50Ms": 0.003,
+ "p95Ms": 0.556,
+ "maxMs": 0.556,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.277,
+ "p50Ms": 0.001,
+ "p95Ms": 0.553,
+ "maxMs": 0.553,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.58,
+ "avgMs": 1.194,
+ "p50Ms": 1.143,
+ "p95Ms": 1.346,
+ "maxMs": 1.346,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.58,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.085,
+ "p50Ms": 0.085,
+ "p95Ms": 0.085,
+ "maxMs": 0.085,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 13.87,
+ "avgMs": 0.227,
+ "p50Ms": 0.01,
+ "p95Ms": 0.013,
+ "maxMs": 13.234,
+ "mainThreadMs": 13.87,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.00166220899999997,
+ "allocatedBytes": 7260472,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 260,
+ "durationMs": 4423.5,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.9,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.99,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 45.71,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 255,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0154,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 266,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.73,
+ "max": 0.92
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.2,
+ "max": 17.59
+ },
+ "lateFrames": 0,
+ "busyMs": 36.9,
+ "busyRatio": 0.0083,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4424,
+ "commits": {
+ "count": 3,
+ "totalMs": 4.66,
+ "avgMs": 1.554,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.193,
+ "maxMs": 0.3
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 2.135,
+ "maxMs": 2.934
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 206,
+ "mainThreadMs": 15.55,
+ "backgroundMs": 3.21,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 6.4,
+ "avgMs": 2.135,
+ "p50Ms": 1.853,
+ "p95Ms": 2.934,
+ "maxMs": 2.934,
+ "mainThreadMs": 6.4,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.19,
+ "avgMs": 0.438,
+ "p50Ms": 0.384,
+ "p95Ms": 0.761,
+ "maxMs": 0.761,
+ "mainThreadMs": 2.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 0.78,
+ "avgMs": 0.026,
+ "p50Ms": 0.011,
+ "p95Ms": 0.118,
+ "maxMs": 0.155,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 300000
+ },
+ "markers.viewportFilter": {
+ "count": 30,
+ "totalMs": 0.26,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.026,
+ "maxMs": 0.084,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1196
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.43,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.02,
+ "maxMs": 0.042,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.43,
+ "items": 306
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 1.74,
+ "avgMs": 0.058,
+ "p50Ms": 0.039,
+ "p95Ms": 0.183,
+ "maxMs": 0.258,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.74,
+ "items": 1196
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 6.2,
+ "avgMs": 0.207,
+ "p50Ms": 0.221,
+ "p95Ms": 0.593,
+ "maxMs": 0.843,
+ "mainThreadMs": 6.2,
+ "backgroundMs": 0,
+ "items": 119
+ },
+ "annotation.viewFor": {
+ "count": 34,
+ "totalMs": 0.73,
+ "avgMs": 0.021,
+ "p50Ms": 0.013,
+ "p95Ms": 0.071,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 34
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 238.3,
+ "afterLoadMB": 288.6,
+ "afterInteractionMB": 387.4,
+ "afterCleanupMB": 307.1,
+ "peakMB": 387.4,
+ "loadDeltaMB": 50.3,
+ "interactionDeltaMB": 98.8,
+ "retainedAfterCleanupMB": 68.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 238.3,
+ "residentMB": 374.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 132008,
+ "mallocMB": 129.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 288.6,
+ "residentMB": 345.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 293859,
+ "mallocMB": 171.3
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 387.4,
+ "residentMB": 394,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 396546,
+ "mallocMB": 204.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 307.1,
+ "residentMB": 395.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 222969,
+ "mallocMB": 154.7
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 7121448,
+ "gcCount": 2,
+ "gcTimeMs": 0.0011925830000000248,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 102687,
+ "mallocBytesDelta": 34496784
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1179,
+ "wallMs": 4429,
+ "percent": 26.6,
+ "threadsBefore": 21,
+ "threadsAfter": 30,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 4,
+ "coordinates": 40000,
+ "estimatedBytes": 1791427
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 410.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.337,
+ "p95Ms": 1.337,
+ "maxMs": 1.337
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.156,
+ "maxMs": 0.156
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.853,
+ "maxMs": 1.853
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.85,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.85,
+ "avgMs": 1.853,
+ "p50Ms": 1.853,
+ "p95Ms": 1.853,
+ "maxMs": 1.853,
+ "mainThreadMs": 1.85,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0008592080000000002,
+ "allocatedBytes": 1944320,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 1,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 415.44,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.783,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.3,
+ "maxMs": 0.3
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.934,
+ "maxMs": 2.934
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.93,
+ "avgMs": 2.934,
+ "p50Ms": 2.934,
+ "p95Ms": 2.934,
+ "maxMs": 2.934,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0003333750000000246,
+ "allocatedBytes": 1943376,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 2,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 416.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.54,
+ "avgMs": 1.542,
+ "p95Ms": 1.542,
+ "maxMs": 1.542
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.123,
+ "maxMs": 0.123
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.617,
+ "maxMs": 1.617
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.617,
+ "p50Ms": 1.617,
+ "p95Ms": 1.617,
+ "maxMs": 1.617,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1944240,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-updates.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-updates.json
new file mode 100644
index 0000000..809660c
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-10k-updates.json
@@ -0,0 +1,718 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-updates",
+ "name": "10k markers + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "1 % of 10k markers move at 5 Hz for 5 s while the camera pans slowly.",
+ "recordedAt": "2026-09-10T14:13:37.674Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7482,
+ "load": {
+ "commitMs": 8.28,
+ "readyMs": 74,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 6.9,
+ "backgroundMs": 3.8,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.11,
+ "avgMs": 0.369,
+ "p50Ms": 0.532,
+ "p95Ms": 0.573,
+ "maxMs": 0.573,
+ "mainThreadMs": 1.11,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.273,
+ "p50Ms": 0.002,
+ "p95Ms": 0.544,
+ "maxMs": 0.544,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.7,
+ "avgMs": 1.235,
+ "p50Ms": 1.144,
+ "p95Ms": 1.443,
+ "maxMs": 1.443,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.7,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.084,
+ "p50Ms": 0.084,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.15,
+ "avgMs": 0.084,
+ "p50Ms": 0.009,
+ "p95Ms": 0.015,
+ "maxMs": 4.534,
+ "mainThreadMs": 5.15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013843749999999932,
+ "allocatedBytes": 4454280,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 396,
+ "durationMs": 6668.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58.5,
+ "p99": 58.5,
+ "worstWindow": 58.5,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.79,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 393,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0076,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 401,
+ "p50": 0,
+ "p95": 0.47,
+ "p99": 0.58,
+ "max": 2.37
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.14,
+ "max": 19.04
+ },
+ "lateFrames": 0,
+ "busyMs": 54.2,
+ "busyRatio": 0.0081,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6669.6,
+ "commits": {
+ "count": 25,
+ "totalMs": 326.79,
+ "avgMs": 13.072,
+ "p95Ms": 16.403,
+ "maxMs": 18.025
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 2.125,
+ "maxMs": 5.875
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 2.198,
+ "maxMs": 4.651
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 566,
+ "mainThreadMs": 84.06,
+ "backgroundMs": 42.61,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.88,
+ "avgMs": 0.376,
+ "p50Ms": 0.262,
+ "p95Ms": 0.82,
+ "maxMs": 0.82,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 17.37,
+ "avgMs": 0.695,
+ "p50Ms": 0.686,
+ "p95Ms": 0.893,
+ "maxMs": 0.966,
+ "mainThreadMs": 17.37,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 54.96,
+ "avgMs": 2.198,
+ "p50Ms": 2.027,
+ "p95Ms": 3.834,
+ "maxMs": 4.651,
+ "mainThreadMs": 54.96,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 26,
+ "totalMs": 36.56,
+ "avgMs": 1.406,
+ "p50Ms": 1.438,
+ "p95Ms": 1.865,
+ "maxMs": 2.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 36.56,
+ "items": 260000
+ },
+ "markers.candidates": {
+ "count": 89,
+ "totalMs": 1.04,
+ "avgMs": 0.012,
+ "p50Ms": 0.009,
+ "p95Ms": 0.027,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.04,
+ "items": 890000
+ },
+ "markers.viewportFilter": {
+ "count": 89,
+ "totalMs": 0.56,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.019,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 3932
+ },
+ "markers.diff": {
+ "count": 89,
+ "totalMs": 1.17,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.023,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.17,
+ "items": 1064
+ },
+ "markers.viewportCompute": {
+ "count": 89,
+ "totalMs": 3.28,
+ "avgMs": 0.037,
+ "p50Ms": 0.032,
+ "p95Ms": 0.086,
+ "maxMs": 0.124,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.28,
+ "items": 3932
+ },
+ "markers.applyDiff": {
+ "count": 87,
+ "totalMs": 8.97,
+ "avgMs": 0.103,
+ "p50Ms": 0.022,
+ "p95Ms": 0.39,
+ "maxMs": 0.417,
+ "mainThreadMs": 8.97,
+ "backgroundMs": 0,
+ "items": 98
+ },
+ "annotation.viewFor": {
+ "count": 22,
+ "totalMs": 0.85,
+ "avgMs": 0.039,
+ "p50Ms": 0.035,
+ "p95Ms": 0.069,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.85,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 20,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 290.9,
+ "afterLoadMB": 257.4,
+ "afterInteractionMB": 365.3,
+ "afterCleanupMB": 292,
+ "peakMB": 365.3,
+ "loadDeltaMB": -33.5,
+ "interactionDeltaMB": 107.9,
+ "retainedAfterCleanupMB": 1.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 290.9,
+ "residentMB": 370.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 239512,
+ "mallocMB": 127.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 257.4,
+ "residentMB": 364.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 313403,
+ "mallocMB": 131.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 365.3,
+ "residentMB": 374.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 402893,
+ "mallocMB": 192.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 292,
+ "residentMB": 374.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 241422,
+ "mallocMB": 146.4
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 46231176,
+ "gcCount": 13,
+ "gcTimeMs": 0.014198790999999988,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 89490,
+ "mallocBytesDelta": 64175488
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2169,
+ "wallMs": 6677,
+ "percent": 32.5,
+ "threadsBefore": 21,
+ "threadsAfter": 20,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 26,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 260000,
+ "coordinates": 260000,
+ "estimatedBytes": 18613491
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 716252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 5479.69,
+ "commits": {
+ "count": 25,
+ "totalMs": 326.79,
+ "avgMs": 13.072,
+ "p95Ms": 16.403,
+ "maxMs": 18.025
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 2.125,
+ "maxMs": 5.875
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 2.198,
+ "maxMs": 4.651
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 490,
+ "mainThreadMs": 82.6,
+ "backgroundMs": 41.62,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.88,
+ "avgMs": 0.376,
+ "p50Ms": 0.262,
+ "p95Ms": 0.82,
+ "maxMs": 0.82,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 17.37,
+ "avgMs": 0.695,
+ "p50Ms": 0.686,
+ "p95Ms": 0.893,
+ "maxMs": 0.966,
+ "mainThreadMs": 17.37,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 54.96,
+ "avgMs": 2.198,
+ "p50Ms": 2.027,
+ "p95Ms": 3.834,
+ "maxMs": 4.651,
+ "mainThreadMs": 54.96,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 26,
+ "totalMs": 36.56,
+ "avgMs": 1.406,
+ "p50Ms": 1.438,
+ "p95Ms": 1.865,
+ "maxMs": 2.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 36.56,
+ "items": 260000
+ },
+ "markers.candidates": {
+ "count": 77,
+ "totalMs": 0.86,
+ "avgMs": 0.011,
+ "p50Ms": 0.009,
+ "p95Ms": 0.027,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.86,
+ "items": 770000
+ },
+ "markers.viewportFilter": {
+ "count": 77,
+ "totalMs": 0.47,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.019,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 3374
+ },
+ "markers.diff": {
+ "count": 77,
+ "totalMs": 1.02,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.023,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.02,
+ "items": 963
+ },
+ "markers.viewportCompute": {
+ "count": 77,
+ "totalMs": 2.72,
+ "avgMs": 0.035,
+ "p50Ms": 0.032,
+ "p95Ms": 0.068,
+ "maxMs": 0.124,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.72,
+ "items": 3374
+ },
+ "markers.applyDiff": {
+ "count": 75,
+ "totalMs": 7.83,
+ "avgMs": 0.104,
+ "p50Ms": 0.001,
+ "p95Ms": 0.392,
+ "maxMs": 0.417,
+ "mainThreadMs": 7.83,
+ "backgroundMs": 0,
+ "items": 82
+ },
+ "annotation.viewFor": {
+ "count": 13,
+ "totalMs": 0.55,
+ "avgMs": 0.042,
+ "p50Ms": 0.039,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 13,
+ "totalMs": 0.02,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 13
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 13,
+ "gcTimeMs": 0.014198790999999988,
+ "allocatedBytes": 46111992,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-all.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-all.json
new file mode 100644
index 0000000..e62e55e
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/combined-all.json
@@ -0,0 +1,741 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-all",
+ "name": "Markers + clustering + geometry + camera + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "10k clustered markers, a 5k-point route and 100 polygons; zoom sweep, pan, and 100 moving markers at 5 Hz.",
+ "recordedAt": "2026-09-10T14:14:06.642Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 8776,
+ "load": {
+ "commitMs": 10.59,
+ "readyMs": 143,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 48,
+ "mainThreadMs": 13.5,
+ "backgroundMs": 101.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.29,
+ "avgMs": 0.431,
+ "p50Ms": 0.622,
+ "p95Ms": 0.671,
+ "maxMs": 0.671,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.65,
+ "avgMs": 0.324,
+ "p50Ms": 0.003,
+ "p95Ms": 0.644,
+ "maxMs": 0.644,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.6,
+ "avgMs": 0.3,
+ "p50Ms": 0.001,
+ "p95Ms": 0.599,
+ "maxMs": 0.599,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 7.32,
+ "avgMs": 3.658,
+ "p50Ms": 0,
+ "p95Ms": 7.316,
+ "maxMs": 7.316,
+ "mainThreadMs": 7.32,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.001,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 6.81,
+ "avgMs": 1.702,
+ "p50Ms": 2.007,
+ "p95Ms": 2.49,
+ "maxMs": 2.49,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.81,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 4.86,
+ "avgMs": 4.861,
+ "p50Ms": 4.861,
+ "p95Ms": 4.861,
+ "maxMs": 4.861,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.86,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 41.44,
+ "avgMs": 41.44,
+ "p50Ms": 41.44,
+ "p95Ms": 41.44,
+ "maxMs": 41.44,
+ "mainThreadMs": 0,
+ "backgroundMs": 41.44,
+ "items": 10000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 1.02,
+ "avgMs": 1.016,
+ "p50Ms": 1.016,
+ "p95Ms": 1.016,
+ "maxMs": 1.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.02,
+ "items": 26
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 47.34,
+ "avgMs": 47.343,
+ "p50Ms": 47.343,
+ "p95Ms": 47.343,
+ "maxMs": 47.343,
+ "mainThreadMs": 0,
+ "backgroundMs": 47.34,
+ "items": 10000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.128,
+ "p50Ms": 0.128,
+ "p95Ms": 0.128,
+ "maxMs": 0.128,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 26
+ },
+ "annotation.viewFor": {
+ "count": 26,
+ "totalMs": 3.5,
+ "avgMs": 0.135,
+ "p50Ms": 0.049,
+ "p95Ms": 0.361,
+ "maxMs": 1.534,
+ "mainThreadMs": 3.5,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.005501666000000016,
+ "allocatedBytes": 6471704,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 468,
+ "durationMs": 7962.5,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.9,
+ "p50": 60,
+ "p95": 54,
+ "p99": 54,
+ "worstWindow": 54,
+ "windows": 8
+ },
+ "frameTimeMs": {
+ "average": 16.99,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 35.09,
+ "worst": 39.75,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 459,
+ 0,
+ 2,
+ 7,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 9,
+ "jankRatio": 0.0192,
+ "droppedFrames": 9,
+ "longFrames": 0,
+ "overBudgetFrames": 9
+ },
+ "js": {
+ "lagMs": {
+ "samples": 478,
+ "p50": 0.01,
+ "p95": 0.53,
+ "p99": 0.65,
+ "max": 5.49
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.19,
+ "max": 22.16
+ },
+ "lateFrames": 0,
+ "busyMs": 79.5,
+ "busyRatio": 0.01,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 7963,
+ "commits": {
+ "count": 20,
+ "totalMs": 265.28,
+ "avgMs": 13.264,
+ "p95Ms": 16.406,
+ "maxMs": 16.856
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 2.039,
+ "maxMs": 5.841
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 2.105,
+ "maxMs": 3.132
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1719,
+ "mainThreadMs": 102.75,
+ "backgroundMs": 212.57,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 3.46,
+ "avgMs": 0.433,
+ "p50Ms": 0.395,
+ "p95Ms": 0.583,
+ "maxMs": 0.583,
+ "mainThreadMs": 3.46,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 97,
+ "totalMs": 12.06,
+ "avgMs": 0.124,
+ "p50Ms": 0.01,
+ "p95Ms": 0.995,
+ "maxMs": 2.718,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.06,
+ "items": 970000
+ },
+ "markers.cluster": {
+ "count": 97,
+ "totalMs": 73.51,
+ "avgMs": 0.758,
+ "p50Ms": 0.1,
+ "p95Ms": 5.304,
+ "maxMs": 19.245,
+ "mainThreadMs": 0,
+ "backgroundMs": 73.51,
+ "items": 64564
+ },
+ "markers.diff": {
+ "count": 97,
+ "totalMs": 5.37,
+ "avgMs": 0.055,
+ "p50Ms": 0.018,
+ "p95Ms": 0.466,
+ "maxMs": 0.746,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.37,
+ "items": 4047
+ },
+ "markers.viewportCompute": {
+ "count": 97,
+ "totalMs": 91.83,
+ "avgMs": 0.947,
+ "p50Ms": 0.136,
+ "p95Ms": 6.569,
+ "maxMs": 21.594,
+ "mainThreadMs": 0,
+ "backgroundMs": 91.83,
+ "items": 64564
+ },
+ "markers.applyDiff": {
+ "count": 97,
+ "totalMs": 20.6,
+ "avgMs": 0.212,
+ "p50Ms": 0.001,
+ "p95Ms": 1.267,
+ "maxMs": 1.821,
+ "mainThreadMs": 20.6,
+ "backgroundMs": 0,
+ "items": 2362
+ },
+ "annotation.viewFor": {
+ "count": 1106,
+ "totalMs": 21.86,
+ "avgMs": 0.02,
+ "p50Ms": 0.011,
+ "p95Ms": 0.044,
+ "maxMs": 4.629,
+ "mainThreadMs": 21.86,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 60,
+ "totalMs": 0.15,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.007,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 1106
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 14.58,
+ "avgMs": 0.729,
+ "p50Ms": 0.718,
+ "p95Ms": 0.906,
+ "maxMs": 0.921,
+ "mainThreadMs": 14.58,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 42.1,
+ "avgMs": 2.105,
+ "p50Ms": 1.978,
+ "p95Ms": 3.078,
+ "maxMs": 3.132,
+ "mainThreadMs": 42.1,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 29.8,
+ "avgMs": 1.49,
+ "p50Ms": 1.476,
+ "p95Ms": 1.901,
+ "maxMs": 1.964,
+ "mainThreadMs": 0,
+ "backgroundMs": 29.8,
+ "items": 200000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 367.4,
+ "afterLoadMB": 338,
+ "afterInteractionMB": 496.9,
+ "afterCleanupMB": 347.8,
+ "peakMB": 496.9,
+ "loadDeltaMB": -29.4,
+ "interactionDeltaMB": 158.9,
+ "retainedAfterCleanupMB": -19.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 367.4,
+ "residentMB": 412.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 225619,
+ "mallocMB": 164.4
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 338,
+ "residentMB": 403.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 365362,
+ "mallocMB": 205.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 496.9,
+ "residentMB": 507.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 657311,
+ "mallocMB": 266.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 347.8,
+ "residentMB": 509.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256691,
+ "mallocMB": 135.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 37461656,
+ "gcCount": 10,
+ "gcTimeMs": 0.015770167999999973,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 291949,
+ "mallocBytesDelta": 64286896
+ }
+ },
+ "cpu": {
+ "processCpuMs": 3276,
+ "wallMs": 7967,
+ "percent": 41.1,
+ "threadsBefore": 23,
+ "threadsAfter": 23,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 21,
+ "polylines": 1,
+ "polygons": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 210000,
+ "coordinates": 210000,
+ "estimatedBytes": 19031295
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 907033
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 4377.79,
+ "commits": {
+ "count": 20,
+ "totalMs": 265.28,
+ "avgMs": 13.264,
+ "p95Ms": 16.406,
+ "maxMs": 16.856
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 2.039,
+ "maxMs": 5.841
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 2.105,
+ "maxMs": 3.132
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 584,
+ "mainThreadMs": 64.21,
+ "backgroundMs": 44.32,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.13,
+ "avgMs": 0.427,
+ "p50Ms": 0.395,
+ "p95Ms": 0.583,
+ "maxMs": 0.583,
+ "mainThreadMs": 2.13,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 14.58,
+ "avgMs": 0.729,
+ "p50Ms": 0.718,
+ "p95Ms": 0.906,
+ "maxMs": 0.921,
+ "mainThreadMs": 14.58,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 42.1,
+ "avgMs": 2.105,
+ "p50Ms": 1.978,
+ "p95Ms": 3.078,
+ "maxMs": 3.132,
+ "mainThreadMs": 42.1,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 29.8,
+ "avgMs": 1.49,
+ "p50Ms": 1.476,
+ "p95Ms": 1.901,
+ "maxMs": 1.964,
+ "mainThreadMs": 0,
+ "backgroundMs": 29.8,
+ "items": 200000
+ },
+ "markers.candidates": {
+ "count": 62,
+ "totalMs": 0.54,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.017,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 620000
+ },
+ "markers.cluster": {
+ "count": 62,
+ "totalMs": 5.44,
+ "avgMs": 0.088,
+ "p50Ms": 0.086,
+ "p95Ms": 0.153,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.44,
+ "items": 2016
+ },
+ "markers.diff": {
+ "count": 62,
+ "totalMs": 1.09,
+ "avgMs": 0.018,
+ "p50Ms": 0.016,
+ "p95Ms": 0.038,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.09,
+ "items": 1906
+ },
+ "markers.viewportCompute": {
+ "count": 62,
+ "totalMs": 7.45,
+ "avgMs": 0.12,
+ "p50Ms": 0.116,
+ "p95Ms": 0.186,
+ "maxMs": 0.285,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.45,
+ "items": 2016
+ },
+ "markers.applyDiff": {
+ "count": 62,
+ "totalMs": 2.67,
+ "avgMs": 0.043,
+ "p50Ms": 0.001,
+ "p95Ms": 0.239,
+ "maxMs": 0.48,
+ "mainThreadMs": 2.67,
+ "backgroundMs": 0,
+ "items": 425
+ },
+ "annotation.viewFor": {
+ "count": 175,
+ "totalMs": 2.66,
+ "avgMs": 0.015,
+ "p50Ms": 0.009,
+ "p95Ms": 0.049,
+ "maxMs": 0.103,
+ "mainThreadMs": 2.66,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 34,
+ "totalMs": 0.07,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 175
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 10,
+ "gcTimeMs": 0.015770167999999973,
+ "allocatedBytes": 37034872,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-100.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-100.json
new file mode 100644
index 0000000..aff72da
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-100.json
@@ -0,0 +1,416 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-100",
+ "name": "100 markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 100 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:07:56.307Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3745,
+ "load": {
+ "commitMs": 0.64,
+ "readyMs": 256,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 115,
+ "mainThreadMs": 38.74,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.07,
+ "avgMs": 0.022,
+ "p50Ms": 0.012,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 200
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 1.25,
+ "avgMs": 0.626,
+ "p50Ms": 0.081,
+ "p95Ms": 1.171,
+ "maxMs": 1.171,
+ "mainThreadMs": 1.25,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.212,
+ "p50Ms": 0.212,
+ "p95Ms": 0.212,
+ "maxMs": 0.212,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.04,
+ "avgMs": 1.043,
+ "p50Ms": 1.043,
+ "p95Ms": 1.043,
+ "maxMs": 1.043,
+ "mainThreadMs": 1.04,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "annotation.viewFor": {
+ "count": 100,
+ "totalMs": 36.05,
+ "avgMs": 0.361,
+ "p50Ms": 0.009,
+ "p95Ms": 0.017,
+ "maxMs": 34.959,
+ "mainThreadMs": 36.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 276152,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 173,
+ "durationMs": 2928.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.3,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.86,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 21.29,
+ "worst": 45.38,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 171,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0058,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 177,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.8,
+ "max": 0.88
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.14,
+ "max": 17.55
+ },
+ "lateFrames": 0,
+ "busyMs": 22.4,
+ "busyRatio": 0.0076,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2930.6,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 6,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.62,
+ "avgMs": 0.406,
+ "p50Ms": 0.333,
+ "p95Ms": 0.56,
+ "maxMs": 0.56,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.195,
+ "p50Ms": 0.195,
+ "p95Ms": 0.195,
+ "maxMs": 0.195,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 124.2,
+ "afterLoadMB": 185,
+ "afterInteractionMB": 260.4,
+ "afterCleanupMB": 190.5,
+ "peakMB": 260.4,
+ "loadDeltaMB": 60.8,
+ "interactionDeltaMB": 75.4,
+ "retainedAfterCleanupMB": 66.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 124.2,
+ "residentMB": 359.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 92877,
+ "mallocMB": 82.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 185,
+ "residentMB": 348.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 265114,
+ "mallocMB": 117.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 260.4,
+ "residentMB": 402,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 358821,
+ "mallocMB": 136.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 190.5,
+ "residentMB": 391.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 199005,
+ "mallocMB": 98.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 111568,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 93707,
+ "mallocBytesDelta": 19442768
+ }
+ },
+ "cpu": {
+ "processCpuMs": 901,
+ "wallMs": 2937,
+ "percent": 30.7,
+ "threadsBefore": 21,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-10k-rich.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-10k-rich.json
new file mode 100644
index 0000000..9186a83
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-10k-rich.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-10k-rich",
+ "name": "10k markers with titles and visual props",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Same as markers-10k but every descriptor carries title, subtitle, rotation, opacity, anchor and flat, to measure optional-field conversion cost.",
+ "recordedAt": "2026-09-10T14:08:30.240Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3744,
+ "load": {
+ "commitMs": 9.07,
+ "readyMs": 95,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 84,
+ "mainThreadMs": 12.98,
+ "backgroundMs": 5.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 2.55,
+ "avgMs": 0.85,
+ "p50Ms": 1.235,
+ "p95Ms": 1.315,
+ "maxMs": 1.315,
+ "mainThreadMs": 2.55,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 1.27,
+ "avgMs": 0.633,
+ "p50Ms": 0.002,
+ "p95Ms": 1.265,
+ "maxMs": 1.265,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.24,
+ "avgMs": 1.746,
+ "p50Ms": 1.589,
+ "p95Ms": 2.156,
+ "maxMs": 2.156,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.24,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 85
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 63
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 85
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 63
+ },
+ "annotation.viewFor": {
+ "count": 63,
+ "totalMs": 9.04,
+ "avgMs": 0.143,
+ "p50Ms": 0.011,
+ "p95Ms": 0.022,
+ "maxMs": 8.284,
+ "mainThreadMs": 9.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 63
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.021385334000000006,
+ "allocatedBytes": 7826512,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 170,
+ "durationMs": 2930.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.3,
+ "p50": 60,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.16,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.95,
+ "worst": 41.7,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 165,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0235,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.58,
+ "max": 0.7
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.19,
+ "max": 17.37
+ },
+ "lateFrames": 0,
+ "busyMs": 26.2,
+ "busyRatio": 0.0089,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 160,
+ "mainThreadMs": 7.1,
+ "backgroundMs": 3.31,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.06,
+ "avgMs": 0.516,
+ "p50Ms": 0.467,
+ "p95Ms": 0.769,
+ "maxMs": 0.769,
+ "mainThreadMs": 2.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 0.75,
+ "avgMs": 0.027,
+ "p50Ms": 0.011,
+ "p95Ms": 0.039,
+ "maxMs": 0.354,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.75,
+ "items": 280000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.23,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 1036
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.53,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.031,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 366
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 1.8,
+ "avgMs": 0.064,
+ "p50Ms": 0.043,
+ "p95Ms": 0.114,
+ "maxMs": 0.491,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.8,
+ "items": 1036
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 4.68,
+ "avgMs": 0.167,
+ "p50Ms": 0.165,
+ "p95Ms": 0.523,
+ "maxMs": 0.679,
+ "mainThreadMs": 4.68,
+ "backgroundMs": 0,
+ "items": 74
+ },
+ "annotation.viewFor": {
+ "count": 9,
+ "totalMs": 0.34,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 7,
+ "totalMs": 0.01,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 9
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 242.3,
+ "afterLoadMB": 218.9,
+ "afterInteractionMB": 298.4,
+ "afterCleanupMB": 220.2,
+ "peakMB": 298.4,
+ "loadDeltaMB": -23.4,
+ "interactionDeltaMB": 79.5,
+ "retainedAfterCleanupMB": -22.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 242.3,
+ "residentMB": 330,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 212862,
+ "mallocMB": 131.9
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 218.9,
+ "residentMB": 359.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 290887,
+ "mallocMB": 131.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 298.4,
+ "residentMB": 391.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 380267,
+ "mallocMB": 151.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 220.2,
+ "residentMB": 383.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 214904,
+ "mallocMB": 105.6
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 151792,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 89380,
+ "mallocBytesDelta": 21284192
+ }
+ },
+ "cpu": {
+ "processCpuMs": 966,
+ "wallMs": 2935,
+ "percent": 32.9,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-10k.json
new file mode 100644
index 0000000..86b2b94
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-10k.json
@@ -0,0 +1,515 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-10k",
+ "name": "10k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 10000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:08:08.840Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3749,
+ "load": {
+ "commitMs": 12.7,
+ "readyMs": 77,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.23,
+ "backgroundMs": 4.25,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.22,
+ "avgMs": 0.406,
+ "p50Ms": 0.579,
+ "p95Ms": 0.639,
+ "maxMs": 0.639,
+ "mainThreadMs": 1.22,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.65,
+ "avgMs": 0.327,
+ "p50Ms": 0.003,
+ "p95Ms": 0.651,
+ "maxMs": 0.651,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.15,
+ "avgMs": 1.385,
+ "p50Ms": 1.464,
+ "p95Ms": 1.469,
+ "maxMs": 1.469,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.15,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.25,
+ "avgMs": 0.086,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 4.582,
+ "mainThreadMs": 5.25,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0014962500000000002,
+ "allocatedBytes": 4455520,
+ "heapSizeAfterBytes": 12582912
+ }
+ },
+ "frames": {
+ "frames": 169,
+ "durationMs": 2937.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.9,
+ "p50": 59,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.26,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 36.61,
+ "worst": 43.79,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 163,
+ 1,
+ 0,
+ 5,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 5,
+ "jankRatio": 0.0296,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0.06,
+ "p95": 0.45,
+ "p99": 0.72,
+ "max": 1.16
+ },
+ "frameGapMs": {
+ "p50": 16.72,
+ "p95": 17.12,
+ "max": 17.82
+ },
+ "lateFrames": 0,
+ "busyMs": 21.8,
+ "busyRatio": 0.0074,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2937.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 172,
+ "mainThreadMs": 8.03,
+ "backgroundMs": 5.79,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.75,
+ "avgMs": 0.687,
+ "p50Ms": 0.67,
+ "p95Ms": 1,
+ "maxMs": 1,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 2.11,
+ "avgMs": 0.075,
+ "p50Ms": 0.011,
+ "p95Ms": 0.052,
+ "maxMs": 1.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.11,
+ "items": 280000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.18,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.02,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1199
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.46,
+ "avgMs": 0.016,
+ "p50Ms": 0.015,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 305
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 3.04,
+ "avgMs": 0.108,
+ "p50Ms": 0.039,
+ "p95Ms": 0.148,
+ "maxMs": 1.807,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.04,
+ "items": 1199
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 4.78,
+ "avgMs": 0.171,
+ "p50Ms": 0.192,
+ "p95Ms": 0.425,
+ "maxMs": 0.585,
+ "mainThreadMs": 4.78,
+ "backgroundMs": 0,
+ "items": 87
+ },
+ "annotation.viewFor": {
+ "count": 18,
+ "totalMs": 0.49,
+ "avgMs": 0.027,
+ "p50Ms": 0.026,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 10,
+ "totalMs": 0.02,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 18
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193.2,
+ "afterLoadMB": 192.6,
+ "afterInteractionMB": 253.4,
+ "afterCleanupMB": 201.1,
+ "peakMB": 253.4,
+ "loadDeltaMB": -0.6,
+ "interactionDeltaMB": 60.8,
+ "retainedAfterCleanupMB": 7.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193.2,
+ "residentMB": 374.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 202717,
+ "mallocMB": 98.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 192.6,
+ "residentMB": 387.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 282638,
+ "mallocMB": 129
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 253.4,
+ "residentMB": 435.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 369896,
+ "mallocMB": 150.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 201.1,
+ "residentMB": 418.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 206693,
+ "mallocMB": 104.7
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 160680,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 12
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 87258,
+ "mallocBytesDelta": 22780384
+ }
+ },
+ "cpu": {
+ "processCpuMs": 933,
+ "wallMs": 2942,
+ "percent": 31.7,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-1k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-1k.json
new file mode 100644
index 0000000..cc55bed
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-1k.json
@@ -0,0 +1,515 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-1k",
+ "name": "1k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 1000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:08:02.074Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3751,
+ "load": {
+ "commitMs": 2.87,
+ "readyMs": 75,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 5.58,
+ "backgroundMs": 0.57,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.18,
+ "avgMs": 0.059,
+ "p50Ms": 0.078,
+ "p95Ms": 0.098,
+ "maxMs": 0.098,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.09,
+ "avgMs": 0.047,
+ "p50Ms": 0.003,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.53,
+ "avgMs": 0.178,
+ "p50Ms": 0.153,
+ "p95Ms": 0.238,
+ "maxMs": 0.238,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 5.25,
+ "avgMs": 1.311,
+ "p50Ms": 0.017,
+ "p95Ms": 5.185,
+ "maxMs": 5.185,
+ "mainThreadMs": 5.25,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 517544,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 171,
+ "durationMs": 2931.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.6,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.06,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 49.96,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 167,
+ 1,
+ 0,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0175,
+ "droppedFrames": 4,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0,
+ "p95": 0.57,
+ "p99": 0.78,
+ "max": 0.8
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.24,
+ "max": 17.47
+ },
+ "lateFrames": 0,
+ "busyMs": 29.2,
+ "busyRatio": 0.01,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2932.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 146,
+ "mainThreadMs": 3.15,
+ "backgroundMs": 1.66,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.17,
+ "avgMs": 0.541,
+ "p50Ms": 0.326,
+ "p95Ms": 0.818,
+ "maxMs": 0.818,
+ "mainThreadMs": 2.17,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 0.28,
+ "avgMs": 0.01,
+ "p50Ms": 0.008,
+ "p95Ms": 0.03,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.28,
+ "items": 28000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.05,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 109
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.39,
+ "avgMs": 0.014,
+ "p50Ms": 0.011,
+ "p95Ms": 0.034,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.39,
+ "items": 48
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 0.93,
+ "avgMs": 0.033,
+ "p50Ms": 0.032,
+ "p95Ms": 0.055,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 109
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 0.92,
+ "avgMs": 0.033,
+ "p50Ms": 0.001,
+ "p95Ms": 0.228,
+ "maxMs": 0.404,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.8,
+ "afterLoadMB": 180.4,
+ "afterInteractionMB": 264.3,
+ "afterCleanupMB": 192.9,
+ "peakMB": 264.3,
+ "loadDeltaMB": -10.4,
+ "interactionDeltaMB": 83.9,
+ "retainedAfterCleanupMB": 2.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.8,
+ "residentMB": 392.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 197212,
+ "mallocMB": 97.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 180.4,
+ "residentMB": 356.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 267099,
+ "mallocMB": 116
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 264.3,
+ "residentMB": 382.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 357314,
+ "mallocMB": 137
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.9,
+ "residentMB": 373.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 202173,
+ "mallocMB": 98.7
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 171744,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 90215,
+ "mallocBytesDelta": 22056112
+ }
+ },
+ "cpu": {
+ "processCpuMs": 938,
+ "wallMs": 2935,
+ "percent": 32,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-50k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-50k.json
new file mode 100644
index 0000000..ba80b52
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-50k.json
@@ -0,0 +1,514 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-50k",
+ "name": "50k markers",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 50000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:08:17.208Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3747,
+ "load": {
+ "commitMs": 41.86,
+ "readyMs": 117,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 308,
+ "mainThreadMs": 16.56,
+ "backgroundMs": 23.66,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 6.25,
+ "avgMs": 2.084,
+ "p50Ms": 2.628,
+ "p95Ms": 3.622,
+ "maxMs": 3.622,
+ "mainThreadMs": 6.25,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 2.67,
+ "avgMs": 1.336,
+ "p50Ms": 0.002,
+ "p95Ms": 2.67,
+ "maxMs": 2.67,
+ "mainThreadMs": 2.67,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 23.36,
+ "avgMs": 7.787,
+ "p50Ms": 7.469,
+ "p95Ms": 8.919,
+ "maxMs": 8.919,
+ "mainThreadMs": 0,
+ "backgroundMs": 23.36,
+ "items": 150000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.043,
+ "p50Ms": 0.043,
+ "p95Ms": 0.043,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.033,
+ "p50Ms": 0.033,
+ "p95Ms": 0.033,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 413
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.066,
+ "p50Ms": 0.066,
+ "p95Ms": 0.066,
+ "maxMs": 0.066,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 287
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.152,
+ "p50Ms": 0.152,
+ "p95Ms": 0.152,
+ "maxMs": 0.152,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 413
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.322,
+ "p50Ms": 0.322,
+ "p95Ms": 0.322,
+ "maxMs": 0.322,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 287
+ },
+ "annotation.viewFor": {
+ "count": 287,
+ "totalMs": 7.29,
+ "avgMs": 0.025,
+ "p50Ms": 0.008,
+ "p95Ms": 0.011,
+ "maxMs": 4.679,
+ "mainThreadMs": 7.29,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 287
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.004350875999999999,
+ "allocatedBytes": 21621520,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 165,
+ "durationMs": 2932.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 56.6,
+ "p50": 60,
+ "p95": 50,
+ "p99": 50,
+ "worstWindow": 50,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.68,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 52.15,
+ "worst": 101.39,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 160,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0242,
+ "droppedFrames": 10,
+ "longFrames": 2,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 177,
+ "p50": 0,
+ "p95": 0.47,
+ "p99": 0.58,
+ "max": 0.65
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.13,
+ "max": 17.31
+ },
+ "lateFrames": 0,
+ "busyMs": 22,
+ "busyRatio": 0.0075,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2933.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 231,
+ "mainThreadMs": 13.77,
+ "backgroundMs": 10.02,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.08,
+ "avgMs": 0.52,
+ "p50Ms": 0.518,
+ "p95Ms": 0.548,
+ "maxMs": 0.548,
+ "mainThreadMs": 2.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 3.25,
+ "avgMs": 0.116,
+ "p50Ms": 0.04,
+ "p95Ms": 0.628,
+ "maxMs": 1.283,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.25,
+ "items": 1400000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.65,
+ "avgMs": 0.023,
+ "p50Ms": 0.014,
+ "p95Ms": 0.073,
+ "maxMs": 0.197,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.65,
+ "items": 5274
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.91,
+ "avgMs": 0.033,
+ "p50Ms": 0.022,
+ "p95Ms": 0.081,
+ "maxMs": 0.181,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.91,
+ "items": 1518
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 5.21,
+ "avgMs": 0.186,
+ "p50Ms": 0.092,
+ "p95Ms": 0.696,
+ "maxMs": 1.45,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.21,
+ "items": 5274
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 10.62,
+ "avgMs": 0.379,
+ "p50Ms": 0.34,
+ "p95Ms": 1.007,
+ "maxMs": 1.139,
+ "mainThreadMs": 10.62,
+ "backgroundMs": 0,
+ "items": 398
+ },
+ "annotation.viewFor": {
+ "count": 72,
+ "totalMs": 1.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.008,
+ "p95Ms": 0.048,
+ "maxMs": 0.049,
+ "mainThreadMs": 1.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 15,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 72
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 201.5,
+ "afterLoadMB": 260.5,
+ "afterInteractionMB": 355.3,
+ "afterCleanupMB": 240,
+ "peakMB": 355.3,
+ "loadDeltaMB": 59,
+ "interactionDeltaMB": 94.8,
+ "retainedAfterCleanupMB": 38.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 201.5,
+ "residentMB": 418.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 207255,
+ "mallocMB": 104.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 260.5,
+ "residentMB": 391.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 316057,
+ "mallocMB": 175.5
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 355.3,
+ "residentMB": 360.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 393235,
+ "mallocMB": 209.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 240,
+ "residentMB": 381.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 207613,
+ "mallocMB": 130.6
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 171496,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 77178,
+ "mallocBytesDelta": 35820272
+ }
+ },
+ "cpu": {
+ "processCpuMs": 841,
+ "wallMs": 2947,
+ "percent": 28.5,
+ "threadsBefore": 24,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-children-1k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-children-1k.json
new file mode 100644
index 0000000..a39b889
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/markers-children-1k.json
@@ -0,0 +1,569 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-children-1k",
+ "name": "1k children",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 1000 markers as children (collected from React children on every render), then a short pan.",
+ "recordedAt": "2026-09-10T14:08:23.441Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3746,
+ "load": {
+ "commitMs": 4.36,
+ "readyMs": 60,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 4.64,
+ "backgroundMs": 0.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.12,
+ "avgMs": 0.041,
+ "p50Ms": 0.053,
+ "p95Ms": 0.071,
+ "maxMs": 0.071,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.032,
+ "p50Ms": 0.003,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.41,
+ "avgMs": 0.138,
+ "p50Ms": 0.125,
+ "p95Ms": 0.173,
+ "maxMs": 0.173,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 4.4,
+ "avgMs": 1.1,
+ "p50Ms": 0.017,
+ "p95Ms": 4.347,
+ "maxMs": 4.347,
+ "mainThreadMs": 4.4,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1439224,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 172,
+ "durationMs": 2930.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59,
+ "p50": 60,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.96,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 46.9,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 169,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0116,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.67,
+ "max": 0.82
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.19,
+ "max": 17.49
+ },
+ "lateFrames": 0,
+ "busyMs": 23.7,
+ "busyRatio": 0.0081,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931.8,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 151,
+ "mainThreadMs": 3.35,
+ "backgroundMs": 1.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.112,
+ "p50Ms": 0.112,
+ "p95Ms": 0.112,
+ "maxMs": 0.112,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.91,
+ "avgMs": 0.477,
+ "p50Ms": 0.435,
+ "p95Ms": 0.71,
+ "maxMs": 0.71,
+ "mainThreadMs": 1.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 0.33,
+ "avgMs": 0.012,
+ "p50Ms": 0.007,
+ "p95Ms": 0.039,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.33,
+ "items": 28000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.06,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 109
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.36,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.024,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 48
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 0.96,
+ "avgMs": 0.034,
+ "p50Ms": 0.027,
+ "p95Ms": 0.068,
+ "maxMs": 0.072,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 109
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 1.14,
+ "avgMs": 0.041,
+ "p50Ms": 0.001,
+ "p95Ms": 0.341,
+ "maxMs": 0.442,
+ "mainThreadMs": 1.14,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 240.5,
+ "afterLoadMB": 233.9,
+ "afterInteractionMB": 312.8,
+ "afterCleanupMB": 241.7,
+ "peakMB": 312.8,
+ "loadDeltaMB": -6.6,
+ "interactionDeltaMB": 78.9,
+ "retainedAfterCleanupMB": 1.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 240.5,
+ "residentMB": 381.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 208202,
+ "mallocMB": 130.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 233.9,
+ "residentMB": 366.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 278520,
+ "mallocMB": 152.3
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 312.8,
+ "residentMB": 362.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 367365,
+ "mallocMB": 170.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 241.7,
+ "residentMB": 334.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 212249,
+ "mallocMB": 131.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 149376,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 88845,
+ "mallocBytesDelta": 18955408
+ }
+ },
+ "cpu": {
+ "processCpuMs": 943,
+ "wallMs": 2939,
+ "percent": 32.1,
+ "threadsBefore": 21,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 1,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-10k.json
new file mode 100644
index 0000000..2b2a1b0
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-10k.json
@@ -0,0 +1,5910 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-10k",
+ "name": "Marker update cost at 10k",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "With 10000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:10:37.794Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 19684,
+ "load": {
+ "commitMs": 9.95,
+ "readyMs": 101,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.64,
+ "backgroundMs": 4.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.45,
+ "avgMs": 0.483,
+ "p50Ms": 0.685,
+ "p95Ms": 0.765,
+ "maxMs": 0.765,
+ "mainThreadMs": 1.45,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.71,
+ "avgMs": 0.355,
+ "p50Ms": 0.004,
+ "p95Ms": 0.707,
+ "maxMs": 0.707,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.14,
+ "avgMs": 1.381,
+ "p50Ms": 1.421,
+ "p95Ms": 1.557,
+ "maxMs": 1.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.14,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.089,
+ "p50Ms": 0.089,
+ "p95Ms": 0.089,
+ "maxMs": 0.089,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.37,
+ "avgMs": 0.088,
+ "p50Ms": 0.01,
+ "p95Ms": 0.016,
+ "maxMs": 4.714,
+ "mainThreadMs": 5.37,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.000914666999999994,
+ "allocatedBytes": 4453040,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 1129,
+ "durationMs": 18862.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.7,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 43.51,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1127,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0009,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 1130,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 1.74,
+ "max": 23.05
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.19,
+ "max": 39.72
+ },
+ "lateFrames": 2,
+ "busyMs": 225.3,
+ "busyRatio": 0.0119,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 18863.6,
+ "commits": {
+ "count": 40,
+ "totalMs": 519.72,
+ "avgMs": 12.993,
+ "p95Ms": 18.481,
+ "maxMs": 20.889
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 1.446,
+ "maxMs": 3.172
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 2.049,
+ "maxMs": 4.524
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 324,
+ "mainThreadMs": 114.56,
+ "backgroundMs": 64.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 40,
+ "totalMs": 27.39,
+ "avgMs": 0.685,
+ "p50Ms": 0.617,
+ "p95Ms": 0.981,
+ "maxMs": 1.188,
+ "mainThreadMs": 27.39,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.set": {
+ "count": 40,
+ "totalMs": 81.98,
+ "avgMs": 2.049,
+ "p50Ms": 1.708,
+ "p95Ms": 3.409,
+ "maxMs": 4.524,
+ "mainThreadMs": 81.98,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 60.23,
+ "avgMs": 1.506,
+ "p50Ms": 1.383,
+ "p95Ms": 2.24,
+ "maxMs": 2.919,
+ "mainThreadMs": 0,
+ "backgroundMs": 60.23,
+ "items": 400025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 0.71,
+ "avgMs": 0.018,
+ "p50Ms": 0.016,
+ "p95Ms": 0.028,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.71,
+ "items": 400025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.63,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.024,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.63,
+ "items": 3254
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 0.84,
+ "avgMs": 0.021,
+ "p50Ms": 0.02,
+ "p95Ms": 0.029,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.84,
+ "items": 2365
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 2.49,
+ "avgMs": 0.062,
+ "p50Ms": 0.054,
+ "p95Ms": 0.09,
+ "maxMs": 0.14,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.49,
+ "items": 3254
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 5.05,
+ "avgMs": 0.126,
+ "p50Ms": 0.001,
+ "p95Ms": 0.642,
+ "maxMs": 1.067,
+ "mainThreadMs": 5.05,
+ "backgroundMs": 0,
+ "items": 337
+ },
+ "annotation.viewFor": {
+ "count": 2,
+ "totalMs": 0.14,
+ "avgMs": 0.07,
+ "p50Ms": 0.03,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 264.2,
+ "afterLoadMB": 231.7,
+ "afterInteractionMB": 253.1,
+ "afterCleanupMB": 194.2,
+ "peakMB": 264.2,
+ "loadDeltaMB": -32.5,
+ "interactionDeltaMB": 21.4,
+ "retainedAfterCleanupMB": -70,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 264.2,
+ "residentMB": 416.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 244832,
+ "mallocMB": 121.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 231.7,
+ "residentMB": 421.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 320356,
+ "mallocMB": 136.5
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 253.1,
+ "residentMB": 364.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 314935,
+ "mallocMB": 146.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 194.2,
+ "residentMB": 376.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 114910,
+ "mallocMB": 101.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 85688600,
+ "gcCount": 23,
+ "gcTimeMs": 0.031532832,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -5421,
+ "mallocBytesDelta": 10619456
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1405,
+ "wallMs": 18867,
+ "percent": 7.4,
+ "threadsBefore": 23,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 41,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 410025,
+ "coordinates": 410025,
+ "estimatedBytes": 29361098
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717190
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 462.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.62,
+ "avgMs": 9.619,
+ "p95Ms": 9.619,
+ "maxMs": 9.619
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.132,
+ "maxMs": 1.132
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.634,
+ "maxMs": 1.634
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.51,
+ "backgroundMs": 1.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.617,
+ "p50Ms": 0.617,
+ "p95Ms": 0.617,
+ "maxMs": 0.617,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.63,
+ "avgMs": 1.634,
+ "p50Ms": 1.634,
+ "p95Ms": 1.634,
+ "maxMs": 1.634,
+ "mainThreadMs": 1.63,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.291,
+ "p50Ms": 1.291,
+ "p95Ms": 1.291,
+ "maxMs": 1.291,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.29,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2029760,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 1
+ },
+ "wallMs": 483.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.7,
+ "avgMs": 19.703,
+ "p95Ms": 19.703,
+ "maxMs": 19.703
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.033,
+ "maxMs": 2.033
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.127,
+ "maxMs": 2.127
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.09,
+ "backgroundMs": 2.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.962,
+ "p50Ms": 0.962,
+ "p95Ms": 0.962,
+ "maxMs": 0.962,
+ "mainThreadMs": 0.96,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.13,
+ "avgMs": 2.127,
+ "p50Ms": 2.127,
+ "p95Ms": 2.127,
+ "maxMs": 2.127,
+ "mainThreadMs": 2.13,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.96,
+ "avgMs": 1.963,
+ "p50Ms": 1.963,
+ "p95Ms": 1.963,
+ "maxMs": 1.963,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.96,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.088,
+ "p50Ms": 0.088,
+ "p95Ms": 0.088,
+ "maxMs": 0.088,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002094041000000005,
+ "allocatedBytes": 2027608,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 2
+ },
+ "wallMs": 465.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.68,
+ "avgMs": 13.678,
+ "p95Ms": 13.678,
+ "maxMs": 13.678
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.203,
+ "maxMs": 1.203
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.601,
+ "maxMs": 1.601
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.27,
+ "backgroundMs": 1.85,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.664,
+ "p50Ms": 0.664,
+ "p95Ms": 0.664,
+ "maxMs": 0.664,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.6,
+ "avgMs": 1.601,
+ "p50Ms": 1.601,
+ "p95Ms": 1.601,
+ "maxMs": 1.601,
+ "mainThreadMs": 1.6,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.72,
+ "avgMs": 1.721,
+ "p50Ms": 1.721,
+ "p95Ms": 1.721,
+ "maxMs": 1.721,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.72,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2028672,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 3
+ },
+ "wallMs": 466.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.16,
+ "avgMs": 11.165,
+ "p95Ms": 11.165,
+ "maxMs": 11.165
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.045,
+ "maxMs": 1.045
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.255,
+ "maxMs": 1.255
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.78,
+ "backgroundMs": 1.85,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.521,
+ "p50Ms": 0.521,
+ "p95Ms": 0.521,
+ "maxMs": 0.521,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.255,
+ "p50Ms": 1.255,
+ "p95Ms": 1.255,
+ "maxMs": 1.255,
+ "mainThreadMs": 1.25,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.72,
+ "avgMs": 1.721,
+ "p50Ms": 1.721,
+ "p95Ms": 1.721,
+ "maxMs": 1.721,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.72,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0008113329999999974,
+ "allocatedBytes": 2026168,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 4
+ },
+ "wallMs": 465.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.31,
+ "avgMs": 12.307,
+ "p95Ms": 12.307,
+ "maxMs": 12.307
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.124,
+ "maxMs": 1.124
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.58,
+ "maxMs": 1.58
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.29,
+ "backgroundMs": 1.59,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.71,
+ "avgMs": 0.712,
+ "p50Ms": 0.712,
+ "p95Ms": 0.712,
+ "maxMs": 0.712,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.58,
+ "p50Ms": 1.58,
+ "p95Ms": 1.58,
+ "maxMs": 1.58,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.5,
+ "avgMs": 1.5,
+ "p50Ms": 1.5,
+ "p95Ms": 1.5,
+ "maxMs": 1.5,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.5,
+ "items": 10005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.047,
+ "p50Ms": 0.047,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2031296,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10005,
+ "repeat": 0
+ },
+ "wallMs": 466.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.21,
+ "avgMs": 12.214,
+ "p95Ms": 12.214,
+ "maxMs": 12.214
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.199,
+ "maxMs": 1.199
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.636,
+ "maxMs": 1.636
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.21,
+ "backgroundMs": 2.55,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.577,
+ "p50Ms": 0.577,
+ "p95Ms": 0.577,
+ "maxMs": 0.577,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.64,
+ "avgMs": 1.636,
+ "p50Ms": 1.636,
+ "p95Ms": 1.636,
+ "maxMs": 1.636,
+ "mainThreadMs": 1.64,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.45,
+ "avgMs": 2.449,
+ "p50Ms": 2.449,
+ "p95Ms": 2.449,
+ "maxMs": 2.449,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.45,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007101669999999977,
+ "allocatedBytes": 1843288,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 1
+ },
+ "wallMs": 465.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.32,
+ "avgMs": 13.321,
+ "p95Ms": 13.321,
+ "maxMs": 13.321
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.523,
+ "maxMs": 1.523
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.793,
+ "maxMs": 1.793
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.41,
+ "backgroundMs": 1.56,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.616,
+ "p50Ms": 0.616,
+ "p95Ms": 0.616,
+ "maxMs": 0.616,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.79,
+ "avgMs": 1.793,
+ "p50Ms": 1.793,
+ "p95Ms": 1.793,
+ "maxMs": 1.793,
+ "mainThreadMs": 1.79,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.46,
+ "avgMs": 1.462,
+ "p50Ms": 1.462,
+ "p95Ms": 1.462,
+ "maxMs": 1.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.46,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842928,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 2
+ },
+ "wallMs": 466.77,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.75,
+ "avgMs": 11.749,
+ "p95Ms": 11.749,
+ "maxMs": 11.749
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.113,
+ "maxMs": 1.113
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.662,
+ "maxMs": 1.662
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.22,
+ "backgroundMs": 2.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.553,
+ "p50Ms": 0.553,
+ "p95Ms": 0.553,
+ "maxMs": 0.553,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.66,
+ "avgMs": 1.662,
+ "p50Ms": 1.662,
+ "p95Ms": 1.662,
+ "maxMs": 1.662,
+ "mainThreadMs": 1.66,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.04,
+ "avgMs": 2.038,
+ "p50Ms": 2.038,
+ "p95Ms": 2.038,
+ "maxMs": 2.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.04,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.076,
+ "p50Ms": 0.076,
+ "p95Ms": 0.076,
+ "maxMs": 0.076,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842752,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 3
+ },
+ "wallMs": 465.67,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.35,
+ "avgMs": 9.352,
+ "p95Ms": 9.352,
+ "maxMs": 9.352
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.219,
+ "maxMs": 1.219
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.227,
+ "maxMs": 1.227
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.78,
+ "backgroundMs": 1.04,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.551,
+ "p50Ms": 0.551,
+ "p95Ms": 0.551,
+ "maxMs": 0.551,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.23,
+ "avgMs": 1.227,
+ "p50Ms": 1.227,
+ "p95Ms": 1.227,
+ "maxMs": 1.227,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.962,
+ "p50Ms": 0.962,
+ "p95Ms": 0.962,
+ "maxMs": 0.962,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005327291999999997,
+ "allocatedBytes": 1844728,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 4
+ },
+ "wallMs": 466.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.22,
+ "avgMs": 12.215,
+ "p95Ms": 12.215,
+ "maxMs": 12.215
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.063,
+ "maxMs": 1.063
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.458,
+ "maxMs": 1.458
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.97,
+ "backgroundMs": 1.08,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.515,
+ "p50Ms": 0.515,
+ "p95Ms": 0.515,
+ "maxMs": 0.515,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.46,
+ "avgMs": 1.458,
+ "p50Ms": 1.458,
+ "p95Ms": 1.458,
+ "maxMs": 1.458,
+ "mainThreadMs": 1.46,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.984,
+ "p50Ms": 0.984,
+ "p95Ms": 0.984,
+ "maxMs": 0.984,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.98,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1850552,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.12,
+ "avgMs": 12.123,
+ "p95Ms": 12.123,
+ "maxMs": 12.123
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.319,
+ "maxMs": 1.319
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.532,
+ "maxMs": 1.532
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.05,
+ "backgroundMs": 1.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.513,
+ "p50Ms": 0.513,
+ "p95Ms": 0.513,
+ "maxMs": 0.513,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.53,
+ "avgMs": 1.532,
+ "p50Ms": 1.532,
+ "p95Ms": 1.532,
+ "maxMs": 1.532,
+ "mainThreadMs": 1.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.03,
+ "p50Ms": 1.03,
+ "p95Ms": 1.03,
+ "maxMs": 1.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.03,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0009347499999999981,
+ "allocatedBytes": 1842664,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 465.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.23,
+ "avgMs": 11.23,
+ "p95Ms": 11.23,
+ "maxMs": 11.23
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.453,
+ "maxMs": 1.453
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.708,
+ "maxMs": 1.708
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.42,
+ "backgroundMs": 1.96,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.71,
+ "avgMs": 0.714,
+ "p50Ms": 0.714,
+ "p95Ms": 0.714,
+ "maxMs": 0.714,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.71,
+ "avgMs": 1.708,
+ "p50Ms": 1.708,
+ "p95Ms": 1.708,
+ "maxMs": 1.708,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.87,
+ "avgMs": 1.868,
+ "p50Ms": 1.868,
+ "p95Ms": 1.868,
+ "maxMs": 1.868,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.87,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.048,
+ "p50Ms": 0.048,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 465.71,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.94,
+ "avgMs": 13.94,
+ "p95Ms": 13.94,
+ "maxMs": 13.94
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.478,
+ "maxMs": 1.478
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.068,
+ "maxMs": 2.068
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.8,
+ "backgroundMs": 1.31,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.73,
+ "avgMs": 0.732,
+ "p50Ms": 0.732,
+ "p95Ms": 0.732,
+ "maxMs": 0.732,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.07,
+ "avgMs": 2.068,
+ "p50Ms": 2.068,
+ "p95Ms": 2.068,
+ "maxMs": 2.068,
+ "mainThreadMs": 2.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.22,
+ "avgMs": 1.219,
+ "p50Ms": 1.219,
+ "p95Ms": 1.219,
+ "maxMs": 1.219,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.045,
+ "p50Ms": 0.045,
+ "p95Ms": 0.045,
+ "maxMs": 0.045,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007546670000000005,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 466.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.36,
+ "avgMs": 11.363,
+ "p95Ms": 11.363,
+ "maxMs": 11.363
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.179,
+ "maxMs": 1.179
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.485,
+ "maxMs": 1.485
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.01,
+ "backgroundMs": 2.05,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.525,
+ "p50Ms": 0.525,
+ "p95Ms": 0.525,
+ "maxMs": 0.525,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.485,
+ "p50Ms": 1.485,
+ "p95Ms": 1.485,
+ "maxMs": 1.485,
+ "mainThreadMs": 1.48,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.91,
+ "avgMs": 1.912,
+ "p50Ms": 1.912,
+ "p95Ms": 1.912,
+ "maxMs": 1.912,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.91,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.074,
+ "p50Ms": 0.074,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 465.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.42,
+ "avgMs": 12.422,
+ "p95Ms": 12.422,
+ "maxMs": 12.422
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.387,
+ "maxMs": 1.387
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.498,
+ "maxMs": 2.498
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.16,
+ "backgroundMs": 1.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.66,
+ "p50Ms": 0.66,
+ "p95Ms": 0.66,
+ "maxMs": 0.66,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.5,
+ "avgMs": 2.498,
+ "p50Ms": 2.498,
+ "p95Ms": 2.498,
+ "maxMs": 2.498,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.783,
+ "p50Ms": 1.783,
+ "p95Ms": 1.783,
+ "maxMs": 1.783,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.78,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001072500000000004,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 466.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.73,
+ "avgMs": 11.728,
+ "p95Ms": 11.728,
+ "maxMs": 11.728
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.675,
+ "maxMs": 1.675
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.124,
+ "maxMs": 2.124
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.82,
+ "backgroundMs": 2.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.696,
+ "p50Ms": 0.696,
+ "p95Ms": 0.696,
+ "maxMs": 0.696,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.12,
+ "avgMs": 2.124,
+ "p50Ms": 2.124,
+ "p95Ms": 2.124,
+ "maxMs": 2.124,
+ "mainThreadMs": 2.12,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.24,
+ "avgMs": 2.24,
+ "p50Ms": 2.24,
+ "p95Ms": 2.24,
+ "maxMs": 2.24,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.072,
+ "p50Ms": 0.072,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1844344,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 466.03,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.57,
+ "avgMs": 13.574,
+ "p95Ms": 13.574,
+ "maxMs": 13.574
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.434,
+ "maxMs": 1.434
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.821,
+ "maxMs": 3.821
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.42,
+ "backgroundMs": 1.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.6,
+ "avgMs": 0.602,
+ "p50Ms": 0.602,
+ "p95Ms": 0.602,
+ "maxMs": 0.602,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.82,
+ "avgMs": 3.821,
+ "p50Ms": 3.821,
+ "p95Ms": 3.821,
+ "maxMs": 3.821,
+ "mainThreadMs": 3.82,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.289,
+ "p50Ms": 1.289,
+ "p95Ms": 1.289,
+ "maxMs": 1.289,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.29,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007353330000000047,
+ "allocatedBytes": 1848752,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.96,
+ "avgMs": 11.959,
+ "p95Ms": 11.959,
+ "maxMs": 11.959
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.195,
+ "maxMs": 1.195
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.469,
+ "maxMs": 1.469
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.04,
+ "backgroundMs": 1.4,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.57,
+ "avgMs": 0.571,
+ "p50Ms": 0.571,
+ "p95Ms": 0.571,
+ "maxMs": 0.571,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.47,
+ "avgMs": 1.469,
+ "p50Ms": 1.469,
+ "p95Ms": 1.469,
+ "maxMs": 1.469,
+ "mainThreadMs": 1.47,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.28,
+ "avgMs": 1.283,
+ "p50Ms": 1.283,
+ "p95Ms": 1.283,
+ "maxMs": 1.283,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.28,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.064,
+ "p50Ms": 0.064,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1844344,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 465.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.28,
+ "avgMs": 15.282,
+ "p95Ms": 15.282,
+ "maxMs": 15.282
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.299,
+ "maxMs": 2.299
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 4.524,
+ "maxMs": 4.524
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 5.51,
+ "backgroundMs": 2.09,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.981,
+ "p50Ms": 0.981,
+ "p95Ms": 0.981,
+ "maxMs": 0.981,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 4.52,
+ "avgMs": 4.524,
+ "p50Ms": 4.524,
+ "p95Ms": 4.524,
+ "maxMs": 4.524,
+ "mainThreadMs": 4.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.84,
+ "avgMs": 1.84,
+ "p50Ms": 1.84,
+ "p95Ms": 1.84,
+ "maxMs": 1.84,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.84,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.14,
+ "p50Ms": 0.14,
+ "p95Ms": 0.14,
+ "maxMs": 0.14,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860744,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 466.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.45,
+ "avgMs": 14.446,
+ "p95Ms": 14.446,
+ "maxMs": 14.446
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.936,
+ "maxMs": 1.936
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.483,
+ "maxMs": 1.483
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.07,
+ "backgroundMs": 1.54,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.587,
+ "p50Ms": 0.587,
+ "p95Ms": 0.587,
+ "maxMs": 0.587,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.483,
+ "p50Ms": 1.483,
+ "p95Ms": 1.483,
+ "maxMs": 1.483,
+ "mainThreadMs": 1.48,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.45,
+ "avgMs": 1.447,
+ "p50Ms": 1.447,
+ "p95Ms": 1.447,
+ "maxMs": 1.447,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.45,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001155832999999995,
+ "allocatedBytes": 1844336,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 465.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.48,
+ "avgMs": 12.481,
+ "p95Ms": 12.481,
+ "maxMs": 12.481
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.197,
+ "maxMs": 1.197
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.409,
+ "maxMs": 3.409
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.95,
+ "backgroundMs": 1.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.54,
+ "avgMs": 0.535,
+ "p50Ms": 0.535,
+ "p95Ms": 0.535,
+ "maxMs": 0.535,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.41,
+ "avgMs": 3.409,
+ "p50Ms": 3.409,
+ "p95Ms": 3.409,
+ "maxMs": 3.409,
+ "mainThreadMs": 3.41,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.75,
+ "avgMs": 1.746,
+ "p50Ms": 1.746,
+ "p95Ms": 1.746,
+ "maxMs": 1.746,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.75,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860576,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.84,
+ "avgMs": 12.84,
+ "p95Ms": 12.84,
+ "maxMs": 12.84
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.176,
+ "maxMs": 1.176
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.347,
+ "maxMs": 2.347
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.01,
+ "backgroundMs": 1.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.658,
+ "p50Ms": 0.658,
+ "p95Ms": 0.658,
+ "maxMs": 0.658,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.35,
+ "avgMs": 2.347,
+ "p50Ms": 2.347,
+ "p95Ms": 2.347,
+ "maxMs": 2.347,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.161,
+ "p50Ms": 1.161,
+ "p95Ms": 1.161,
+ "maxMs": 1.161,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.16,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007536669999999995,
+ "allocatedBytes": 1860600,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 466.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.91,
+ "avgMs": 12.909,
+ "p95Ms": 12.909,
+ "maxMs": 12.909
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.487,
+ "maxMs": 1.487
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.528,
+ "maxMs": 1.528
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 1.11,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.75,
+ "avgMs": 0.75,
+ "p50Ms": 0.75,
+ "p95Ms": 0.75,
+ "maxMs": 0.75,
+ "mainThreadMs": 0.75,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.53,
+ "avgMs": 1.528,
+ "p50Ms": 1.528,
+ "p95Ms": 1.528,
+ "maxMs": 1.528,
+ "mainThreadMs": 1.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.033,
+ "p50Ms": 1.033,
+ "p95Ms": 1.033,
+ "maxMs": 1.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.03,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860536,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 482.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.48,
+ "avgMs": 18.481,
+ "p95Ms": 18.481,
+ "maxMs": 18.481
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.026,
+ "maxMs": 2.026
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.829,
+ "maxMs": 2.829
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.78,
+ "backgroundMs": 1.99,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.95,
+ "avgMs": 0.945,
+ "p50Ms": 0.945,
+ "p95Ms": 0.945,
+ "maxMs": 0.945,
+ "mainThreadMs": 0.95,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.83,
+ "avgMs": 2.829,
+ "p50Ms": 2.829,
+ "p95Ms": 2.829,
+ "maxMs": 2.829,
+ "mainThreadMs": 2.83,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.86,
+ "avgMs": 1.863,
+ "p50Ms": 1.863,
+ "p95Ms": 1.863,
+ "maxMs": 1.863,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.86,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007888340000000021,
+ "allocatedBytes": 1860800,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 482.43,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.47,
+ "avgMs": 17.474,
+ "p95Ms": 17.474,
+ "maxMs": 17.474
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.727,
+ "maxMs": 1.727
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.19,
+ "maxMs": 2.19
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.19,
+ "backgroundMs": 3.07,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1,
+ "avgMs": 1.002,
+ "p50Ms": 1.002,
+ "p95Ms": 1.002,
+ "maxMs": 1.002,
+ "mainThreadMs": 1,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.19,
+ "avgMs": 2.19,
+ "p50Ms": 2.19,
+ "p95Ms": 2.19,
+ "maxMs": 2.19,
+ "mainThreadMs": 2.19,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.92,
+ "avgMs": 2.919,
+ "p50Ms": 2.919,
+ "p95Ms": 2.919,
+ "maxMs": 2.919,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.92,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860752,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 482.65,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.05,
+ "avgMs": 18.05,
+ "p95Ms": 18.05,
+ "maxMs": 18.05
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.637,
+ "maxMs": 1.637
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.386,
+ "maxMs": 2.386
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.64,
+ "backgroundMs": 1.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.19,
+ "avgMs": 1.188,
+ "p50Ms": 1.188,
+ "p95Ms": 1.188,
+ "maxMs": 1.188,
+ "mainThreadMs": 1.19,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.39,
+ "avgMs": 2.386,
+ "p50Ms": 2.386,
+ "p95Ms": 2.386,
+ "maxMs": 2.386,
+ "mainThreadMs": 2.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.65,
+ "avgMs": 1.649,
+ "p50Ms": 1.649,
+ "p95Ms": 1.649,
+ "maxMs": 1.649,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.65,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.09,
+ "p50Ms": 0.09,
+ "p95Ms": 0.09,
+ "maxMs": 0.09,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.067,
+ "p50Ms": 1.067,
+ "p95Ms": 1.067,
+ "maxMs": 1.067,
+ "mainThreadMs": 1.07,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013412079999999965,
+ "allocatedBytes": 1861200,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 482.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.57,
+ "avgMs": 16.566,
+ "p95Ms": 16.566,
+ "maxMs": 16.566
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.03,
+ "maxMs": 2.03
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.628,
+ "maxMs": 2.628
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.77,
+ "backgroundMs": 2.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.981,
+ "p50Ms": 0.981,
+ "p95Ms": 0.981,
+ "maxMs": 0.981,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.63,
+ "avgMs": 2.628,
+ "p50Ms": 2.628,
+ "p95Ms": 2.628,
+ "maxMs": 2.628,
+ "mainThreadMs": 2.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.88,
+ "avgMs": 1.876,
+ "p50Ms": 1.876,
+ "p95Ms": 1.876,
+ "maxMs": 1.876,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.88,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.163,
+ "p50Ms": 0.163,
+ "p95Ms": 0.163,
+ "maxMs": 0.163,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1861200,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 465.43,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.7,
+ "avgMs": 13.701,
+ "p95Ms": 13.701,
+ "maxMs": 13.701
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.545,
+ "maxMs": 1.545
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.878,
+ "maxMs": 1.878
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 1.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.883,
+ "p50Ms": 0.883,
+ "p95Ms": 0.883,
+ "maxMs": 0.883,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.88,
+ "avgMs": 1.878,
+ "p50Ms": 1.878,
+ "p95Ms": 1.878,
+ "maxMs": 1.878,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.289,
+ "p50Ms": 1.289,
+ "p95Ms": 1.289,
+ "maxMs": 1.289,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.29,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0009915000000000063,
+ "allocatedBytes": 1860976,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 466.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.12,
+ "avgMs": 14.124,
+ "p95Ms": 14.124,
+ "maxMs": 14.124
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.172,
+ "maxMs": 3.172
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.876,
+ "maxMs": 2.876
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.53,
+ "backgroundMs": 1.37,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.657,
+ "p50Ms": 0.657,
+ "p95Ms": 0.657,
+ "maxMs": 0.657,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.88,
+ "avgMs": 2.876,
+ "p50Ms": 2.876,
+ "p95Ms": 2.876,
+ "maxMs": 2.876,
+ "mainThreadMs": 2.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.254,
+ "p50Ms": 1.254,
+ "p95Ms": 1.254,
+ "maxMs": 1.254,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.25,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860984,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 465.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.49,
+ "avgMs": 11.489,
+ "p95Ms": 11.489,
+ "maxMs": 11.489
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.015,
+ "maxMs": 1.015
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.707,
+ "maxMs": 1.707
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.32,
+ "backgroundMs": 1.27,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.519,
+ "p50Ms": 0.519,
+ "p95Ms": 0.519,
+ "maxMs": 0.519,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.71,
+ "avgMs": 1.707,
+ "p50Ms": 1.707,
+ "p95Ms": 1.707,
+ "maxMs": 1.707,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.17,
+ "avgMs": 1.169,
+ "p50Ms": 1.169,
+ "p95Ms": 1.169,
+ "maxMs": 1.169,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.17,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860992,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 464.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.04,
+ "avgMs": 10.043,
+ "p95Ms": 10.043,
+ "maxMs": 10.043
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.04,
+ "maxMs": 1.04
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.208,
+ "maxMs": 1.208
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 1.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.507,
+ "p50Ms": 0.507,
+ "p95Ms": 0.507,
+ "maxMs": 0.507,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.208,
+ "p50Ms": 1.208,
+ "p95Ms": 1.208,
+ "maxMs": 1.208,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.93,
+ "avgMs": 0.925,
+ "p50Ms": 0.925,
+ "p95Ms": 0.925,
+ "maxMs": 0.925,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.129,
+ "p50Ms": 0.129,
+ "p95Ms": 0.129,
+ "maxMs": 0.129,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2019384,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 465.68,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.57,
+ "avgMs": 10.566,
+ "p95Ms": 10.566,
+ "maxMs": 10.566
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.7,
+ "maxMs": 1.7
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.386,
+ "maxMs": 3.386
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.08,
+ "backgroundMs": 1.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.56,
+ "p50Ms": 0.56,
+ "p95Ms": 0.56,
+ "maxMs": 0.56,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.39,
+ "avgMs": 3.386,
+ "p50Ms": 3.386,
+ "p95Ms": 3.386,
+ "maxMs": 3.386,
+ "mainThreadMs": 3.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.05,
+ "avgMs": 1.05,
+ "p50Ms": 1.05,
+ "p95Ms": 1.05,
+ "maxMs": 1.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.05,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.139,
+ "p50Ms": 0.139,
+ "p95Ms": 0.139,
+ "maxMs": 0.139,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00024620799999999776,
+ "allocatedBytes": 2019392,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 466.77,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.77,
+ "avgMs": 10.765,
+ "p95Ms": 10.765,
+ "maxMs": 10.765
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.094,
+ "maxMs": 1.094
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.831,
+ "maxMs": 1.831
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.47,
+ "backgroundMs": 1.06,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.512,
+ "p50Ms": 0.512,
+ "p95Ms": 0.512,
+ "maxMs": 0.512,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.83,
+ "avgMs": 1.831,
+ "p50Ms": 1.831,
+ "p95Ms": 1.831,
+ "maxMs": 1.831,
+ "mainThreadMs": 1.83,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.967,
+ "p50Ms": 0.967,
+ "p95Ms": 0.967,
+ "maxMs": 0.967,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.97,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2028152,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 482.11,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.24,
+ "avgMs": 17.237,
+ "p95Ms": 17.237,
+ "maxMs": 17.237
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.011,
+ "maxMs": 2.011
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.159,
+ "maxMs": 2.159
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 10,
+ "mainThreadMs": 3.54,
+ "backgroundMs": 1.96,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.96,
+ "p50Ms": 0.96,
+ "p95Ms": 0.96,
+ "maxMs": 0.96,
+ "mainThreadMs": 0.96,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.16,
+ "avgMs": 2.159,
+ "p50Ms": 2.159,
+ "p95Ms": 2.159,
+ "maxMs": 2.159,
+ "mainThreadMs": 2.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.8,
+ "avgMs": 1.8,
+ "p50Ms": 1.8,
+ "p95Ms": 1.8,
+ "maxMs": 1.8,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.8,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.308,
+ "p50Ms": 0.308,
+ "p95Ms": 0.308,
+ "maxMs": 0.308,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.111,
+ "p50Ms": 0.111,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0006006659999999997,
+ "allocatedBytes": 2023296,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 466.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.99,
+ "avgMs": 11.991,
+ "p95Ms": 11.991,
+ "maxMs": 11.991
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.216,
+ "maxMs": 1.216
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.45,
+ "maxMs": 1.45
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.3,
+ "backgroundMs": 1.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.7,
+ "p50Ms": 0.7,
+ "p95Ms": 0.7,
+ "maxMs": 0.7,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.45,
+ "avgMs": 1.45,
+ "p50Ms": 1.45,
+ "p95Ms": 1.45,
+ "maxMs": 1.45,
+ "mainThreadMs": 1.45,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.38,
+ "avgMs": 1.383,
+ "p50Ms": 1.383,
+ "p95Ms": 1.383,
+ "maxMs": 1.383,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.38,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.151,
+ "p50Ms": 0.151,
+ "p95Ms": 0.151,
+ "maxMs": 0.151,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2019368,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 483.04,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.27,
+ "avgMs": 9.266,
+ "p95Ms": 9.266,
+ "maxMs": 9.266
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.197,
+ "maxMs": 1.197
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.339,
+ "maxMs": 1.339
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 1.37,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.588,
+ "p50Ms": 0.588,
+ "p95Ms": 0.588,
+ "maxMs": 0.588,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.339,
+ "p50Ms": 1.339,
+ "p95Ms": 1.339,
+ "maxMs": 1.339,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.241,
+ "p50Ms": 1.241,
+ "p95Ms": 1.241,
+ "maxMs": 1.241,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.65,
+ "p50Ms": 0.65,
+ "p95Ms": 0.65,
+ "maxMs": 0.65,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0011421669999999995,
+ "allocatedBytes": 3705360,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 483.14,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.62,
+ "avgMs": 10.622,
+ "p95Ms": 10.622,
+ "maxMs": 10.622
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.107,
+ "maxMs": 1.107
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.697,
+ "maxMs": 1.697
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 10,
+ "mainThreadMs": 2.8,
+ "backgroundMs": 1.23,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.614,
+ "p50Ms": 0.614,
+ "p95Ms": 0.614,
+ "maxMs": 0.614,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.7,
+ "avgMs": 1.697,
+ "p50Ms": 1.697,
+ "p95Ms": 1.697,
+ "maxMs": 1.697,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.1,
+ "avgMs": 1.101,
+ "p50Ms": 1.101,
+ "p95Ms": 1.101,
+ "maxMs": 1.101,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.1,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.46,
+ "avgMs": 0.458,
+ "p50Ms": 0.458,
+ "p95Ms": 0.458,
+ "maxMs": 0.458,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "items": 60
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001262750000000007,
+ "allocatedBytes": 3741792,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 498.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 20.89,
+ "avgMs": 20.889,
+ "p95Ms": 20.889,
+ "maxMs": 20.889
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.331,
+ "maxMs": 1.331
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.755,
+ "maxMs": 1.755
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.06,
+ "backgroundMs": 1.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.81,
+ "avgMs": 0.81,
+ "p50Ms": 0.81,
+ "p95Ms": 0.81,
+ "maxMs": 0.81,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.75,
+ "avgMs": 1.755,
+ "p50Ms": 1.755,
+ "p95Ms": 1.755,
+ "maxMs": 1.755,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.578,
+ "p50Ms": 1.578,
+ "p95Ms": 1.578,
+ "maxMs": 1.578,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 83
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.493,
+ "p50Ms": 0.493,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.007473124999999997,
+ "allocatedBytes": 3705256,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 483.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.28,
+ "avgMs": 8.282,
+ "p95Ms": 8.282,
+ "maxMs": 8.282
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.026,
+ "maxMs": 1.026
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.624,
+ "maxMs": 1.624
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 1.08,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.527,
+ "p50Ms": 0.527,
+ "p95Ms": 0.527,
+ "maxMs": 0.527,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.624,
+ "p50Ms": 1.624,
+ "p95Ms": 1.624,
+ "maxMs": 1.624,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.985,
+ "p50Ms": 0.985,
+ "p95Ms": 0.985,
+ "maxMs": 0.985,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.98,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.047,
+ "p50Ms": 0.047,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 83
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.351,
+ "p50Ms": 0.351,
+ "p95Ms": 0.351,
+ "maxMs": 0.351,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0006357909999999967,
+ "allocatedBytes": 3705464,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 483.07,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.55,
+ "avgMs": 8.551,
+ "p95Ms": 8.551,
+ "maxMs": 8.551
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.082,
+ "maxMs": 1.082
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.071,
+ "maxMs": 3.071
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.34,
+ "backgroundMs": 1.34,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.628,
+ "p50Ms": 0.628,
+ "p95Ms": 0.628,
+ "maxMs": 0.628,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.07,
+ "avgMs": 3.071,
+ "p50Ms": 3.071,
+ "p95Ms": 3.071,
+ "maxMs": 3.071,
+ "mainThreadMs": 3.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.239,
+ "p50Ms": 1.239,
+ "p95Ms": 1.239,
+ "maxMs": 1.239,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 84
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 84
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p50Ms": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0005789999999999962,
+ "allocatedBytes": 3705600,
+ "heapSizeAfterBytes": 33554432
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-1k-children.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-1k-children.json
new file mode 100644
index 0000000..15c387a
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-1k-children.json
@@ -0,0 +1,7240 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-1k-children",
+ "name": "Marker update cost at 1k (children)",
+ "group": "mutations",
+ "tags": [
+ "baseline"
+ ],
+ "description": "With 1000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:11:00.311Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 19491,
+ "load": {
+ "commitMs": 1.86,
+ "readyMs": 103,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 18.59,
+ "backgroundMs": 0.41,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.11,
+ "avgMs": 0.037,
+ "p50Ms": 0.053,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.031,
+ "p50Ms": 0.002,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.38,
+ "avgMs": 0.127,
+ "p50Ms": 0.132,
+ "p95Ms": 0.134,
+ "maxMs": 0.134,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 18.37,
+ "avgMs": 4.591,
+ "p50Ms": 0.015,
+ "p95Ms": 18.306,
+ "maxMs": 18.306,
+ "mainThreadMs": 18.37,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1448440,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 1114,
+ "durationMs": 18669.3,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.7,
+ "p50": 60,
+ "p95": 56,
+ "p99": 56,
+ "worstWindow": 56,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.76,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 84.25,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1111,
+ 0,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0027,
+ "droppedFrames": 6,
+ "longFrames": 1,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 1121,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.68,
+ "max": 0.9
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.2,
+ "max": 17.56
+ },
+ "lateFrames": 0,
+ "busyMs": 149,
+ "busyRatio": 0.008,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 18670.6,
+ "commits": {
+ "count": 40,
+ "totalMs": 190.32,
+ "avgMs": 4.758,
+ "p95Ms": 7.488,
+ "maxMs": 10.081
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 0.343,
+ "maxMs": 0.529
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 0.329,
+ "maxMs": 0.835
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 447,
+ "mainThreadMs": 21.94,
+ "backgroundMs": 9.33,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 41,
+ "totalMs": 4.18,
+ "avgMs": 0.102,
+ "p50Ms": 0.108,
+ "p95Ms": 0.134,
+ "maxMs": 0.141,
+ "mainThreadMs": 4.18,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "markers.set": {
+ "count": 41,
+ "totalMs": 13.28,
+ "avgMs": 0.324,
+ "p50Ms": 0.329,
+ "p95Ms": 0.479,
+ "maxMs": 0.835,
+ "mainThreadMs": 13.28,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "polylines.set": {
+ "count": 41,
+ "totalMs": 0.07,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 41,
+ "totalMs": 0.03,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.002,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 41,
+ "totalMs": 0.03,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 7.33,
+ "avgMs": 0.183,
+ "p50Ms": 0.178,
+ "p95Ms": 0.261,
+ "maxMs": 0.412,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.33,
+ "items": 40025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 0.38,
+ "avgMs": 0.01,
+ "p50Ms": 0.006,
+ "p95Ms": 0.012,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 40025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.09,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 280
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 0.42,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.016,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.42,
+ "items": 162
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 1.12,
+ "avgMs": 0.028,
+ "p50Ms": 0.023,
+ "p95Ms": 0.066,
+ "maxMs": 0.131,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.12,
+ "items": 280
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 4.16,
+ "avgMs": 0.104,
+ "p50Ms": 0.001,
+ "p95Ms": 0.21,
+ "maxMs": 2.3,
+ "mainThreadMs": 4.16,
+ "backgroundMs": 0,
+ "items": 29
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.197,
+ "p50Ms": 0.197,
+ "p95Ms": 0.197,
+ "maxMs": 0.197,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 195,
+ "afterLoadMB": 232.1,
+ "afterInteractionMB": 223.3,
+ "afterCleanupMB": 177.3,
+ "peakMB": 232.1,
+ "loadDeltaMB": 37.1,
+ "interactionDeltaMB": -8.8,
+ "retainedAfterCleanupMB": -17.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 195,
+ "residentMB": 369.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 115610,
+ "mallocMB": 102
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 232.1,
+ "residentMB": 365.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 270294,
+ "mallocMB": 136.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 223.3,
+ "residentMB": 331,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 268696,
+ "mallocMB": 120.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 177.3,
+ "residentMB": 348.7,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 117758,
+ "mallocMB": 89.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 49251528,
+ "gcCount": 13,
+ "gcTimeMs": 0.03445308300000002,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -1598,
+ "mallocBytesDelta": -16476592
+ }
+ },
+ "cpu": {
+ "processCpuMs": 760,
+ "wallMs": 18678,
+ "percent": 4.1,
+ "threadsBefore": 21,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 41,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 41025,
+ "coordinates": 41025,
+ "estimatedBytes": 2937158
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1005,
+ "coordinates": 1005,
+ "estimatedBytes": 71954
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 468.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.52,
+ "avgMs": 4.52,
+ "p95Ms": 4.52,
+ "maxMs": 4.52
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.277,
+ "maxMs": 0.277
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.316,
+ "maxMs": 0.316
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.116,
+ "p50Ms": 0.116,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.138,
+ "p50Ms": 0.138,
+ "p95Ms": 0.138,
+ "maxMs": 0.138,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016153750000000022,
+ "allocatedBytes": 1198600,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 1
+ },
+ "wallMs": 466.1,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.53,
+ "avgMs": 4.526,
+ "p95Ms": 4.526,
+ "maxMs": 4.526
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.406,
+ "maxMs": 0.406
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.327,
+ "maxMs": 0.327
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.327,
+ "p50Ms": 0.327,
+ "p95Ms": 0.327,
+ "maxMs": 0.327,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.186,
+ "p50Ms": 0.186,
+ "p95Ms": 0.186,
+ "maxMs": 0.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1198952,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 2
+ },
+ "wallMs": 466.25,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.91,
+ "avgMs": 4.905,
+ "p95Ms": 4.905,
+ "maxMs": 4.905
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.406,
+ "maxMs": 0.406
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.329,
+ "maxMs": 0.329
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0.27,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.126,
+ "p50Ms": 0.126,
+ "p95Ms": 0.126,
+ "maxMs": 0.126,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.329,
+ "p50Ms": 0.329,
+ "p95Ms": 0.329,
+ "maxMs": 0.329,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.216,
+ "p50Ms": 0.216,
+ "p95Ms": 0.216,
+ "maxMs": 0.216,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.033,
+ "p50Ms": 0.033,
+ "p95Ms": 0.033,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1201392,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 3
+ },
+ "wallMs": 465.54,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.29,
+ "avgMs": 7.287,
+ "p95Ms": 7.287,
+ "maxMs": 7.287
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.382,
+ "maxMs": 0.382
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.347,
+ "maxMs": 0.347
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.118,
+ "p50Ms": 0.118,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.347,
+ "p50Ms": 0.347,
+ "p95Ms": 0.347,
+ "maxMs": 0.347,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.208,
+ "p50Ms": 0.208,
+ "p95Ms": 0.208,
+ "maxMs": 0.208,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0026918749999999964,
+ "allocatedBytes": 1198968,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 4
+ },
+ "wallMs": 466.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.64,
+ "avgMs": 4.642,
+ "p95Ms": 4.642,
+ "maxMs": 4.642
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.529,
+ "maxMs": 0.529
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.493,
+ "maxMs": 0.493
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.106,
+ "p50Ms": 0.106,
+ "p95Ms": 0.106,
+ "maxMs": 0.106,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.493,
+ "p50Ms": 0.493,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.209,
+ "p50Ms": 0.209,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1204064,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1005,
+ "repeat": 0
+ },
+ "wallMs": 466.26,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.26,
+ "avgMs": 5.257,
+ "p95Ms": 5.257,
+ "maxMs": 5.257
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.38,
+ "maxMs": 0.38
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.341,
+ "maxMs": 0.341
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.12,
+ "p50Ms": 0.12,
+ "p95Ms": 0.12,
+ "maxMs": 0.12,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.341,
+ "p50Ms": 0.341,
+ "p95Ms": 0.341,
+ "maxMs": 0.341,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.21,
+ "p50Ms": 0.21,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1192176,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 1
+ },
+ "wallMs": 465.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.16,
+ "avgMs": 5.156,
+ "p95Ms": 5.156,
+ "maxMs": 5.156
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.285,
+ "maxMs": 0.285
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.373,
+ "maxMs": 0.373
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0.23,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.141,
+ "p50Ms": 0.141,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.373,
+ "p50Ms": 0.373,
+ "p95Ms": 0.373,
+ "maxMs": 0.373,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.187,
+ "p50Ms": 0.187,
+ "p95Ms": 0.187,
+ "maxMs": 0.187,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1188904,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 2
+ },
+ "wallMs": 465.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.94,
+ "avgMs": 5.937,
+ "p95Ms": 5.937,
+ "maxMs": 5.937
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.286,
+ "maxMs": 0.286
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.346,
+ "maxMs": 0.346
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.139,
+ "p50Ms": 0.139,
+ "p95Ms": 0.139,
+ "maxMs": 0.139,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.346,
+ "p50Ms": 0.346,
+ "p95Ms": 0.346,
+ "maxMs": 0.346,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.175,
+ "p50Ms": 0.175,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0018869579999999941,
+ "allocatedBytes": 1187632,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 3
+ },
+ "wallMs": 465.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.76,
+ "avgMs": 3.765,
+ "p95Ms": 3.765,
+ "maxMs": 3.765
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.275,
+ "maxMs": 0.275
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.306,
+ "maxMs": 0.306
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.119,
+ "p50Ms": 0.119,
+ "p95Ms": 0.119,
+ "maxMs": 0.119,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.306,
+ "p50Ms": 0.306,
+ "p95Ms": 0.306,
+ "maxMs": 0.306,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.194,
+ "p50Ms": 0.194,
+ "p95Ms": 0.194,
+ "maxMs": 0.194,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1186624,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 4
+ },
+ "wallMs": 465.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.16,
+ "avgMs": 4.156,
+ "p95Ms": 4.156,
+ "maxMs": 4.156
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.466,
+ "maxMs": 0.466
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.479,
+ "maxMs": 0.479
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0.37,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.107,
+ "p50Ms": 0.107,
+ "p95Ms": 0.107,
+ "maxMs": 0.107,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.479,
+ "p50Ms": 0.479,
+ "p95Ms": 0.479,
+ "maxMs": 0.479,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.303,
+ "p50Ms": 0.303,
+ "p95Ms": 0.303,
+ "maxMs": 0.303,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.034,
+ "p50Ms": 0.034,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1193520,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.08,
+ "avgMs": 10.081,
+ "p95Ms": 10.081,
+ "maxMs": 10.081
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.413,
+ "maxMs": 0.413
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.328,
+ "maxMs": 0.328
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.115,
+ "p50Ms": 0.115,
+ "p95Ms": 0.115,
+ "maxMs": 0.115,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.328,
+ "p50Ms": 0.328,
+ "p95Ms": 0.328,
+ "maxMs": 0.328,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.191,
+ "p50Ms": 0.191,
+ "p95Ms": 0.191,
+ "maxMs": 0.191,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002837791000000006,
+ "allocatedBytes": 1185552,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.57,
+ "avgMs": 2.575,
+ "p95Ms": 2.575,
+ "maxMs": 2.575
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.216,
+ "maxMs": 0.216
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.194,
+ "maxMs": 0.194
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0.15,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.073,
+ "p50Ms": 0.073,
+ "p95Ms": 0.073,
+ "maxMs": 0.073,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.194,
+ "p50Ms": 0.194,
+ "p95Ms": 0.194,
+ "maxMs": 0.194,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.121,
+ "p50Ms": 0.121,
+ "p95Ms": 0.121,
+ "maxMs": 0.121,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1189600,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 466.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.47,
+ "avgMs": 2.467,
+ "p95Ms": 2.467,
+ "maxMs": 2.467
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.453,
+ "maxMs": 0.453
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.272,
+ "maxMs": 0.272
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.076,
+ "p50Ms": 0.076,
+ "p95Ms": 0.076,
+ "maxMs": 0.076,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.272,
+ "p50Ms": 0.272,
+ "p95Ms": 0.272,
+ "maxMs": 0.272,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.148,
+ "p50Ms": 0.148,
+ "p95Ms": 0.148,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1185480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.19,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.11,
+ "avgMs": 4.108,
+ "p95Ms": 4.108,
+ "maxMs": 4.108
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.328,
+ "maxMs": 0.328
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.343,
+ "maxMs": 0.343
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.343,
+ "p50Ms": 0.343,
+ "p95Ms": 0.343,
+ "maxMs": 0.343,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.2,
+ "p50Ms": 0.2,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1185480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.49,
+ "avgMs": 7.488,
+ "p95Ms": 7.488,
+ "maxMs": 7.488
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.209,
+ "maxMs": 0.209
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.179,
+ "maxMs": 0.179
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0.12,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.179,
+ "p50Ms": 0.179,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004038957999999995,
+ "allocatedBytes": 1185480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.15,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.64,
+ "avgMs": 4.643,
+ "p95Ms": 4.643,
+ "maxMs": 4.643
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.315,
+ "maxMs": 0.315
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.3,
+ "maxMs": 0.3
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.3,
+ "p50Ms": 0.3,
+ "p95Ms": 0.3,
+ "maxMs": 0.3,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.178,
+ "p50Ms": 0.178,
+ "p95Ms": 0.178,
+ "maxMs": 0.178,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187240,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 466.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.4,
+ "avgMs": 2.398,
+ "p95Ms": 2.398,
+ "maxMs": 2.398
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.335,
+ "maxMs": 0.335
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.378,
+ "maxMs": 0.378
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.068,
+ "p50Ms": 0.068,
+ "p95Ms": 0.068,
+ "maxMs": 0.068,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.378,
+ "p50Ms": 0.378,
+ "p95Ms": 0.378,
+ "maxMs": 0.378,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.12,
+ "p50Ms": 0.12,
+ "p95Ms": 0.12,
+ "maxMs": 0.12,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187496,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.34,
+ "avgMs": 7.339,
+ "p95Ms": 7.339,
+ "maxMs": 7.339
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.301,
+ "maxMs": 0.301
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.198,
+ "maxMs": 0.198
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0.2,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.198,
+ "p50Ms": 0.198,
+ "p95Ms": 0.198,
+ "maxMs": 0.198,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.003089042000000014,
+ "allocatedBytes": 1187240,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.05,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.29,
+ "avgMs": 2.291,
+ "p95Ms": 2.291,
+ "maxMs": 2.291
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.222,
+ "maxMs": 0.222
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.22,
+ "maxMs": 0.22
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.22,
+ "p50Ms": 0.22,
+ "p95Ms": 0.22,
+ "maxMs": 0.22,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203640,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.48,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.27,
+ "avgMs": 5.271,
+ "p95Ms": 5.271,
+ "maxMs": 5.271
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.356,
+ "maxMs": 0.356
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.362,
+ "maxMs": 0.362
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.121,
+ "p50Ms": 0.121,
+ "p95Ms": 0.121,
+ "maxMs": 0.121,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.362,
+ "p50Ms": 0.362,
+ "p95Ms": 0.362,
+ "maxMs": 0.362,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.213,
+ "p50Ms": 0.213,
+ "p95Ms": 0.213,
+ "maxMs": 0.213,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187240,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.06,
+ "avgMs": 4.056,
+ "p95Ms": 4.056,
+ "maxMs": 4.056
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.379,
+ "maxMs": 0.379
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.835,
+ "maxMs": 0.835
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 3.25,
+ "backgroundMs": 0.32,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.117,
+ "p50Ms": 0.117,
+ "p95Ms": 0.117,
+ "maxMs": 0.117,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.84,
+ "avgMs": 0.835,
+ "p50Ms": 0.835,
+ "p95Ms": 0.835,
+ "maxMs": 0.835,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.261,
+ "p50Ms": 0.261,
+ "p95Ms": 0.261,
+ "maxMs": 0.261,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 2.3,
+ "avgMs": 2.3,
+ "p50Ms": 2.3,
+ "p95Ms": 2.3,
+ "maxMs": 2.3,
+ "mainThreadMs": 2.3,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.006312499999999999,
+ "allocatedBytes": 1203520,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.81,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.67,
+ "avgMs": 4.666,
+ "p95Ms": 4.666,
+ "maxMs": 4.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.393,
+ "maxMs": 0.393
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.188,
+ "maxMs": 0.188
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.188,
+ "p50Ms": 0.188,
+ "p95Ms": 0.188,
+ "maxMs": 0.188,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.087,
+ "p50Ms": 0.087,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203504,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.3,
+ "avgMs": 4.303,
+ "p95Ms": 4.303,
+ "maxMs": 4.303
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.366,
+ "maxMs": 0.366
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.36,
+ "maxMs": 0.36
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.25,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.134,
+ "p50Ms": 0.134,
+ "p95Ms": 0.134,
+ "maxMs": 0.134,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.36,
+ "p50Ms": 0.36,
+ "p95Ms": 0.36,
+ "maxMs": 0.36,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.198,
+ "p50Ms": 0.198,
+ "p95Ms": 0.198,
+ "maxMs": 0.198,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.088,
+ "p50Ms": 0.088,
+ "p95Ms": 0.088,
+ "maxMs": 0.088,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1211728,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.23,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.37,
+ "avgMs": 2.372,
+ "p95Ms": 2.372,
+ "maxMs": 2.372
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.221,
+ "maxMs": 0.221
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.25,
+ "maxMs": 0.25
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.25,
+ "p50Ms": 0.25,
+ "p95Ms": 0.25,
+ "maxMs": 0.25,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.11,
+ "p50Ms": 0.11,
+ "p95Ms": 0.11,
+ "maxMs": 0.11,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.09,
+ "p50Ms": 0.09,
+ "p95Ms": 0.09,
+ "maxMs": 0.09,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203512,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.21,
+ "avgMs": 6.215,
+ "p95Ms": 6.215,
+ "maxMs": 6.215
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.242,
+ "maxMs": 0.242
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.196,
+ "maxMs": 0.196
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.196,
+ "p50Ms": 0.196,
+ "p95Ms": 0.196,
+ "maxMs": 0.196,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.084,
+ "p50Ms": 0.084,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016822499999999962,
+ "allocatedBytes": 1203424,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 465.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.94,
+ "avgMs": 4.944,
+ "p95Ms": 4.944,
+ "maxMs": 4.944
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.34,
+ "maxMs": 0.34
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.377,
+ "maxMs": 0.377
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.126,
+ "p50Ms": 0.126,
+ "p95Ms": 0.126,
+ "maxMs": 0.126,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.377,
+ "p50Ms": 0.377,
+ "p95Ms": 0.377,
+ "maxMs": 0.377,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.168,
+ "p50Ms": 0.168,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187616,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 466.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.82,
+ "avgMs": 3.825,
+ "p95Ms": 3.825,
+ "maxMs": 3.825
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.238,
+ "maxMs": 0.238
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.214,
+ "maxMs": 0.214
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.214,
+ "p50Ms": 0.214,
+ "p95Ms": 0.214,
+ "maxMs": 0.214,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.126,
+ "p50Ms": 0.126,
+ "p95Ms": 0.126,
+ "maxMs": 0.126,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.4,
+ "avgMs": 6.398,
+ "p95Ms": 6.398,
+ "maxMs": 6.398
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.419,
+ "maxMs": 0.419
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.326,
+ "maxMs": 0.326
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.326,
+ "p50Ms": 0.326,
+ "p95Ms": 0.326,
+ "maxMs": 0.326,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.247,
+ "p50Ms": 0.247,
+ "p95Ms": 0.247,
+ "maxMs": 0.247,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0022477919999999985,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.68,
+ "avgMs": 4.683,
+ "p95Ms": 4.683,
+ "maxMs": 4.683
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.29,
+ "maxMs": 0.29
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.278,
+ "maxMs": 0.278
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.278,
+ "p50Ms": 0.278,
+ "p95Ms": 0.278,
+ "maxMs": 0.278,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.168,
+ "p50Ms": 0.168,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.02,
+ "avgMs": 4.018,
+ "p95Ms": 4.018,
+ "maxMs": 4.018
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.42,
+ "maxMs": 0.42
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.438,
+ "maxMs": 0.438
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0.55,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.122,
+ "p50Ms": 0.122,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.438,
+ "p50Ms": 0.438,
+ "p95Ms": 0.438,
+ "maxMs": 0.438,
+ "mainThreadMs": 0.44,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.412,
+ "p50Ms": 0.412,
+ "p95Ms": 0.412,
+ "maxMs": 0.412,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.086,
+ "p50Ms": 0.086,
+ "p95Ms": 0.086,
+ "maxMs": 0.086,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 465.92,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.19,
+ "avgMs": 4.193,
+ "p95Ms": 4.193,
+ "maxMs": 4.193
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.411,
+ "maxMs": 0.411
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.408,
+ "maxMs": 0.408
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.9,
+ "backgroundMs": 0.36,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.408,
+ "p50Ms": 0.408,
+ "p95Ms": 0.408,
+ "maxMs": 0.408,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.249,
+ "p50Ms": 0.249,
+ "p95Ms": 0.249,
+ "maxMs": 0.249,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.066,
+ "p50Ms": 0.066,
+ "p95Ms": 0.066,
+ "maxMs": 0.066,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.379,
+ "p50Ms": 0.379,
+ "p95Ms": 0.379,
+ "maxMs": 0.379,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1204368,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 466.28,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.88,
+ "avgMs": 7.884,
+ "p95Ms": 7.884,
+ "maxMs": 7.884
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.443,
+ "maxMs": 0.443
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.385,
+ "maxMs": 0.385
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0.45,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.121,
+ "p50Ms": 0.121,
+ "p95Ms": 0.121,
+ "maxMs": 0.121,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.385,
+ "p50Ms": 0.385,
+ "p95Ms": 0.385,
+ "maxMs": 0.385,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.2,
+ "p50Ms": 0.2,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.103,
+ "p50Ms": 0.103,
+ "p95Ms": 0.103,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0035079169999999993,
+ "allocatedBytes": 1204048,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.12,
+ "avgMs": 4.121,
+ "p95Ms": 4.121,
+ "maxMs": 4.121
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.346,
+ "maxMs": 0.346
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.352,
+ "maxMs": 0.352
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.104,
+ "p50Ms": 0.104,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.352,
+ "p50Ms": 0.352,
+ "p95Ms": 0.352,
+ "maxMs": 0.352,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.199,
+ "p50Ms": 0.199,
+ "p95Ms": 0.199,
+ "maxMs": 0.199,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.155,
+ "p50Ms": 0.155,
+ "p95Ms": 0.155,
+ "maxMs": 0.155,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1204584,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.32,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.05,
+ "avgMs": 2.052,
+ "p95Ms": 2.052,
+ "maxMs": 2.052
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.164,
+ "maxMs": 0.164
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.169,
+ "maxMs": 0.169
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.169,
+ "p50Ms": 0.169,
+ "p95Ms": 0.169,
+ "maxMs": 0.169,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203952,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 466.11,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.57,
+ "avgMs": 5.573,
+ "p95Ms": 5.573,
+ "maxMs": 5.573
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.342,
+ "maxMs": 0.342
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.369,
+ "maxMs": 0.369
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.104,
+ "p50Ms": 0.104,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.369,
+ "p50Ms": 0.369,
+ "p95Ms": 0.369,
+ "maxMs": 0.369,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.243,
+ "p50Ms": 0.243,
+ "p95Ms": 0.243,
+ "maxMs": 0.243,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0018465830000000127,
+ "allocatedBytes": 1203880,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.14,
+ "avgMs": 4.141,
+ "p95Ms": 4.141,
+ "maxMs": 4.141
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.49,
+ "maxMs": 0.49
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.352,
+ "maxMs": 0.352
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.132,
+ "p50Ms": 0.132,
+ "p95Ms": 0.132,
+ "maxMs": 0.132,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.352,
+ "p50Ms": 0.352,
+ "p95Ms": 0.352,
+ "maxMs": 0.352,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.175,
+ "p50Ms": 0.175,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.21,
+ "p50Ms": 0.21,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1362272,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.97,
+ "avgMs": 3.968,
+ "p95Ms": 3.968,
+ "maxMs": 3.968
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.403,
+ "maxMs": 0.403
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.332,
+ "maxMs": 0.332
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.332,
+ "p50Ms": 0.332,
+ "p95Ms": 0.332,
+ "maxMs": 0.332,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.167,
+ "p50Ms": 0.167,
+ "p95Ms": 0.167,
+ "maxMs": 0.167,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.195,
+ "p50Ms": 0.195,
+ "p95Ms": 0.195,
+ "maxMs": 0.195,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1395032,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 466.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.33,
+ "avgMs": 7.331,
+ "p95Ms": 7.331,
+ "maxMs": 7.331
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.348,
+ "maxMs": 0.348
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.247,
+ "maxMs": 0.247
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.5,
+ "backgroundMs": 0.18,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.08,
+ "p50Ms": 0.08,
+ "p95Ms": 0.08,
+ "maxMs": 0.08,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.247,
+ "p50Ms": 0.247,
+ "p95Ms": 0.247,
+ "maxMs": 0.247,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.141,
+ "p50Ms": 0.141,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0026960420000000096,
+ "allocatedBytes": 1362320,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.28,
+ "avgMs": 2.28,
+ "p95Ms": 2.28,
+ "maxMs": 2.28
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.17,
+ "maxMs": 0.17
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.178,
+ "maxMs": 0.178
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.178,
+ "p50Ms": 0.178,
+ "p95Ms": 0.178,
+ "maxMs": 0.178,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.125,
+ "p50Ms": 0.125,
+ "p95Ms": 0.125,
+ "maxMs": 0.125,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.182,
+ "p50Ms": 0.182,
+ "p95Ms": 0.182,
+ "maxMs": 0.182,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 5
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.197,
+ "p50Ms": 0.197,
+ "p95Ms": 0.197,
+ "maxMs": 0.197,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1364992,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.93,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.49,
+ "avgMs": 4.493,
+ "p95Ms": 4.493,
+ "maxMs": 4.493
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.446,
+ "maxMs": 0.446
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.478,
+ "maxMs": 0.478
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0.31,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.132,
+ "p50Ms": 0.132,
+ "p95Ms": 0.132,
+ "maxMs": 0.132,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.478,
+ "p50Ms": 0.478,
+ "p95Ms": 0.478,
+ "maxMs": 0.478,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.254,
+ "p50Ms": 0.254,
+ "p95Ms": 0.254,
+ "maxMs": 0.254,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.201,
+ "p50Ms": 0.201,
+ "p95Ms": 0.201,
+ "maxMs": 0.201,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1362352,
+ "heapSizeAfterBytes": 33554432
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-continuous-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-continuous-10k.json
new file mode 100644
index 0000000..59df66f
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-continuous-10k.json
@@ -0,0 +1,653 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-continuous-10k",
+ "name": "Continuous updates: 100 of 10k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:11:18.109Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6363,
+ "load": {
+ "commitMs": 11.99,
+ "readyMs": 98,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.5,
+ "backgroundMs": 4.66,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.36,
+ "avgMs": 0.452,
+ "p50Ms": 0.648,
+ "p95Ms": 0.709,
+ "maxMs": 0.709,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.66,
+ "avgMs": 0.332,
+ "p50Ms": 0.004,
+ "p95Ms": 0.661,
+ "maxMs": 0.661,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.57,
+ "avgMs": 1.523,
+ "p50Ms": 1.332,
+ "p95Ms": 1.938,
+ "maxMs": 1.938,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.57,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.111,
+ "p50Ms": 0.111,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.35,
+ "avgMs": 0.088,
+ "p50Ms": 0.011,
+ "p95Ms": 0.016,
+ "maxMs": 4.65,
+ "mainThreadMs": 5.35,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013113329999999979,
+ "allocatedBytes": 4453864,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 332,
+ "durationMs": 5546.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 332,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0
+ },
+ "js": {
+ "lagMs": {
+ "samples": 333,
+ "p50": 0.02,
+ "p95": 0.58,
+ "p99": 3.06,
+ "max": 4.23
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.24,
+ "max": 20.9
+ },
+ "lateFrames": 0,
+ "busyMs": 74.1,
+ "busyRatio": 0.0134,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5547.4,
+ "commits": {
+ "count": 50,
+ "totalMs": 768.26,
+ "avgMs": 15.365,
+ "p95Ms": 19.529,
+ "maxMs": 20.193
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 1.717,
+ "maxMs": 2.972
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 2.366,
+ "maxMs": 5.483
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 162.65,
+ "backgroundMs": 89.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 43.83,
+ "avgMs": 0.877,
+ "p50Ms": 0.859,
+ "p95Ms": 1.337,
+ "maxMs": 1.465,
+ "mainThreadMs": 43.83,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 118.31,
+ "avgMs": 2.366,
+ "p50Ms": 1.999,
+ "p95Ms": 4.986,
+ "maxMs": 5.483,
+ "mainThreadMs": 118.31,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 82.88,
+ "avgMs": 1.658,
+ "p50Ms": 1.602,
+ "p95Ms": 2.404,
+ "maxMs": 2.605,
+ "mainThreadMs": 0,
+ "backgroundMs": 82.88,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.94,
+ "avgMs": 0.019,
+ "p50Ms": 0.018,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.78,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 1.23,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.033,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 2950
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 3.29,
+ "avgMs": 0.066,
+ "p50Ms": 0.063,
+ "p95Ms": 0.091,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.29,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.51,
+ "avgMs": 0.01,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.474,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.7,
+ "afterLoadMB": 224.6,
+ "afterInteractionMB": 245.3,
+ "afterCleanupMB": 216.8,
+ "peakMB": 245.3,
+ "loadDeltaMB": 33.9,
+ "interactionDeltaMB": 20.7,
+ "retainedAfterCleanupMB": 26.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.7,
+ "residentMB": 365.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 195383,
+ "mallocMB": 101
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 224.6,
+ "residentMB": 405.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 276806,
+ "mallocMB": 131.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 245.3,
+ "residentMB": 412.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 273268,
+ "mallocMB": 148.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 216.8,
+ "residentMB": 363.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 194211,
+ "mallocMB": 121
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 91920768,
+ "gcCount": 23,
+ "gcTimeMs": 0.02864908400000002,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -3538,
+ "mallocBytesDelta": 18592288
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1207,
+ "wallMs": 5551,
+ "percent": 21.7,
+ "threadsBefore": 21,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 510000,
+ "coordinates": 510000,
+ "estimatedBytes": 36525893
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717815
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5543.01,
+ "commits": {
+ "count": 50,
+ "totalMs": 768.26,
+ "avgMs": 15.365,
+ "p95Ms": 19.529,
+ "maxMs": 20.193
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 1.717,
+ "maxMs": 2.972
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 2.366,
+ "maxMs": 5.483
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 162.65,
+ "backgroundMs": 89.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 43.83,
+ "avgMs": 0.877,
+ "p50Ms": 0.859,
+ "p95Ms": 1.337,
+ "maxMs": 1.465,
+ "mainThreadMs": 43.83,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 118.31,
+ "avgMs": 2.366,
+ "p50Ms": 1.999,
+ "p95Ms": 4.986,
+ "maxMs": 5.483,
+ "mainThreadMs": 118.31,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 82.88,
+ "avgMs": 1.658,
+ "p50Ms": 1.602,
+ "p95Ms": 2.404,
+ "maxMs": 2.605,
+ "mainThreadMs": 0,
+ "backgroundMs": 82.88,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.94,
+ "avgMs": 0.019,
+ "p50Ms": 0.018,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.78,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 1.23,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.033,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 2950
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 3.29,
+ "avgMs": 0.066,
+ "p50Ms": 0.063,
+ "p95Ms": 0.091,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.29,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.51,
+ "avgMs": 0.01,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.474,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 23,
+ "gcTimeMs": 0.02864908400000002,
+ "allocatedBytes": 91864784,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-continuous-1k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-continuous-1k.json
new file mode 100644
index 0000000..18bdff3
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/mutations-continuous-1k.json
@@ -0,0 +1,653 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-continuous-1k",
+ "name": "Continuous updates: 100 of 1k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:11:09.207Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6381,
+ "load": {
+ "commitMs": 5.97,
+ "readyMs": 89,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 20.99,
+ "backgroundMs": 0.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.13,
+ "avgMs": 0.043,
+ "p50Ms": 0.058,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.04,
+ "p50Ms": 0.003,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.44,
+ "avgMs": 0.146,
+ "p50Ms": 0.142,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 20.74,
+ "avgMs": 5.185,
+ "p50Ms": 0.016,
+ "p95Ms": 20.679,
+ "maxMs": 20.679,
+ "mainThreadMs": 20.74,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0033506670000000016,
+ "allocatedBytes": 522608,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 333,
+ "durationMs": 5565.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 333,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0
+ },
+ "js": {
+ "lagMs": {
+ "samples": 334,
+ "p50": 0.02,
+ "p95": 0.49,
+ "p99": 0.58,
+ "max": 0.74
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.15,
+ "max": 17.4
+ },
+ "lateFrames": 0,
+ "busyMs": 47,
+ "busyRatio": 0.0084,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5565.5,
+ "commits": {
+ "count": 50,
+ "totalMs": 129.41,
+ "avgMs": 2.588,
+ "p95Ms": 3.474,
+ "maxMs": 4.281
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 0.417,
+ "maxMs": 0.679
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.407,
+ "maxMs": 0.667
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 35.09,
+ "backgroundMs": 14.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 6.11,
+ "avgMs": 0.122,
+ "p50Ms": 0.123,
+ "p95Ms": 0.152,
+ "maxMs": 0.163,
+ "mainThreadMs": 6.11,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 20.37,
+ "avgMs": 0.407,
+ "p50Ms": 0.402,
+ "p95Ms": 0.601,
+ "maxMs": 0.667,
+ "mainThreadMs": 20.37,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 11.72,
+ "avgMs": 0.234,
+ "p50Ms": 0.216,
+ "p95Ms": 0.426,
+ "maxMs": 0.636,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.72,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.44,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.014,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.11,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 350
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.73,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.73,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 1.47,
+ "avgMs": 0.029,
+ "p50Ms": 0.027,
+ "p95Ms": 0.043,
+ "maxMs": 0.068,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.47,
+ "items": 350
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 8.62,
+ "avgMs": 0.172,
+ "p50Ms": 0.165,
+ "p95Ms": 0.254,
+ "maxMs": 0.289,
+ "mainThreadMs": 8.62,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 178.1,
+ "afterLoadMB": 210.7,
+ "afterInteractionMB": 208.4,
+ "afterCleanupMB": 189.9,
+ "peakMB": 210.7,
+ "loadDeltaMB": 32.6,
+ "interactionDeltaMB": -2.3,
+ "retainedAfterCleanupMB": 11.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 178.1,
+ "residentMB": 350,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 118461,
+ "mallocMB": 90.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 210.7,
+ "residentMB": 399.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 268771,
+ "mallocMB": 120.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 208.4,
+ "residentMB": 400.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 264082,
+ "mallocMB": 118.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 189.9,
+ "residentMB": 364.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 194678,
+ "mallocMB": 100.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 12745496,
+ "gcCount": 4,
+ "gcTimeMs": 0.0037027089999999985,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -4689,
+ "mallocBytesDelta": -1871184
+ }
+ },
+ "cpu": {
+ "processCpuMs": 697,
+ "wallMs": 5568,
+ "percent": 12.5,
+ "threadsBefore": 21,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 51000,
+ "coordinates": 51000,
+ "estimatedBytes": 3653136
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5562.12,
+ "commits": {
+ "count": 50,
+ "totalMs": 129.41,
+ "avgMs": 2.588,
+ "p95Ms": 3.474,
+ "maxMs": 4.281
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 0.417,
+ "maxMs": 0.679
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.407,
+ "maxMs": 0.667
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 35.09,
+ "backgroundMs": 14.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 6.11,
+ "avgMs": 0.122,
+ "p50Ms": 0.123,
+ "p95Ms": 0.152,
+ "maxMs": 0.163,
+ "mainThreadMs": 6.11,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 20.37,
+ "avgMs": 0.407,
+ "p50Ms": 0.402,
+ "p95Ms": 0.601,
+ "maxMs": 0.667,
+ "mainThreadMs": 20.37,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 11.72,
+ "avgMs": 0.234,
+ "p50Ms": 0.216,
+ "p95Ms": 0.426,
+ "maxMs": 0.636,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.72,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.44,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.014,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.11,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 350
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.73,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.73,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 1.47,
+ "avgMs": 0.029,
+ "p50Ms": 0.027,
+ "p95Ms": 0.043,
+ "maxMs": 0.068,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.47,
+ "items": 350
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 8.62,
+ "avgMs": 0.172,
+ "p50Ms": 0.165,
+ "p95Ms": 0.254,
+ "maxMs": 0.289,
+ "mainThreadMs": 8.62,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.0037027089999999985,
+ "allocatedBytes": 12689488,
+ "heapSizeAfterBytes": 33554432
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-100.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-100.json
new file mode 100644
index 0000000..c514ecf
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-100.json
@@ -0,0 +1,644 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygon-100",
+ "name": "Polygon, 100 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:57.240Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4920,
+ "load": {
+ "commitMs": 1.06,
+ "readyMs": 88,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.276,
+ "p50Ms": 0,
+ "p95Ms": 0.552,
+ "maxMs": 0.552,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 99528,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 243,
+ "durationMs": 4107,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.3,
+ "p50": 59,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.87,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 17.62,
+ "worst": 49.04,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 240,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0082,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 247,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.57,
+ "max": 0.79
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.46
+ },
+ "lateFrames": 0,
+ "busyMs": 33.5,
+ "busyRatio": 0.0081,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4107.5,
+ "commits": {
+ "count": 5,
+ "totalMs": 2.17,
+ "avgMs": 0.434,
+ "p95Ms": 0.62,
+ "maxMs": 0.62
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 0.145,
+ "maxMs": 0.225
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 2.641,
+ "maxMs": 3.187
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 15.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 13.2,
+ "avgMs": 2.641,
+ "p50Ms": 2.773,
+ "p95Ms": 3.187,
+ "maxMs": 3.187,
+ "mainThreadMs": 13.2,
+ "backgroundMs": 0,
+ "items": 500
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.15,
+ "avgMs": 0.538,
+ "p50Ms": 0.446,
+ "p95Ms": 0.992,
+ "maxMs": 0.992,
+ "mainThreadMs": 2.15,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.3,
+ "afterLoadMB": 235,
+ "afterInteractionMB": 306.9,
+ "afterCleanupMB": 190,
+ "peakMB": 306.9,
+ "loadDeltaMB": 44.7,
+ "interactionDeltaMB": 71.9,
+ "retainedAfterCleanupMB": -0.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.3,
+ "residentMB": 344.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 124834,
+ "mallocMB": 93.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 235,
+ "residentMB": 318,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 270121,
+ "mallocMB": 122.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 306.9,
+ "residentMB": 408.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 363359,
+ "mallocMB": 144.6
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 190,
+ "residentMB": 364.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 130714,
+ "mallocMB": 93.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 470480,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 93238,
+ "mallocBytesDelta": 23130784
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1029,
+ "wallMs": 4110,
+ "percent": 25,
+ "threadsBefore": 21,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 600,
+ "estimatedBytes": 27462
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4577
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 301.85,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.314,
+ "p95Ms": 0.314,
+ "maxMs": 0.314
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.12,
+ "maxMs": 0.12
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.761,
+ "maxMs": 2.761
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.76,
+ "avgMs": 2.761,
+ "p50Ms": 2.761,
+ "p95Ms": 2.761,
+ "maxMs": 2.761,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 61528,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 316.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.258,
+ "p95Ms": 0.258,
+ "maxMs": 0.258
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.084,
+ "maxMs": 0.084
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.709,
+ "maxMs": 1.709
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.71,
+ "avgMs": 1.709,
+ "p50Ms": 1.709,
+ "p95Ms": 1.709,
+ "maxMs": 1.709,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60368,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 316.21,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.582,
+ "p95Ms": 0.582,
+ "maxMs": 0.582
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.167,
+ "maxMs": 0.167
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.774,
+ "maxMs": 2.774
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.77,
+ "avgMs": 2.774,
+ "p50Ms": 2.774,
+ "p95Ms": 2.774,
+ "maxMs": 2.774,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58872,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 316.23,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.62,
+ "p95Ms": 0.62,
+ "maxMs": 0.62
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.225,
+ "maxMs": 0.225
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.187,
+ "maxMs": 3.187
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.19,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.19,
+ "avgMs": 3.187,
+ "p50Ms": 3.187,
+ "p95Ms": 3.187,
+ "maxMs": 3.187,
+ "mainThreadMs": 3.19,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60808,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 315.72,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.395,
+ "p95Ms": 0.395,
+ "maxMs": 0.395
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.131,
+ "maxMs": 0.131
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.773,
+ "maxMs": 2.773
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.77,
+ "avgMs": 2.773,
+ "p50Ms": 2.773,
+ "p95Ms": 2.773,
+ "maxMs": 2.773,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58712,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-10k.json
new file mode 100644
index 0000000..644921d
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-10k.json
@@ -0,0 +1,644 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygon-10k",
+ "name": "Polygon, 10k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:12:11.142Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4943,
+ "load": {
+ "commitMs": 1.21,
+ "readyMs": 108,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.001,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 1.71,
+ "avgMs": 0.855,
+ "p50Ms": 0,
+ "p95Ms": 1.71,
+ "maxMs": 1.71,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013839579999999907,
+ "allocatedBytes": 2866720,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 245,
+ "durationMs": 4127.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.8,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 45.59,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 243,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0041,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 248,
+ "p50": 0.02,
+ "p95": 0.45,
+ "p99": 0.49,
+ "max": 0.51
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.11,
+ "max": 17.18
+ },
+ "lateFrames": 0,
+ "busyMs": 31.9,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4128.6,
+ "commits": {
+ "count": 5,
+ "totalMs": 4.47,
+ "avgMs": 0.895,
+ "p95Ms": 1.012,
+ "maxMs": 1.012
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 0.155,
+ "maxMs": 0.219
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 2.713,
+ "maxMs": 3.122
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 14.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 13.56,
+ "avgMs": 2.713,
+ "p50Ms": 2.588,
+ "p95Ms": 3.122,
+ "maxMs": 3.122,
+ "mainThreadMs": 13.56,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.39,
+ "avgMs": 0.348,
+ "p50Ms": 0.302,
+ "p95Ms": 0.504,
+ "maxMs": 0.504,
+ "mainThreadMs": 1.39,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 191.7,
+ "afterLoadMB": 223.4,
+ "afterInteractionMB": 313.9,
+ "afterCleanupMB": 192.2,
+ "peakMB": 313.9,
+ "loadDeltaMB": 31.7,
+ "interactionDeltaMB": 90.5,
+ "retainedAfterCleanupMB": 0.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 191.7,
+ "residentMB": 365.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 135523,
+ "mallocMB": 94.6
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 223.4,
+ "residentMB": 378.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 276573,
+ "mallocMB": 126.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 313.9,
+ "residentMB": 372.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 368499,
+ "mallocMB": 145.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.2,
+ "residentMB": 343.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 135642,
+ "mallocMB": 94.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 10130464,
+ "gcCount": 4,
+ "gcTimeMs": 0.001400375999999981,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 91926,
+ "mallocBytesDelta": 20231568
+ }
+ },
+ "cpu": {
+ "processCpuMs": 876,
+ "wallMs": 4130,
+ "percent": 21.2,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 60000,
+ "estimatedBytes": 2687472
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447912
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 319.44,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.8,
+ "avgMs": 0.805,
+ "p95Ms": 0.805,
+ "maxMs": 0.805
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.135,
+ "maxMs": 0.135
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.579,
+ "maxMs": 2.579
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.58,
+ "avgMs": 2.579,
+ "p50Ms": 2.579,
+ "p95Ms": 2.579,
+ "maxMs": 2.579,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007163749999999913,
+ "allocatedBytes": 1782600,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 315.96,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.87,
+ "avgMs": 0.873,
+ "p95Ms": 0.873,
+ "maxMs": 0.873
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.139,
+ "maxMs": 0.139
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.588,
+ "maxMs": 2.588
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.59,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.59,
+ "avgMs": 2.588,
+ "p50Ms": 2.588,
+ "p95Ms": 2.588,
+ "maxMs": 2.588,
+ "mainThreadMs": 2.59,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00017100000000000448,
+ "allocatedBytes": 1781816,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 316.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.967,
+ "p95Ms": 0.967,
+ "maxMs": 0.967
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.155,
+ "maxMs": 0.155
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.693,
+ "maxMs": 2.693
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.69,
+ "avgMs": 2.693,
+ "p50Ms": 2.693,
+ "p95Ms": 2.693,
+ "maxMs": 2.693,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1780808,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 315.86,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.01,
+ "avgMs": 1.012,
+ "p95Ms": 1.012,
+ "maxMs": 1.012
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.219,
+ "maxMs": 0.219
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.122,
+ "maxMs": 3.122
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.12,
+ "avgMs": 3.122,
+ "p50Ms": 3.122,
+ "p95Ms": 3.122,
+ "maxMs": 3.122,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00037945899999999866,
+ "allocatedBytes": 1782632,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 316.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.818,
+ "p95Ms": 0.818,
+ "maxMs": 0.818
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.123,
+ "maxMs": 0.123
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.583,
+ "maxMs": 2.583
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.58,
+ "avgMs": 2.583,
+ "p50Ms": 2.583,
+ "p95Ms": 2.583,
+ "maxMs": 2.583,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0001335419999999865,
+ "allocatedBytes": 1780792,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-1k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-1k.json
new file mode 100644
index 0000000..9e89596
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygon-1k.json
@@ -0,0 +1,645 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygon-1k",
+ "name": "Polygon, 1k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:12:04.158Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4928,
+ "load": {
+ "commitMs": 0.98,
+ "readyMs": 65,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.42,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.4,
+ "avgMs": 0.202,
+ "p50Ms": 0,
+ "p95Ms": 0.404,
+ "maxMs": 0.404,
+ "mainThreadMs": 0.4,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 376712,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 244,
+ "durationMs": 4113.5,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 59,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.8,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 35.29,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 242,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0082,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 247,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.68,
+ "max": 0.97
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.18,
+ "max": 17.63
+ },
+ "lateFrames": 0,
+ "busyMs": 37.3,
+ "busyRatio": 0.0091,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4114,
+ "commits": {
+ "count": 5,
+ "totalMs": 3.27,
+ "avgMs": 0.654,
+ "p95Ms": 0.778,
+ "maxMs": 0.778
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 0.15,
+ "maxMs": 0.17
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 2.785,
+ "maxMs": 3.073
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 15.72,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 13.93,
+ "avgMs": 2.785,
+ "p50Ms": 2.782,
+ "p95Ms": 3.073,
+ "maxMs": 3.073,
+ "mainThreadMs": 13.93,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.79,
+ "avgMs": 0.448,
+ "p50Ms": 0.469,
+ "p95Ms": 0.541,
+ "maxMs": 0.541,
+ "mainThreadMs": 1.79,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.8,
+ "afterLoadMB": 212.9,
+ "afterInteractionMB": 303.5,
+ "afterCleanupMB": 190.8,
+ "peakMB": 303.5,
+ "loadDeltaMB": 22.1,
+ "interactionDeltaMB": 90.6,
+ "retainedAfterCleanupMB": 0,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.8,
+ "residentMB": 366,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 131308,
+ "mallocMB": 94
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 212.9,
+ "residentMB": 390.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 275876,
+ "mallocMB": 123.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 303.5,
+ "residentMB": 406.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 367313,
+ "mallocMB": 145.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 190.8,
+ "residentMB": 364.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 134935,
+ "mallocMB": 94.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1540072,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 91437,
+ "mallocBytesDelta": 22779136
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1015,
+ "wallMs": 4116,
+ "percent": 24.7,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 6000,
+ "estimatedBytes": 269292
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44882
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 307.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.523,
+ "p95Ms": 0.523,
+ "maxMs": 0.523
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.144,
+ "maxMs": 0.144
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.479,
+ "maxMs": 2.479
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.48,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.48,
+ "avgMs": 2.479,
+ "p50Ms": 2.479,
+ "p95Ms": 2.479,
+ "maxMs": 2.479,
+ "mainThreadMs": 2.48,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257032,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 315.71,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.78,
+ "avgMs": 0.778,
+ "p95Ms": 0.778,
+ "maxMs": 0.778
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.146,
+ "maxMs": 0.146
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.695,
+ "maxMs": 2.695
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.69,
+ "avgMs": 2.695,
+ "p50Ms": 2.695,
+ "p95Ms": 2.695,
+ "maxMs": 2.695,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 256912,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 316.11,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.584,
+ "p95Ms": 0.584,
+ "maxMs": 0.584
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.139,
+ "maxMs": 0.139
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.897,
+ "maxMs": 2.897
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.9,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.9,
+ "avgMs": 2.897,
+ "p50Ms": 2.897,
+ "p95Ms": 2.897,
+ "maxMs": 2.897,
+ "mainThreadMs": 2.9,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255832,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 316.28,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.666,
+ "p95Ms": 0.666,
+ "maxMs": 0.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.17,
+ "maxMs": 0.17
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.782,
+ "maxMs": 2.782
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.78,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.78,
+ "avgMs": 2.782,
+ "p50Ms": 2.782,
+ "p95Ms": 2.782,
+ "maxMs": 2.782,
+ "mainThreadMs": 2.78,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257768,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 315.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.72,
+ "avgMs": 0.719,
+ "p95Ms": 0.719,
+ "maxMs": 0.719
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.15,
+ "maxMs": 0.15
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.073,
+ "maxMs": 3.073
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.07,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.07,
+ "avgMs": 3.073,
+ "p50Ms": 3.073,
+ "p95Ms": 3.073,
+ "maxMs": 3.073,
+ "mainThreadMs": 3.07,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255928,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygons-200x20.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygons-200x20.json
new file mode 100644
index 0000000..ff10fd3
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polygons-200x20.json
@@ -0,0 +1,534 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygons-200x20",
+ "name": "200 polygons of 20 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polygons: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:12:23.774Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4294,
+ "load": {
+ "commitMs": 1.8,
+ "readyMs": 95,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 19.36,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 19.34,
+ "avgMs": 9.67,
+ "p50Ms": 0,
+ "p95Ms": 19.339,
+ "maxMs": 19.339,
+ "mainThreadMs": 19.34,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001435040999999998,
+ "allocatedBytes": 993416,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 199,
+ "durationMs": 3479.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.4,
+ "p50": 58,
+ "p95": 53,
+ "p99": 53,
+ "worstWindow": 53,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.42,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 43.99,
+ "worst": 61.48,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 191,
+ 3,
+ 1,
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 5,
+ "jankRatio": 0.0251,
+ "droppedFrames": 9,
+ "longFrames": 1,
+ "overBudgetFrames": 8
+ },
+ "js": {
+ "lagMs": {
+ "samples": 209,
+ "p50": 0,
+ "p95": 0.54,
+ "p99": 0.59,
+ "max": 0.75
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.2,
+ "max": 17.41
+ },
+ "lateFrames": 0,
+ "busyMs": 29.1,
+ "busyRatio": 0.0084,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3479.6,
+ "commits": {
+ "count": 3,
+ "totalMs": 2.53,
+ "avgMs": 0.845,
+ "p95Ms": 1.072,
+ "maxMs": 1.072
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.226,
+ "maxMs": 0.346
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 40.605,
+ "maxMs": 46.057
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 123.2,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 121.81,
+ "avgMs": 40.605,
+ "p50Ms": 40.698,
+ "p95Ms": 46.057,
+ "maxMs": 46.057,
+ "mainThreadMs": 121.81,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.39,
+ "avgMs": 0.347,
+ "p50Ms": 0.29,
+ "p95Ms": 0.562,
+ "maxMs": 0.562,
+ "mainThreadMs": 1.39,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 192.9,
+ "afterLoadMB": 244.4,
+ "afterInteractionMB": 347.9,
+ "afterCleanupMB": 192.6,
+ "peakMB": 347.9,
+ "loadDeltaMB": 51.5,
+ "interactionDeltaMB": 103.5,
+ "retainedAfterCleanupMB": -0.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 192.9,
+ "residentMB": 385.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 138540,
+ "mallocMB": 94.2
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 244.4,
+ "residentMB": 440.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 307421,
+ "mallocMB": 127.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 347.9,
+ "residentMB": 467.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 408373,
+ "mallocMB": 150.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.6,
+ "residentMB": 381.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 141541,
+ "mallocMB": 94.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1846368,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 100952,
+ "mallocBytesDelta": 24879776
+ }
+ },
+ "cpu": {
+ "processCpuMs": 903,
+ "wallMs": 3481,
+ "percent": 25.9,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 0
+ },
+ "wallMs": 305.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.072,
+ "p95Ms": 1.072,
+ "maxMs": 1.072
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.346,
+ "maxMs": 0.346
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 46.057,
+ "maxMs": 46.057
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 46.06,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 46.06,
+ "avgMs": 46.057,
+ "p50Ms": 46.057,
+ "p95Ms": 46.057,
+ "maxMs": 46.057,
+ "mainThreadMs": 46.06,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 362152,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 1
+ },
+ "wallMs": 316.62,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.87,
+ "avgMs": 0.872,
+ "p95Ms": 0.872,
+ "maxMs": 0.872
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.191,
+ "maxMs": 0.191
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 40.698,
+ "maxMs": 40.698
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 40.7,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 40.7,
+ "avgMs": 40.698,
+ "p50Ms": 40.698,
+ "p95Ms": 40.698,
+ "maxMs": 40.698,
+ "mainThreadMs": 40.7,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 362144,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 2
+ },
+ "wallMs": 316.38,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.59,
+ "p95Ms": 0.59,
+ "maxMs": 0.59
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.142,
+ "maxMs": 0.142
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 35.06,
+ "maxMs": 35.06
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 35.06,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 35.06,
+ "avgMs": 35.06,
+ "p50Ms": 35.06,
+ "p95Ms": 35.06,
+ "maxMs": 35.06,
+ "mainThreadMs": 35.06,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 361024,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-100.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-100.json
new file mode 100644
index 0000000..ff60193
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-100.json
@@ -0,0 +1,809 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-100",
+ "name": "Polyline, 100 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:26.046Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5876,
+ "load": {
+ "commitMs": 1.34,
+ "readyMs": 137,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 1.82,
+ "avgMs": 0.912,
+ "p50Ms": 0.001,
+ "p95Ms": 1.822,
+ "maxMs": 1.822,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 92920,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 301,
+ "durationMs": 5057.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.6,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.78,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 46.93,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 299,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0033,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 304,
+ "p50": 0,
+ "p95": 0.5,
+ "p99": 0.55,
+ "max": 0.58
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.16,
+ "max": 17.25
+ },
+ "lateFrames": 0,
+ "busyMs": 39.1,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5058.1,
+ "commits": {
+ "count": 8,
+ "totalMs": 2.88,
+ "avgMs": 0.36,
+ "p95Ms": 0.578,
+ "maxMs": 0.578
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.117,
+ "maxMs": 0.201
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 1.79,
+ "maxMs": 2.658
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 16.13,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 14.32,
+ "avgMs": 1.79,
+ "p50Ms": 1.57,
+ "p95Ms": 2.658,
+ "maxMs": 2.658,
+ "mainThreadMs": 14.32,
+ "backgroundMs": 0,
+ "items": 800
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.81,
+ "avgMs": 0.452,
+ "p50Ms": 0.476,
+ "p95Ms": 0.602,
+ "maxMs": 0.602,
+ "mainThreadMs": 1.81,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 217.5,
+ "afterLoadMB": 237.4,
+ "afterInteractionMB": 318.5,
+ "afterCleanupMB": 199.1,
+ "peakMB": 318.5,
+ "loadDeltaMB": 19.9,
+ "interactionDeltaMB": 81.1,
+ "retainedAfterCleanupMB": -18.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 217.5,
+ "residentMB": 364.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 194794,
+ "mallocMB": 121.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 237.4,
+ "residentMB": 366.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 266660,
+ "mallocMB": 142.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 318.5,
+ "residentMB": 388.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 361739,
+ "mallocMB": 161
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 199.1,
+ "residentMB": 354.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 121390,
+ "mallocMB": 109.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 706632,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 95079,
+ "mallocBytesDelta": 19833296
+ }
+ },
+ "cpu": {
+ "processCpuMs": 999,
+ "wallMs": 5061,
+ "percent": 19.7,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900,
+ "estimatedBytes": 40852
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4543
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 302.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.269,
+ "p95Ms": 0.269,
+ "maxMs": 0.269
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.091,
+ "maxMs": 0.091
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.658,
+ "maxMs": 2.658
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.66,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.66,
+ "avgMs": 2.658,
+ "p50Ms": 2.658,
+ "p95Ms": 2.658,
+ "maxMs": 2.658,
+ "mainThreadMs": 2.66,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 61480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 316.72,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.253,
+ "p95Ms": 0.253,
+ "maxMs": 0.253
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.086,
+ "maxMs": 0.086
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.296,
+ "maxMs": 1.296
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.3,
+ "avgMs": 1.296,
+ "p50Ms": 1.296,
+ "p95Ms": 1.296,
+ "maxMs": 1.296,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 59976,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 316.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.441,
+ "p95Ms": 0.441,
+ "maxMs": 0.441
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.167,
+ "maxMs": 0.167
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.917,
+ "maxMs": 1.917
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.92,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.92,
+ "avgMs": 1.917,
+ "p50Ms": 1.917,
+ "p95Ms": 1.917,
+ "maxMs": 1.917,
+ "mainThreadMs": 1.92,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58776,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 315.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.233,
+ "p95Ms": 0.233,
+ "maxMs": 0.233
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.071,
+ "maxMs": 0.071
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.057,
+ "maxMs": 1.057
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.06,
+ "avgMs": 1.057,
+ "p50Ms": 1.057,
+ "p95Ms": 1.057,
+ "maxMs": 1.057,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60640,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 316.54,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.229,
+ "p95Ms": 0.229,
+ "maxMs": 0.229
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.056,
+ "maxMs": 0.056
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.995,
+ "maxMs": 0.995
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.995,
+ "p50Ms": 0.995,
+ "p95Ms": 0.995,
+ "maxMs": 0.995,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58688,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 316.3,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.324,
+ "p95Ms": 0.324,
+ "maxMs": 0.324
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.086,
+ "maxMs": 0.086
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.57,
+ "maxMs": 1.57
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.57,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.57,
+ "avgMs": 1.57,
+ "p50Ms": 1.57,
+ "p95Ms": 1.57,
+ "maxMs": 1.57,
+ "mainThreadMs": 1.57,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60000,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 316.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.578,
+ "p95Ms": 0.578,
+ "maxMs": 0.578
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.201,
+ "maxMs": 0.201
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.461,
+ "maxMs": 2.461
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.46,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.46,
+ "avgMs": 2.461,
+ "p50Ms": 2.461,
+ "p95Ms": 2.461,
+ "maxMs": 2.461,
+ "mainThreadMs": 2.46,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 64088,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 315.77,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.552,
+ "p95Ms": 0.552,
+ "maxMs": 0.552
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.181,
+ "maxMs": 0.181
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.365,
+ "maxMs": 2.365
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.365,
+ "p50Ms": 2.365,
+ "p95Ms": 2.365,
+ "maxMs": 2.365,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 59960,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-100k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-100k.json
new file mode 100644
index 0000000..07af577
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-100k.json
@@ -0,0 +1,810 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-100k",
+ "name": "Polyline, 100k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "One 100000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:50.309Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6405,
+ "load": {
+ "commitMs": 6.59,
+ "readyMs": 60,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 2.11,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 2.09,
+ "avgMs": 1.046,
+ "p50Ms": 0.001,
+ "p95Ms": 2.09,
+ "maxMs": 2.09,
+ "mainThreadMs": 2.09,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 9,
+ "gcTimeMs": 0.006792126000000009,
+ "allocatedBytes": 27625312,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 322,
+ "durationMs": 5585.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.5,
+ "p50": 60,
+ "p95": 48,
+ "p99": 48,
+ "worstWindow": 48,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 17.39,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 50.44,
+ "worst": 69.65,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 313,
+ 2,
+ 1,
+ 2,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 7,
+ "jankRatio": 0.0217,
+ "droppedFrames": 14,
+ "longFrames": 4,
+ "overBudgetFrames": 9
+ },
+ "js": {
+ "lagMs": {
+ "samples": 307,
+ "p50": 0,
+ "p95": 0.65,
+ "p99": 53.62,
+ "max": 100.88
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.32,
+ "max": 117.54
+ },
+ "lateFrames": 10,
+ "busyMs": 517.1,
+ "busyRatio": 0.0926,
+ "longTasks": {
+ "count": 8,
+ "totalMs": 479.2,
+ "maxMs": 68.1,
+ "source": "performance-observer"
+ },
+ "durationMs": 5586.1,
+ "commits": {
+ "count": 8,
+ "totalMs": 54.16,
+ "avgMs": 6.77,
+ "p95Ms": 7.363,
+ "maxMs": 7.363
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.493,
+ "maxMs": 0.65
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 3.273,
+ "maxMs": 3.614
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 27.88,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 26.19,
+ "avgMs": 3.273,
+ "p50Ms": 3.242,
+ "p95Ms": 3.614,
+ "maxMs": 3.614,
+ "mainThreadMs": 26.19,
+ "backgroundMs": 0,
+ "items": 800000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.7,
+ "avgMs": 0.424,
+ "p50Ms": 0.349,
+ "p95Ms": 0.656,
+ "maxMs": 0.656,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 196.5,
+ "afterLoadMB": 213.5,
+ "afterInteractionMB": 320.7,
+ "afterCleanupMB": 189.5,
+ "peakMB": 320.7,
+ "loadDeltaMB": 17,
+ "interactionDeltaMB": 107.2,
+ "retainedAfterCleanupMB": -7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 196.5,
+ "residentMB": 338.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 129316,
+ "mallocMB": 105.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 213.5,
+ "residentMB": 405.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 269839,
+ "mallocMB": 123.9
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 320.7,
+ "residentMB": 389,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 356648,
+ "mallocMB": 151.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 189.5,
+ "residentMB": 356.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 124245,
+ "mallocMB": 93.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 154969128,
+ "gcCount": 44,
+ "gcTimeMs": 0.010022956999999971,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 86809,
+ "mallocBytesDelta": 28881664
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1533,
+ "wallMs": 5589,
+ "percent": 27.4,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900000,
+ "estimatedBytes": 40300927
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100000,
+ "estimatedBytes": 4477935
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 350.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.33,
+ "avgMs": 6.327,
+ "p95Ms": 6.327,
+ "maxMs": 6.327
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.425,
+ "maxMs": 0.425
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.91,
+ "maxMs": 2.91
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.91,
+ "avgMs": 2.91,
+ "p50Ms": 2.91,
+ "p95Ms": 2.91,
+ "maxMs": 2.91,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.0008272510000000011,
+ "allocatedBytes": 17485728,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 382.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.8,
+ "avgMs": 6.805,
+ "p95Ms": 6.805,
+ "maxMs": 6.805
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.386,
+ "maxMs": 0.386
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.139,
+ "maxMs": 3.139
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.14,
+ "avgMs": 3.139,
+ "p50Ms": 3.139,
+ "p95Ms": 3.139,
+ "maxMs": 3.139,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0005251669999999931,
+ "allocatedBytes": 17481016,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 366.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.13,
+ "avgMs": 7.129,
+ "p95Ms": 7.129,
+ "maxMs": 7.129
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.456,
+ "maxMs": 0.456
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.142,
+ "maxMs": 3.142
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.14,
+ "avgMs": 3.142,
+ "p50Ms": 3.142,
+ "p95Ms": 3.142,
+ "maxMs": 3.142,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0006080409999999759,
+ "allocatedBytes": 17479088,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 3
+ },
+ "wallMs": 383.54,
+ "commits": {
+ "count": 1,
+ "totalMs": 7,
+ "avgMs": 7.001,
+ "p95Ms": 7.001,
+ "maxMs": 7.001
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.458,
+ "maxMs": 0.458
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.333,
+ "maxMs": 3.333
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.33,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.33,
+ "avgMs": 3.333,
+ "p50Ms": 3.333,
+ "p95Ms": 3.333,
+ "maxMs": 3.333,
+ "mainThreadMs": 3.33,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0007463329999999879,
+ "allocatedBytes": 17480992,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 4
+ },
+ "wallMs": 382.06,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.88,
+ "avgMs": 6.881,
+ "p95Ms": 6.881,
+ "maxMs": 6.881
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.65,
+ "maxMs": 0.65
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.242,
+ "maxMs": 3.242
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.24,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.24,
+ "avgMs": 3.242,
+ "p50Ms": 3.242,
+ "p95Ms": 3.242,
+ "maxMs": 3.242,
+ "mainThreadMs": 3.24,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0007079569999999813,
+ "allocatedBytes": 17479032,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 366.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.16,
+ "avgMs": 6.159,
+ "p95Ms": 6.159,
+ "maxMs": 6.159
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.42,
+ "maxMs": 0.42
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.335,
+ "maxMs": 3.335
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.34,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.34,
+ "avgMs": 3.335,
+ "p50Ms": 3.335,
+ "p95Ms": 3.335,
+ "maxMs": 3.335,
+ "mainThreadMs": 3.34,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.0011432500000000123,
+ "allocatedBytes": 19084848,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 366.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.49,
+ "avgMs": 6.491,
+ "p95Ms": 6.491,
+ "maxMs": 6.491
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.548,
+ "maxMs": 0.548
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.614,
+ "maxMs": 3.614
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.61,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.61,
+ "avgMs": 3.614,
+ "p50Ms": 3.614,
+ "p95Ms": 3.614,
+ "maxMs": 3.614,
+ "mainThreadMs": 3.61,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.00107770900000001,
+ "allocatedBytes": 19083720,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 382.87,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.36,
+ "avgMs": 7.363,
+ "p95Ms": 7.363,
+ "maxMs": 7.363
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.596,
+ "maxMs": 0.596
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.47,
+ "maxMs": 3.47
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.47,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.47,
+ "avgMs": 3.47,
+ "p50Ms": 3.47,
+ "p95Ms": 3.47,
+ "maxMs": 3.47,
+ "mainThreadMs": 3.47,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0011127489999999962,
+ "allocatedBytes": 19078632,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-10k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-10k.json
new file mode 100644
index 0000000..0edd45c
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-10k.json
@@ -0,0 +1,809 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-10k",
+ "name": "Polyline, 10k points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:41.808Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5893,
+ "load": {
+ "commitMs": 1.09,
+ "readyMs": 55,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.47,
+ "avgMs": 0.233,
+ "p50Ms": 0.002,
+ "p95Ms": 0.464,
+ "maxMs": 0.464,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001278208000000003,
+ "allocatedBytes": 2862840,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 301,
+ "durationMs": 5078.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.4,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.83,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 46.65,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 298,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0066,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 305,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.62,
+ "max": 0.79
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.17,
+ "max": 17.46
+ },
+ "lateFrames": 0,
+ "busyMs": 33.2,
+ "busyRatio": 0.0065,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5079.4,
+ "commits": {
+ "count": 8,
+ "totalMs": 9.96,
+ "avgMs": 1.245,
+ "p95Ms": 1.782,
+ "maxMs": 1.782
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.187,
+ "maxMs": 0.263
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 1.96,
+ "maxMs": 2.733
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 17.16,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 15.68,
+ "avgMs": 1.96,
+ "p50Ms": 1.729,
+ "p95Ms": 2.733,
+ "maxMs": 2.733,
+ "mainThreadMs": 15.68,
+ "backgroundMs": 0,
+ "items": 80000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.48,
+ "avgMs": 0.371,
+ "p50Ms": 0.346,
+ "p95Ms": 0.458,
+ "maxMs": 0.458,
+ "mainThreadMs": 1.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.3,
+ "afterLoadMB": 232.5,
+ "afterInteractionMB": 317.9,
+ "afterCleanupMB": 195.7,
+ "peakMB": 317.9,
+ "loadDeltaMB": 38.2,
+ "interactionDeltaMB": 85.4,
+ "retainedAfterCleanupMB": 1.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.3,
+ "residentMB": 360.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 126053,
+ "mallocMB": 103.6
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 232.5,
+ "residentMB": 350.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 268613,
+ "mallocMB": 137.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 317.9,
+ "residentMB": 378.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 360342,
+ "mallocMB": 156.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 195.7,
+ "residentMB": 338,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 128738,
+ "mallocMB": 105.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 16008216,
+ "gcCount": 6,
+ "gcTimeMs": 0.0023806249999999696,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 91729,
+ "mallocBytesDelta": 20602544
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1108,
+ "wallMs": 5082,
+ "percent": 21.8,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 90000,
+ "estimatedBytes": 4030707
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 316.84,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.79,
+ "avgMs": 0.794,
+ "p95Ms": 0.794,
+ "maxMs": 0.794
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.141,
+ "maxMs": 0.141
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.4,
+ "maxMs": 1.4
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.4,
+ "p50Ms": 1.4,
+ "p95Ms": 1.4,
+ "maxMs": 1.4,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.000697540999999996,
+ "allocatedBytes": 1782104,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 316.22,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.923,
+ "p95Ms": 0.923,
+ "maxMs": 0.923
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.145,
+ "maxMs": 0.145
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.404,
+ "maxMs": 1.404
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.404,
+ "p50Ms": 1.404,
+ "p95Ms": 1.404,
+ "maxMs": 1.404,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0001745840000000054,
+ "allocatedBytes": 1781704,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 315.76,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.782,
+ "p95Ms": 1.782,
+ "maxMs": 1.782
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.262,
+ "maxMs": 0.262
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.733,
+ "maxMs": 2.733
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.73,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.73,
+ "avgMs": 2.733,
+ "p50Ms": 2.733,
+ "p95Ms": 2.733,
+ "maxMs": 2.733,
+ "mainThreadMs": 2.73,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1780768,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 317.09,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.767,
+ "p95Ms": 0.767,
+ "maxMs": 0.767
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.111,
+ "maxMs": 0.111
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.206,
+ "maxMs": 1.206
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.206,
+ "p50Ms": 1.206,
+ "p95Ms": 1.206,
+ "maxMs": 1.206,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00017166699999998647,
+ "allocatedBytes": 1782632,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 315.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.76,
+ "avgMs": 1.762,
+ "p95Ms": 1.762,
+ "maxMs": 1.762
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.239,
+ "maxMs": 0.239
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.56,
+ "maxMs": 2.56
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.56,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.56,
+ "avgMs": 2.56,
+ "p50Ms": 2.56,
+ "p95Ms": 2.56,
+ "maxMs": 2.56,
+ "mainThreadMs": 2.56,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.000309541999999996,
+ "allocatedBytes": 1780792,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 316.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.404,
+ "p95Ms": 1.404,
+ "maxMs": 1.404
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.198,
+ "maxMs": 0.198
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.283,
+ "maxMs": 2.283
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.28,
+ "avgMs": 2.283,
+ "p50Ms": 2.283,
+ "p95Ms": 2.283,
+ "maxMs": 2.283,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1940528,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 316.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.53,
+ "avgMs": 1.531,
+ "p95Ms": 1.531,
+ "maxMs": 1.531
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.263,
+ "maxMs": 0.263
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.365,
+ "maxMs": 2.365
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.365,
+ "p50Ms": 2.365,
+ "p95Ms": 2.365,
+ "maxMs": 2.365,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007199159999999871,
+ "allocatedBytes": 1944584,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 316.24,
+ "commits": {
+ "count": 1,
+ "totalMs": 1,
+ "avgMs": 1,
+ "p95Ms": 1,
+ "maxMs": 1
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.138,
+ "maxMs": 0.138
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.729,
+ "maxMs": 1.729
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.73,
+ "avgMs": 1.729,
+ "p50Ms": 1.729,
+ "p95Ms": 1.729,
+ "maxMs": 1.729,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0003073749999999986,
+ "allocatedBytes": 1940512,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-1k.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-1k.json
new file mode 100644
index 0000000..7810241
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polyline-1k.json
@@ -0,0 +1,810 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-1k",
+ "name": "Polyline, 1k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:33.925Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5874,
+ "load": {
+ "commitMs": 1.08,
+ "readyMs": 87,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.23,
+ "avgMs": 0.116,
+ "p50Ms": 0.001,
+ "p95Ms": 0.231,
+ "maxMs": 0.231,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 372296,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 299,
+ "durationMs": 5054.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 59,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.89,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 35.6,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 295,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0134,
+ "droppedFrames": 4,
+ "longFrames": 0,
+ "overBudgetFrames": 4
+ },
+ "js": {
+ "lagMs": {
+ "samples": 304,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.68,
+ "max": 0.87
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 17.18,
+ "max": 17.53
+ },
+ "lateFrames": 0,
+ "busyMs": 44.7,
+ "busyRatio": 0.0088,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5054.6,
+ "commits": {
+ "count": 8,
+ "totalMs": 4.79,
+ "avgMs": 0.598,
+ "p95Ms": 0.8,
+ "maxMs": 0.8
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.178,
+ "maxMs": 0.25
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 2.521,
+ "maxMs": 3.454
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 21.68,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 20.17,
+ "avgMs": 2.521,
+ "p50Ms": 2.551,
+ "p95Ms": 3.454,
+ "maxMs": 3.454,
+ "mainThreadMs": 20.17,
+ "backgroundMs": 0,
+ "items": 8000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.52,
+ "avgMs": 0.379,
+ "p50Ms": 0.358,
+ "p95Ms": 0.488,
+ "maxMs": 0.488,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193.2,
+ "afterLoadMB": 220.5,
+ "afterInteractionMB": 312,
+ "afterCleanupMB": 193.4,
+ "peakMB": 312,
+ "loadDeltaMB": 27.3,
+ "interactionDeltaMB": 91.5,
+ "retainedAfterCleanupMB": 0.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193.2,
+ "residentMB": 357.7,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 119339,
+ "mallocMB": 102.6
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 220.5,
+ "residentMB": 379.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 264043,
+ "mallocMB": 135.3
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 312,
+ "residentMB": 391.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 357386,
+ "mallocMB": 154.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 193.4,
+ "residentMB": 358.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 125470,
+ "mallocMB": 103.4
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 2411456,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 93343,
+ "mallocBytesDelta": 19816304
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1068,
+ "wallMs": 5057,
+ "percent": 21.1,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 9000,
+ "estimatedBytes": 403674
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44865
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 302.33,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.627,
+ "p95Ms": 0.627,
+ "maxMs": 0.627
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.179,
+ "maxMs": 0.179
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.454,
+ "maxMs": 3.454
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.45,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.45,
+ "avgMs": 3.454,
+ "p50Ms": 3.454,
+ "p95Ms": 3.454,
+ "maxMs": 3.454,
+ "mainThreadMs": 3.45,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257104,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 316.17,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.666,
+ "p95Ms": 0.666,
+ "maxMs": 0.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.218,
+ "maxMs": 0.218
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.115,
+ "maxMs": 3.115
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.12,
+ "avgMs": 3.115,
+ "p50Ms": 3.115,
+ "p95Ms": 3.115,
+ "maxMs": 3.115,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 256840,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 315.72,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.666,
+ "p95Ms": 0.666,
+ "maxMs": 0.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.209,
+ "maxMs": 0.209
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.085,
+ "maxMs": 3.085
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.08,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.08,
+ "avgMs": 3.085,
+ "p50Ms": 3.085,
+ "p95Ms": 3.085,
+ "maxMs": 3.085,
+ "mainThreadMs": 3.08,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255832,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 315.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.558,
+ "p95Ms": 0.558,
+ "maxMs": 0.558
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.205,
+ "maxMs": 0.205
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.032,
+ "maxMs": 3.032
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.03,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.03,
+ "avgMs": 3.032,
+ "p50Ms": 3.032,
+ "p95Ms": 3.032,
+ "maxMs": 3.032,
+ "mainThreadMs": 3.03,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257768,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 316.63,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.357,
+ "p95Ms": 0.357,
+ "maxMs": 0.357
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.094,
+ "maxMs": 0.094
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.677,
+ "maxMs": 1.677
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.677,
+ "p50Ms": 1.677,
+ "p95Ms": 1.677,
+ "maxMs": 1.677,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255928,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 315.56,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.8,
+ "avgMs": 0.8,
+ "p95Ms": 0.8,
+ "maxMs": 0.8
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.25,
+ "maxMs": 0.25
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.551,
+ "maxMs": 2.551
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.55,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.55,
+ "avgMs": 2.551,
+ "p50Ms": 2.551,
+ "p95Ms": 2.551,
+ "maxMs": 2.551,
+ "mainThreadMs": 2.55,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 271640,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 316.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.483,
+ "p95Ms": 0.483,
+ "maxMs": 0.483
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.119,
+ "maxMs": 0.119
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.757,
+ "maxMs": 1.757
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.76,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.76,
+ "avgMs": 1.757,
+ "p50Ms": 1.757,
+ "p95Ms": 1.757,
+ "maxMs": 1.757,
+ "mainThreadMs": 1.76,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 275816,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 315.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.628,
+ "p95Ms": 0.628,
+ "maxMs": 0.628
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.149,
+ "maxMs": 0.149
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.497,
+ "maxMs": 1.497
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.5,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.5,
+ "avgMs": 1.497,
+ "p50Ms": 1.497,
+ "p95Ms": 1.497,
+ "maxMs": 1.497,
+ "mainThreadMs": 1.5,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 271752,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/polylines-200x50.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polylines-200x50.json
new file mode 100644
index 0000000..66e1e74
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/polylines-200x50.json
@@ -0,0 +1,534 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polylines-200x50",
+ "name": "200 polylines of 50 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polylines: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:12:17.457Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4307,
+ "load": {
+ "commitMs": 1.26,
+ "readyMs": 80,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 13.69,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 13.66,
+ "avgMs": 6.83,
+ "p50Ms": 0.001,
+ "p95Ms": 13.659,
+ "maxMs": 13.659,
+ "mainThreadMs": 13.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.001,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1949576,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 201,
+ "durationMs": 3495.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.7,
+ "p50": 58,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.33,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 37.69,
+ "worst": 50,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 194,
+ 1,
+ 1,
+ 4,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 6,
+ "jankRatio": 0.0299,
+ "droppedFrames": 8,
+ "longFrames": 1,
+ "overBudgetFrames": 7
+ },
+ "js": {
+ "lagMs": {
+ "samples": 210,
+ "p50": 0,
+ "p95": 0.5,
+ "p99": 0.68,
+ "max": 0.75
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.17,
+ "max": 17.42
+ },
+ "lateFrames": 0,
+ "busyMs": 30,
+ "busyRatio": 0.0086,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3495.6,
+ "commits": {
+ "count": 3,
+ "totalMs": 3.49,
+ "avgMs": 1.162,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.221,
+ "maxMs": 0.286
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 29.576,
+ "maxMs": 30.875
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 90.08,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 88.73,
+ "avgMs": 29.576,
+ "p50Ms": 28.965,
+ "p95Ms": 30.875,
+ "maxMs": 30.875,
+ "mainThreadMs": 88.73,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.36,
+ "avgMs": 0.339,
+ "p50Ms": 0.286,
+ "p95Ms": 0.401,
+ "maxMs": 0.401,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193,
+ "afterLoadMB": 248.5,
+ "afterInteractionMB": 346.2,
+ "afterCleanupMB": 192.1,
+ "peakMB": 346.2,
+ "loadDeltaMB": 55.5,
+ "interactionDeltaMB": 97.7,
+ "retainedAfterCleanupMB": -0.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193,
+ "residentMB": 341.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 136232,
+ "mallocMB": 94.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 248.5,
+ "residentMB": 369.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 300580,
+ "mallocMB": 132
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 346.2,
+ "residentMB": 474.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 414287,
+ "mallocMB": 154.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.1,
+ "residentMB": 384.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 137960,
+ "mallocMB": 94.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 3733064,
+ "gcCount": 1,
+ "gcTimeMs": 0.001592666999999992,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 113707,
+ "mallocBytesDelta": 23741872
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1131,
+ "wallMs": 3497,
+ "percent": 32.3,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 800,
+ "coordinates": 40000,
+ "estimatedBytes": 1850384
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 200,
+ "coordinates": 10000,
+ "estimatedBytes": 462596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 0
+ },
+ "wallMs": 313.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.881,
+ "p95Ms": 0.881,
+ "maxMs": 0.881
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.205,
+ "maxMs": 0.205
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 28.965,
+ "maxMs": 28.965
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 28.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 28.96,
+ "avgMs": 28.965,
+ "p50Ms": 28.965,
+ "p95Ms": 28.965,
+ "maxMs": 28.965,
+ "mainThreadMs": 28.96,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 812912,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 1
+ },
+ "wallMs": 315.93,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.823,
+ "p95Ms": 0.823,
+ "maxMs": 0.823
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.173,
+ "maxMs": 0.173
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 28.889,
+ "maxMs": 28.889
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 28.89,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 28.89,
+ "avgMs": 28.889,
+ "p50Ms": 28.889,
+ "p95Ms": 28.889,
+ "maxMs": 28.889,
+ "mainThreadMs": 28.89,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 812200,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 2
+ },
+ "wallMs": 316.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.783,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.286,
+ "maxMs": 0.286
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 30.875,
+ "maxMs": 30.875
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 30.87,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 30.87,
+ "avgMs": 30.875,
+ "p50Ms": 30.875,
+ "p95Ms": 30.875,
+ "maxMs": 30.875,
+ "mainThreadMs": 30.87,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 811192,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/run.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/run.json
new file mode 100644
index 0000000..32293db
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/run.json
@@ -0,0 +1,38330 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "suite": "baseline",
+ "startedAt": "2026-09-10T14:07:50.382Z",
+ "finishedAt": "2026-09-10T14:19:12.571Z",
+ "platform": "ios",
+ "provider": "apple",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "scenarios": [
+ "markers-100",
+ "markers-1k",
+ "markers-10k",
+ "markers-50k",
+ "markers-children-1k",
+ "markers-10k-rich",
+ "camera-fast-pan-0",
+ "camera-fast-pan-1k",
+ "camera-idle-10k",
+ "camera-slow-pan-10k",
+ "camera-fast-pan-10k",
+ "camera-continuous-pan-10k",
+ "camera-zoom-in-10k",
+ "camera-zoom-out-10k",
+ "camera-rapid-zoom-10k",
+ "camera-rotate-10k",
+ "camera-pitch-10k",
+ "camera-rapid-10k",
+ "camera-fast-pan-50k",
+ "mutations-10k",
+ "mutations-1k-children",
+ "mutations-continuous-1k",
+ "mutations-continuous-10k",
+ "polyline-100",
+ "polyline-1k",
+ "polyline-10k",
+ "polyline-100k",
+ "polygon-100",
+ "polygon-1k",
+ "polygon-10k",
+ "polylines-200x50",
+ "polygons-200x20",
+ "cluster-1k",
+ "cluster-10k",
+ "cluster-50k",
+ "combined-10k-camera",
+ "combined-10k-cluster-camera",
+ "combined-10k-updates",
+ "combined-10k-polyline",
+ "combined-10k-polygon",
+ "combined-all",
+ "stability-5m"
+ ],
+ "results": [
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-100",
+ "name": "100 markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 100 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:07:56.307Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3745,
+ "load": {
+ "commitMs": 0.64,
+ "readyMs": 256,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 115,
+ "mainThreadMs": 38.74,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.07,
+ "avgMs": 0.022,
+ "p50Ms": 0.012,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 200
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 1.25,
+ "avgMs": 0.626,
+ "p50Ms": 0.081,
+ "p95Ms": 1.171,
+ "maxMs": 1.171,
+ "mainThreadMs": 1.25,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.212,
+ "p50Ms": 0.212,
+ "p95Ms": 0.212,
+ "maxMs": 0.212,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.04,
+ "avgMs": 1.043,
+ "p50Ms": 1.043,
+ "p95Ms": 1.043,
+ "maxMs": 1.043,
+ "mainThreadMs": 1.04,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "annotation.viewFor": {
+ "count": 100,
+ "totalMs": 36.05,
+ "avgMs": 0.361,
+ "p50Ms": 0.009,
+ "p95Ms": 0.017,
+ "maxMs": 34.959,
+ "mainThreadMs": 36.05,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 276152,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 173,
+ "durationMs": 2928.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.3,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.86,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 21.29,
+ "worst": 45.38,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 171,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0058,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 177,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.8,
+ "max": 0.88
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.14,
+ "max": 17.55
+ },
+ "lateFrames": 0,
+ "busyMs": 22.4,
+ "busyRatio": 0.0076,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2930.6,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 6,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.62,
+ "avgMs": 0.406,
+ "p50Ms": 0.333,
+ "p95Ms": 0.56,
+ "maxMs": 0.56,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.195,
+ "p50Ms": 0.195,
+ "p95Ms": 0.195,
+ "maxMs": 0.195,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 124.2,
+ "afterLoadMB": 185,
+ "afterInteractionMB": 260.4,
+ "afterCleanupMB": 190.5,
+ "peakMB": 260.4,
+ "loadDeltaMB": 60.8,
+ "interactionDeltaMB": 75.4,
+ "retainedAfterCleanupMB": 66.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 124.2,
+ "residentMB": 359.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 92877,
+ "mallocMB": 82.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 185,
+ "residentMB": 348.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 265114,
+ "mallocMB": 117.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 260.4,
+ "residentMB": 402,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 358821,
+ "mallocMB": 136.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 190.5,
+ "residentMB": 391.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 199005,
+ "mallocMB": 98.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 111568,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 93707,
+ "mallocBytesDelta": 19442768
+ }
+ },
+ "cpu": {
+ "processCpuMs": 901,
+ "wallMs": 2937,
+ "percent": 30.7,
+ "threadsBefore": 21,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 100,
+ "coordinates": 100,
+ "estimatedBytes": 7172
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-1k",
+ "name": "1k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 1000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:08:02.074Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3751,
+ "load": {
+ "commitMs": 2.87,
+ "readyMs": 75,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 5.58,
+ "backgroundMs": 0.57,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.18,
+ "avgMs": 0.059,
+ "p50Ms": 0.078,
+ "p95Ms": 0.098,
+ "maxMs": 0.098,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.09,
+ "avgMs": 0.047,
+ "p50Ms": 0.003,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.53,
+ "avgMs": 0.178,
+ "p50Ms": 0.153,
+ "p95Ms": 0.238,
+ "maxMs": 0.238,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 5.25,
+ "avgMs": 1.311,
+ "p50Ms": 0.017,
+ "p95Ms": 5.185,
+ "maxMs": 5.185,
+ "mainThreadMs": 5.25,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 517544,
+ "heapSizeAfterBytes": 8388608
+ }
+ },
+ "frames": {
+ "frames": 171,
+ "durationMs": 2931.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.6,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.06,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 49.96,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 167,
+ 1,
+ 0,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0175,
+ "droppedFrames": 4,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0,
+ "p95": 0.57,
+ "p99": 0.78,
+ "max": 0.8
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.24,
+ "max": 17.47
+ },
+ "lateFrames": 0,
+ "busyMs": 29.2,
+ "busyRatio": 0.01,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2932.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 146,
+ "mainThreadMs": 3.15,
+ "backgroundMs": 1.66,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.17,
+ "avgMs": 0.541,
+ "p50Ms": 0.326,
+ "p95Ms": 0.818,
+ "maxMs": 0.818,
+ "mainThreadMs": 2.17,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 0.28,
+ "avgMs": 0.01,
+ "p50Ms": 0.008,
+ "p95Ms": 0.03,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.28,
+ "items": 28000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.05,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 109
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.39,
+ "avgMs": 0.014,
+ "p50Ms": 0.011,
+ "p95Ms": 0.034,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.39,
+ "items": 48
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 0.93,
+ "avgMs": 0.033,
+ "p50Ms": 0.032,
+ "p95Ms": 0.055,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 109
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 0.92,
+ "avgMs": 0.033,
+ "p50Ms": 0.001,
+ "p95Ms": 0.228,
+ "maxMs": 0.404,
+ "mainThreadMs": 0.92,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.8,
+ "afterLoadMB": 180.4,
+ "afterInteractionMB": 264.3,
+ "afterCleanupMB": 192.9,
+ "peakMB": 264.3,
+ "loadDeltaMB": -10.4,
+ "interactionDeltaMB": 83.9,
+ "retainedAfterCleanupMB": 2.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.8,
+ "residentMB": 392.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 197212,
+ "mallocMB": 97.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 180.4,
+ "residentMB": 356.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 267099,
+ "mallocMB": 116
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 264.3,
+ "residentMB": 382.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 357314,
+ "mallocMB": 137
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.9,
+ "residentMB": 373.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 202173,
+ "mallocMB": 98.7
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 171744,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 8
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 90215,
+ "mallocBytesDelta": 22056112
+ }
+ },
+ "cpu": {
+ "processCpuMs": 938,
+ "wallMs": 2935,
+ "percent": 32,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-10k",
+ "name": "10k markers",
+ "group": "markers",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Mount 10000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:08:08.840Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3749,
+ "load": {
+ "commitMs": 12.7,
+ "readyMs": 77,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.23,
+ "backgroundMs": 4.25,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.22,
+ "avgMs": 0.406,
+ "p50Ms": 0.579,
+ "p95Ms": 0.639,
+ "maxMs": 0.639,
+ "mainThreadMs": 1.22,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.65,
+ "avgMs": 0.327,
+ "p50Ms": 0.003,
+ "p95Ms": 0.651,
+ "maxMs": 0.651,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.15,
+ "avgMs": 1.385,
+ "p50Ms": 1.464,
+ "p95Ms": 1.469,
+ "maxMs": 1.469,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.15,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.25,
+ "avgMs": 0.086,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 4.582,
+ "mainThreadMs": 5.25,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0014962500000000002,
+ "allocatedBytes": 4455520,
+ "heapSizeAfterBytes": 12582912
+ }
+ },
+ "frames": {
+ "frames": 169,
+ "durationMs": 2937.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.9,
+ "p50": 59,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.26,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 36.61,
+ "worst": 43.79,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 163,
+ 1,
+ 0,
+ 5,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 5,
+ "jankRatio": 0.0296,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0.06,
+ "p95": 0.45,
+ "p99": 0.72,
+ "max": 1.16
+ },
+ "frameGapMs": {
+ "p50": 16.72,
+ "p95": 17.12,
+ "max": 17.82
+ },
+ "lateFrames": 0,
+ "busyMs": 21.8,
+ "busyRatio": 0.0074,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2937.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 172,
+ "mainThreadMs": 8.03,
+ "backgroundMs": 5.79,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.75,
+ "avgMs": 0.687,
+ "p50Ms": 0.67,
+ "p95Ms": 1,
+ "maxMs": 1,
+ "mainThreadMs": 2.75,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 2.11,
+ "avgMs": 0.075,
+ "p50Ms": 0.011,
+ "p95Ms": 0.052,
+ "maxMs": 1.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.11,
+ "items": 280000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.18,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.02,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1199
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.46,
+ "avgMs": 0.016,
+ "p50Ms": 0.015,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 305
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 3.04,
+ "avgMs": 0.108,
+ "p50Ms": 0.039,
+ "p95Ms": 0.148,
+ "maxMs": 1.807,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.04,
+ "items": 1199
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 4.78,
+ "avgMs": 0.171,
+ "p50Ms": 0.192,
+ "p95Ms": 0.425,
+ "maxMs": 0.585,
+ "mainThreadMs": 4.78,
+ "backgroundMs": 0,
+ "items": 87
+ },
+ "annotation.viewFor": {
+ "count": 18,
+ "totalMs": 0.49,
+ "avgMs": 0.027,
+ "p50Ms": 0.026,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 10,
+ "totalMs": 0.02,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 18
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193.2,
+ "afterLoadMB": 192.6,
+ "afterInteractionMB": 253.4,
+ "afterCleanupMB": 201.1,
+ "peakMB": 253.4,
+ "loadDeltaMB": -0.6,
+ "interactionDeltaMB": 60.8,
+ "retainedAfterCleanupMB": 7.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193.2,
+ "residentMB": 374.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 202717,
+ "mallocMB": 98.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 192.6,
+ "residentMB": 387.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 282638,
+ "mallocMB": 129
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 253.4,
+ "residentMB": 435.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 369896,
+ "mallocMB": 150.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 201.1,
+ "residentMB": 418.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 206693,
+ "mallocMB": 104.7
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 160680,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 12
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 87258,
+ "mallocBytesDelta": 22780384
+ }
+ },
+ "cpu": {
+ "processCpuMs": 933,
+ "wallMs": 2942,
+ "percent": 31.7,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-50k",
+ "name": "50k markers",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 50000 markers through the bulk prop, settle, then a short 3-leg pan.",
+ "recordedAt": "2026-09-10T14:08:17.208Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3747,
+ "load": {
+ "commitMs": 41.86,
+ "readyMs": 117,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 308,
+ "mainThreadMs": 16.56,
+ "backgroundMs": 23.66,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 6.25,
+ "avgMs": 2.084,
+ "p50Ms": 2.628,
+ "p95Ms": 3.622,
+ "maxMs": 3.622,
+ "mainThreadMs": 6.25,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 2.67,
+ "avgMs": 1.336,
+ "p50Ms": 0.002,
+ "p95Ms": 2.67,
+ "maxMs": 2.67,
+ "mainThreadMs": 2.67,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 23.36,
+ "avgMs": 7.787,
+ "p50Ms": 7.469,
+ "p95Ms": 8.919,
+ "maxMs": 8.919,
+ "mainThreadMs": 0,
+ "backgroundMs": 23.36,
+ "items": 150000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.043,
+ "p50Ms": 0.043,
+ "p95Ms": 0.043,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.033,
+ "p50Ms": 0.033,
+ "p95Ms": 0.033,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 413
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.066,
+ "p50Ms": 0.066,
+ "p95Ms": 0.066,
+ "maxMs": 0.066,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 287
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.152,
+ "p50Ms": 0.152,
+ "p95Ms": 0.152,
+ "maxMs": 0.152,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 413
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.322,
+ "p50Ms": 0.322,
+ "p95Ms": 0.322,
+ "maxMs": 0.322,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 287
+ },
+ "annotation.viewFor": {
+ "count": 287,
+ "totalMs": 7.29,
+ "avgMs": 0.025,
+ "p50Ms": 0.008,
+ "p95Ms": 0.011,
+ "maxMs": 4.679,
+ "mainThreadMs": 7.29,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 287
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.004350875999999999,
+ "allocatedBytes": 21621520,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 165,
+ "durationMs": 2932.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 56.6,
+ "p50": 60,
+ "p95": 50,
+ "p99": 50,
+ "worstWindow": 50,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.68,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 52.15,
+ "worst": 101.39,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 160,
+ 1,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0242,
+ "droppedFrames": 10,
+ "longFrames": 2,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 177,
+ "p50": 0,
+ "p95": 0.47,
+ "p99": 0.58,
+ "max": 0.65
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.13,
+ "max": 17.31
+ },
+ "lateFrames": 0,
+ "busyMs": 22,
+ "busyRatio": 0.0075,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2933.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 231,
+ "mainThreadMs": 13.77,
+ "backgroundMs": 10.02,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.08,
+ "avgMs": 0.52,
+ "p50Ms": 0.518,
+ "p95Ms": 0.548,
+ "maxMs": 0.548,
+ "mainThreadMs": 2.08,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 3.25,
+ "avgMs": 0.116,
+ "p50Ms": 0.04,
+ "p95Ms": 0.628,
+ "maxMs": 1.283,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.25,
+ "items": 1400000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.65,
+ "avgMs": 0.023,
+ "p50Ms": 0.014,
+ "p95Ms": 0.073,
+ "maxMs": 0.197,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.65,
+ "items": 5274
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.91,
+ "avgMs": 0.033,
+ "p50Ms": 0.022,
+ "p95Ms": 0.081,
+ "maxMs": 0.181,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.91,
+ "items": 1518
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 5.21,
+ "avgMs": 0.186,
+ "p50Ms": 0.092,
+ "p95Ms": 0.696,
+ "maxMs": 1.45,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.21,
+ "items": 5274
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 10.62,
+ "avgMs": 0.379,
+ "p50Ms": 0.34,
+ "p95Ms": 1.007,
+ "maxMs": 1.139,
+ "mainThreadMs": 10.62,
+ "backgroundMs": 0,
+ "items": 398
+ },
+ "annotation.viewFor": {
+ "count": 72,
+ "totalMs": 1.03,
+ "avgMs": 0.014,
+ "p50Ms": 0.008,
+ "p95Ms": 0.048,
+ "maxMs": 0.049,
+ "mainThreadMs": 1.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 15,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 72
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 201.5,
+ "afterLoadMB": 260.5,
+ "afterInteractionMB": 355.3,
+ "afterCleanupMB": 240,
+ "peakMB": 355.3,
+ "loadDeltaMB": 59,
+ "interactionDeltaMB": 94.8,
+ "retainedAfterCleanupMB": 38.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 201.5,
+ "residentMB": 418.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 207255,
+ "mallocMB": 104.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 260.5,
+ "residentMB": 391.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 316057,
+ "mallocMB": 175.5
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 355.3,
+ "residentMB": 360.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 393235,
+ "mallocMB": 209.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 240,
+ "residentMB": 381.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 207613,
+ "mallocMB": 130.6
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 171496,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 77178,
+ "mallocBytesDelta": 35820272
+ }
+ },
+ "cpu": {
+ "processCpuMs": 841,
+ "wallMs": 2947,
+ "percent": 28.5,
+ "threadsBefore": 24,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-children-1k",
+ "name": "1k children",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Mount 1000 markers as children (collected from React children on every render), then a short pan.",
+ "recordedAt": "2026-09-10T14:08:23.441Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3746,
+ "load": {
+ "commitMs": 4.36,
+ "readyMs": 60,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 4.64,
+ "backgroundMs": 0.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.12,
+ "avgMs": 0.041,
+ "p50Ms": 0.053,
+ "p95Ms": 0.071,
+ "maxMs": 0.071,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.032,
+ "p50Ms": 0.003,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.41,
+ "avgMs": 0.138,
+ "p50Ms": 0.125,
+ "p95Ms": 0.173,
+ "maxMs": 0.173,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 4.4,
+ "avgMs": 1.1,
+ "p50Ms": 0.017,
+ "p95Ms": 4.347,
+ "maxMs": 4.347,
+ "mainThreadMs": 4.4,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1439224,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 172,
+ "durationMs": 2930.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59,
+ "p50": 60,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 16.96,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 46.9,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 169,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0116,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.67,
+ "max": 0.82
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.19,
+ "max": 17.49
+ },
+ "lateFrames": 0,
+ "busyMs": 23.7,
+ "busyRatio": 0.0081,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931.8,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 151,
+ "mainThreadMs": 3.35,
+ "backgroundMs": 1.7,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.112,
+ "p50Ms": 0.112,
+ "p95Ms": 0.112,
+ "maxMs": 0.112,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.91,
+ "avgMs": 0.477,
+ "p50Ms": 0.435,
+ "p95Ms": 0.71,
+ "maxMs": 0.71,
+ "mainThreadMs": 1.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 0.33,
+ "avgMs": 0.012,
+ "p50Ms": 0.007,
+ "p95Ms": 0.039,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.33,
+ "items": 28000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.06,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 109
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.36,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.024,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 48
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 0.96,
+ "avgMs": 0.034,
+ "p50Ms": 0.027,
+ "p95Ms": 0.068,
+ "maxMs": 0.072,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 109
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 1.14,
+ "avgMs": 0.041,
+ "p50Ms": 0.001,
+ "p95Ms": 0.341,
+ "maxMs": 0.442,
+ "mainThreadMs": 1.14,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 240.5,
+ "afterLoadMB": 233.9,
+ "afterInteractionMB": 312.8,
+ "afterCleanupMB": 241.7,
+ "peakMB": 312.8,
+ "loadDeltaMB": -6.6,
+ "interactionDeltaMB": 78.9,
+ "retainedAfterCleanupMB": 1.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 240.5,
+ "residentMB": 381.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 208202,
+ "mallocMB": 130.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 233.9,
+ "residentMB": 366.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 278520,
+ "mallocMB": 152.3
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 312.8,
+ "residentMB": 362.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 367365,
+ "mallocMB": 170.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 241.7,
+ "residentMB": 334.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 212249,
+ "mallocMB": 131.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 149376,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 88845,
+ "mallocBytesDelta": 18955408
+ }
+ },
+ "cpu": {
+ "processCpuMs": 943,
+ "wallMs": 2939,
+ "percent": 32.1,
+ "threadsBefore": 21,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 1,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "markers-10k-rich",
+ "name": "10k markers with titles and visual props",
+ "group": "markers",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Same as markers-10k but every descriptor carries title, subtitle, rotation, opacity, anchor and flat, to measure optional-field conversion cost.",
+ "recordedAt": "2026-09-10T14:08:30.240Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3744,
+ "load": {
+ "commitMs": 9.07,
+ "readyMs": 95,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 84,
+ "mainThreadMs": 12.98,
+ "backgroundMs": 5.43,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 2.55,
+ "avgMs": 0.85,
+ "p50Ms": 1.235,
+ "p95Ms": 1.315,
+ "maxMs": 1.315,
+ "mainThreadMs": 2.55,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 1.27,
+ "avgMs": 0.633,
+ "p50Ms": 0.002,
+ "p95Ms": 1.265,
+ "maxMs": 1.265,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.24,
+ "avgMs": 1.746,
+ "p50Ms": 1.589,
+ "p95Ms": 2.156,
+ "maxMs": 2.156,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.24,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 85
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 63
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 85
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 63
+ },
+ "annotation.viewFor": {
+ "count": 63,
+ "totalMs": 9.04,
+ "avgMs": 0.143,
+ "p50Ms": 0.011,
+ "p95Ms": 0.022,
+ "maxMs": 8.284,
+ "mainThreadMs": 9.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 63
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.021385334000000006,
+ "allocatedBytes": 7826512,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 170,
+ "durationMs": 2930.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.3,
+ "p50": 60,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.16,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.95,
+ "worst": 41.7,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 165,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0235,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 176,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.58,
+ "max": 0.7
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.19,
+ "max": 17.37
+ },
+ "lateFrames": 0,
+ "busyMs": 26.2,
+ "busyRatio": 0.0089,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2931,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 160,
+ "mainThreadMs": 7.1,
+ "backgroundMs": 3.31,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.06,
+ "avgMs": 0.516,
+ "p50Ms": 0.467,
+ "p95Ms": 0.769,
+ "maxMs": 0.769,
+ "mainThreadMs": 2.06,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 28,
+ "totalMs": 0.75,
+ "avgMs": 0.027,
+ "p50Ms": 0.011,
+ "p95Ms": 0.039,
+ "maxMs": 0.354,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.75,
+ "items": 280000
+ },
+ "markers.viewportFilter": {
+ "count": 28,
+ "totalMs": 0.23,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 1036
+ },
+ "markers.diff": {
+ "count": 28,
+ "totalMs": 0.53,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.031,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.53,
+ "items": 366
+ },
+ "markers.viewportCompute": {
+ "count": 28,
+ "totalMs": 1.8,
+ "avgMs": 0.064,
+ "p50Ms": 0.043,
+ "p95Ms": 0.114,
+ "maxMs": 0.491,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.8,
+ "items": 1036
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 4.68,
+ "avgMs": 0.167,
+ "p50Ms": 0.165,
+ "p95Ms": 0.523,
+ "maxMs": 0.679,
+ "mainThreadMs": 4.68,
+ "backgroundMs": 0,
+ "items": 74
+ },
+ "annotation.viewFor": {
+ "count": 9,
+ "totalMs": 0.34,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 7,
+ "totalMs": 0.01,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 9
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 242.3,
+ "afterLoadMB": 218.9,
+ "afterInteractionMB": 298.4,
+ "afterCleanupMB": 220.2,
+ "peakMB": 298.4,
+ "loadDeltaMB": -23.4,
+ "interactionDeltaMB": 79.5,
+ "retainedAfterCleanupMB": -22.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 242.3,
+ "residentMB": 330,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 212862,
+ "mallocMB": 131.9
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 218.9,
+ "residentMB": 359.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 290887,
+ "mallocMB": 131.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 298.4,
+ "residentMB": 391.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 380267,
+ "mallocMB": 151.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 220.2,
+ "residentMB": 383.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 214904,
+ "mallocMB": 105.6
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 151792,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 89380,
+ "mallocBytesDelta": 21284192
+ }
+ },
+ "cpu": {
+ "processCpuMs": 966,
+ "wallMs": 2935,
+ "percent": 32.9,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 1898752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-0",
+ "name": "Camera fast-pan, 0 markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 0 markers.",
+ "recordedAt": "2026-09-10T14:08:36.490Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4546,
+ "load": {
+ "commitMs": 1.11,
+ "readyMs": 80,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 55224,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 221,
+ "durationMs": 3733.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.82,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 48.05,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 219,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0045,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 224,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.57,
+ "max": 0.62
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.29
+ },
+ "lateFrames": 0,
+ "busyMs": 25.2,
+ "busyRatio": 0.0067,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3734.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 2.37,
+ "backgroundMs": 0,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 2.37,
+ "avgMs": 0.338,
+ "p50Ms": 0.302,
+ "p95Ms": 0.544,
+ "maxMs": 0.544,
+ "mainThreadMs": 2.37,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 220.9,
+ "afterLoadMB": 211.9,
+ "afterInteractionMB": 320.9,
+ "afterCleanupMB": 171,
+ "peakMB": 320.9,
+ "loadDeltaMB": -9,
+ "interactionDeltaMB": 109,
+ "retainedAfterCleanupMB": -49.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 220.9,
+ "residentMB": 380.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 215506,
+ "mallocMB": 105.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 211.9,
+ "residentMB": 338.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 283124,
+ "mallocMB": 126.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 320.9,
+ "residentMB": 403.7,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 426557,
+ "mallocMB": 158.3
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 171,
+ "residentMB": 362.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 130459,
+ "mallocMB": 92.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 122040,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 143433,
+ "mallocBytesDelta": 33805536
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1275,
+ "wallMs": 3737,
+ "percent": 34.1,
+ "threadsBefore": 21,
+ "threadsAfter": 24,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "region": 1
+ },
+ "payload": {},
+ "largestUpdate": {},
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-1k",
+ "name": "Camera fast-pan, 1k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 1000 markers.",
+ "recordedAt": "2026-09-10T14:08:42.757Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4542,
+ "load": {
+ "commitMs": 2.97,
+ "readyMs": 94,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 19.44,
+ "backgroundMs": 0.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.13,
+ "avgMs": 0.043,
+ "p50Ms": 0.064,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.038,
+ "p50Ms": 0.003,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.45,
+ "avgMs": 0.149,
+ "p50Ms": 0.146,
+ "p95Ms": 0.172,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.45,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 19.19,
+ "avgMs": 4.797,
+ "p50Ms": 0.015,
+ "p95Ms": 19.135,
+ "maxMs": 19.135,
+ "mainThreadMs": 19.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005713166999999998,
+ "allocatedBytes": 518888,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 221,
+ "durationMs": 3722.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.82,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 50.99,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 220,
+ 0,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0045,
+ "droppedFrames": 2,
+ "longFrames": 1,
+ "overBudgetFrames": 1
+ },
+ "js": {
+ "lagMs": {
+ "samples": 224,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.61,
+ "max": 0.7
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.37
+ },
+ "lateFrames": 0,
+ "busyMs": 21.9,
+ "busyRatio": 0.0059,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3723.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 187,
+ "mainThreadMs": 4.73,
+ "backgroundMs": 1.44,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 3.47,
+ "avgMs": 0.496,
+ "p50Ms": 0.37,
+ "p95Ms": 1.202,
+ "maxMs": 1.202,
+ "mainThreadMs": 3.47,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.29,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.021,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.29,
+ "items": 35000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 0.03,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 128
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.3,
+ "avgMs": 0.009,
+ "p50Ms": 0.004,
+ "p95Ms": 0.022,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 24
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 0.82,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.039,
+ "maxMs": 0.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.82,
+ "items": 128
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 1.1,
+ "avgMs": 0.031,
+ "p50Ms": 0.001,
+ "p95Ms": 0.21,
+ "maxMs": 0.222,
+ "mainThreadMs": 1.1,
+ "backgroundMs": 0,
+ "items": 8
+ },
+ "annotation.viewFor": {
+ "count": 3,
+ "totalMs": 0.15,
+ "avgMs": 0.051,
+ "p50Ms": 0.056,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 3
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 171.7,
+ "afterLoadMB": 189,
+ "afterInteractionMB": 321.9,
+ "afterCleanupMB": 236.8,
+ "peakMB": 321.9,
+ "loadDeltaMB": 17.3,
+ "interactionDeltaMB": 132.9,
+ "retainedAfterCleanupMB": 65.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 171.7,
+ "residentMB": 363.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 131172,
+ "mallocMB": 93.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 189,
+ "residentMB": 389.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 281978,
+ "mallocMB": 120.7
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 321.9,
+ "residentMB": 370,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 429326,
+ "mallocMB": 153.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 236.8,
+ "residentMB": 358,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 218272,
+ "mallocMB": 100.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 182920,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 147348,
+ "mallocBytesDelta": 34757280
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1147,
+ "wallMs": 3726,
+ "percent": 30.8,
+ "threadsBefore": 24,
+ "threadsAfter": 24,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-idle-10k",
+ "name": "Camera idle, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "No camera movement for 5 s; measures the resting cost of the scene. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:08:51.624Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5834,
+ "load": {
+ "commitMs": 11.2,
+ "readyMs": 95,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 10.65,
+ "backgroundMs": 4.78,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.27,
+ "avgMs": 0.423,
+ "p50Ms": 0.601,
+ "p95Ms": 0.667,
+ "maxMs": 0.667,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.62,
+ "avgMs": 0.312,
+ "p50Ms": 0.002,
+ "p95Ms": 0.622,
+ "maxMs": 0.622,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.65,
+ "avgMs": 1.551,
+ "p50Ms": 1.507,
+ "p95Ms": 1.975,
+ "maxMs": 1.975,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.65,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 8.64,
+ "avgMs": 0.142,
+ "p50Ms": 0.011,
+ "p95Ms": 0.023,
+ "maxMs": 7.919,
+ "mainThreadMs": 8.64,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001865791999999998,
+ "allocatedBytes": 4455984,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 300,
+ "durationMs": 5014.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 300,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0
+ },
+ "js": {
+ "lagMs": {
+ "samples": 302,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.54,
+ "max": 0.74
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.15,
+ "max": 17.41
+ },
+ "lateFrames": 0,
+ "busyMs": 33,
+ "busyRatio": 0.0066,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5014.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "byName": {}
+ },
+ "memory": {
+ "beforeMB": 237.5,
+ "afterLoadMB": 226.1,
+ "afterInteractionMB": 233.4,
+ "afterCleanupMB": 194.2,
+ "peakMB": 237.5,
+ "loadDeltaMB": -11.4,
+ "interactionDeltaMB": 7.3,
+ "retainedAfterCleanupMB": -43.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 237.5,
+ "residentMB": 352.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 218975,
+ "mallocMB": 101.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 226.1,
+ "residentMB": 378.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 295680,
+ "mallocMB": 130.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 233.4,
+ "residentMB": 339.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 275073,
+ "mallocMB": 132.6
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 194.2,
+ "residentMB": 317,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 195869,
+ "mallocMB": 104.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 122056,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -20607,
+ "mallocBytesDelta": 2124384
+ }
+ },
+ "cpu": {
+ "processCpuMs": 86,
+ "wallMs": 5019,
+ "percent": 1.7,
+ "threadsBefore": 23,
+ "threadsAfter": 8,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-slow-pan-10k",
+ "name": "Camera slow-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four slow animated pan legs (1.2 s each, small steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:02.140Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7476,
+ "load": {
+ "commitMs": 9.43,
+ "readyMs": 97,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.79,
+ "backgroundMs": 4.34,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.38,
+ "avgMs": 0.46,
+ "p50Ms": 0.535,
+ "p95Ms": 0.845,
+ "maxMs": 0.845,
+ "mainThreadMs": 1.38,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.56,
+ "avgMs": 0.282,
+ "p50Ms": 0.003,
+ "p95Ms": 0.561,
+ "maxMs": 0.561,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.2,
+ "avgMs": 1.401,
+ "p50Ms": 1.322,
+ "p95Ms": 1.778,
+ "maxMs": 1.778,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.2,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.075,
+ "p50Ms": 0.075,
+ "p95Ms": 0.075,
+ "maxMs": 0.075,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.156,
+ "p50Ms": 0.156,
+ "p95Ms": 0.156,
+ "maxMs": 0.156,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.66,
+ "avgMs": 0.093,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 5.028,
+ "mainThreadMs": 5.66,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0031082090000000007,
+ "allocatedBytes": 4455528,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 394,
+ "durationMs": 6657.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 60,
+ "p95": 56,
+ "p99": 56,
+ "worstWindow": 56,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.88,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 45.82,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 389,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0102,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 400,
+ "p50": 0.01,
+ "p95": 0.47,
+ "p99": 0.54,
+ "max": 0.63
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.14,
+ "max": 17.29
+ },
+ "lateFrames": 0,
+ "busyMs": 53.4,
+ "busyRatio": 0.008,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6658.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 371,
+ "mainThreadMs": 11.58,
+ "backgroundMs": 5.86,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.35,
+ "avgMs": 0.471,
+ "p50Ms": 0.485,
+ "p95Ms": 0.691,
+ "maxMs": 0.691,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 65,
+ "totalMs": 1.08,
+ "avgMs": 0.017,
+ "p50Ms": 0.011,
+ "p95Ms": 0.039,
+ "maxMs": 0.094,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.08,
+ "items": 650000
+ },
+ "markers.viewportFilter": {
+ "count": 65,
+ "totalMs": 0.49,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.021,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.49,
+ "items": 2828
+ },
+ "markers.diff": {
+ "count": 65,
+ "totalMs": 1.12,
+ "avgMs": 0.017,
+ "p50Ms": 0.014,
+ "p95Ms": 0.036,
+ "maxMs": 0.06,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.12,
+ "items": 743
+ },
+ "markers.viewportCompute": {
+ "count": 65,
+ "totalMs": 3.18,
+ "avgMs": 0.049,
+ "p50Ms": 0.042,
+ "p95Ms": 0.093,
+ "maxMs": 0.187,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.18,
+ "items": 2828
+ },
+ "markers.applyDiff": {
+ "count": 65,
+ "totalMs": 8.3,
+ "avgMs": 0.128,
+ "p50Ms": 0.037,
+ "p95Ms": 0.379,
+ "maxMs": 0.74,
+ "mainThreadMs": 8.3,
+ "backgroundMs": 0,
+ "items": 95
+ },
+ "annotation.viewFor": {
+ "count": 22,
+ "totalMs": 0.9,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.067,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.9,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 19,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.9,
+ "afterLoadMB": 221.4,
+ "afterInteractionMB": 307.6,
+ "afterCleanupMB": 227.4,
+ "peakMB": 307.6,
+ "loadDeltaMB": 26.5,
+ "interactionDeltaMB": 86.2,
+ "retainedAfterCleanupMB": 32.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.9,
+ "residentMB": 302.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 196588,
+ "mallocMB": 105
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 221.4,
+ "residentMB": 348.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 277873,
+ "mallocMB": 129.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 307.6,
+ "residentMB": 345.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 363518,
+ "mallocMB": 151.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 227.4,
+ "residentMB": 348.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 201162,
+ "mallocMB": 105.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 299840,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 85645,
+ "mallocBytesDelta": 22640096
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1846,
+ "wallMs": 6664,
+ "percent": 27.7,
+ "threadsBefore": 21,
+ "threadsAfter": 20,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-10k",
+ "name": "Camera fast-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:09.723Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4553,
+ "load": {
+ "commitMs": 10.55,
+ "readyMs": 88,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 17.08,
+ "backgroundMs": 4.1,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.35,
+ "avgMs": 0.449,
+ "p50Ms": 0.6,
+ "p95Ms": 0.747,
+ "maxMs": 0.747,
+ "mainThreadMs": 1.35,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.62,
+ "avgMs": 0.31,
+ "p50Ms": 0.003,
+ "p95Ms": 0.617,
+ "maxMs": 0.617,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.99,
+ "avgMs": 1.331,
+ "p50Ms": 1.344,
+ "p95Ms": 1.462,
+ "maxMs": 1.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.99,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.056,
+ "p50Ms": 0.056,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.094,
+ "p50Ms": 0.094,
+ "p95Ms": 0.094,
+ "maxMs": 0.094,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 15,
+ "avgMs": 0.246,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 14.359,
+ "mainThreadMs": 15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0020168750000000013,
+ "allocatedBytes": 4453272,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 221,
+ "durationMs": 3737.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 60,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.89,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 24.58,
+ "worst": 42.08,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 218,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.009,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 225,
+ "p50": 0.06,
+ "p95": 0.41,
+ "p99": 0.5,
+ "max": 0.77
+ },
+ "frameGapMs": {
+ "p50": 16.72,
+ "p95": 17.08,
+ "max": 17.44
+ },
+ "lateFrames": 0,
+ "busyMs": 28.9,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3737.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 276,
+ "mainThreadMs": 10.6,
+ "backgroundMs": 2.77,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 2.45,
+ "avgMs": 0.35,
+ "p50Ms": 0.309,
+ "p95Ms": 0.64,
+ "maxMs": 0.64,
+ "mainThreadMs": 2.45,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 0.62,
+ "avgMs": 0.018,
+ "p50Ms": 0.009,
+ "p95Ms": 0.082,
+ "maxMs": 0.099,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 350000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 0.22,
+ "avgMs": 0.006,
+ "p50Ms": 0.004,
+ "p95Ms": 0.027,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 1372
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.46,
+ "avgMs": 0.013,
+ "p50Ms": 0.011,
+ "p95Ms": 0.018,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 324
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 1.48,
+ "avgMs": 0.042,
+ "p50Ms": 0.029,
+ "p95Ms": 0.127,
+ "maxMs": 0.197,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.48,
+ "items": 1372
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 7.03,
+ "avgMs": 0.201,
+ "p50Ms": 0.174,
+ "p95Ms": 0.47,
+ "maxMs": 0.692,
+ "mainThreadMs": 7.03,
+ "backgroundMs": 0,
+ "items": 197
+ },
+ "annotation.viewFor": {
+ "count": 73,
+ "totalMs": 1.09,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.042,
+ "maxMs": 0.056,
+ "mainThreadMs": 1.09,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 21,
+ "totalMs": 0.04,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 73
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 177.1,
+ "afterLoadMB": 213.4,
+ "afterInteractionMB": 339.1,
+ "afterCleanupMB": 248.3,
+ "peakMB": 339.1,
+ "loadDeltaMB": 36.3,
+ "interactionDeltaMB": 125.7,
+ "retainedAfterCleanupMB": 71.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 177.1,
+ "residentMB": 348,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 116183,
+ "mallocMB": 92.2
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 213.4,
+ "residentMB": 354.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 277709,
+ "mallocMB": 126.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 339.1,
+ "residentMB": 403.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 429659,
+ "mallocMB": 166.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 248.3,
+ "residentMB": 381.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 210251,
+ "mallocMB": 106.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 220256,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 151950,
+ "mallocBytesDelta": 42755328
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1117,
+ "wallMs": 3741,
+ "percent": 29.9,
+ "threadsBefore": 20,
+ "threadsAfter": 25,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-continuous-pan-10k",
+ "name": "Camera continuous-pan, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Six seconds of back-to-back pan legs with no settle between them. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:19.824Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7058,
+ "load": {
+ "commitMs": 9.31,
+ "readyMs": 104,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 8.06,
+ "backgroundMs": 5.87,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.31,
+ "avgMs": 0.438,
+ "p50Ms": 0.515,
+ "p95Ms": 0.798,
+ "maxMs": 0.798,
+ "mainThreadMs": 1.31,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.54,
+ "avgMs": 0.271,
+ "p50Ms": 0.003,
+ "p95Ms": 0.538,
+ "maxMs": 0.538,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.76,
+ "avgMs": 1.921,
+ "p50Ms": 2.044,
+ "p95Ms": 2.26,
+ "maxMs": 2.26,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.76,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.055,
+ "p50Ms": 0.055,
+ "p95Ms": 0.055,
+ "maxMs": 0.055,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.114,
+ "p50Ms": 0.114,
+ "p95Ms": 0.114,
+ "maxMs": 0.114,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 6.07,
+ "avgMs": 0.1,
+ "p50Ms": 0.01,
+ "p95Ms": 0.016,
+ "maxMs": 5.413,
+ "mainThreadMs": 6.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0027192499999999994,
+ "allocatedBytes": 4452264,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 369,
+ "durationMs": 6242.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.89,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 41.68,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 364,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0108,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 375,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.55,
+ "max": 0.69
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.14,
+ "max": 17.36
+ },
+ "lateFrames": 0,
+ "busyMs": 46.5,
+ "busyRatio": 0.0074,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6242.9,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 488,
+ "mainThreadMs": 23.99,
+ "backgroundMs": 8.42,
+ "byName": {
+ "camera.apply": {
+ "count": 15,
+ "totalMs": 8.43,
+ "avgMs": 0.562,
+ "p50Ms": 0.598,
+ "p95Ms": 0.848,
+ "maxMs": 0.848,
+ "mainThreadMs": 8.43,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 74,
+ "totalMs": 2.28,
+ "avgMs": 0.031,
+ "p50Ms": 0.01,
+ "p95Ms": 0.039,
+ "maxMs": 1.116,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.28,
+ "items": 740000
+ },
+ "markers.viewportFilter": {
+ "count": 74,
+ "totalMs": 0.51,
+ "avgMs": 0.007,
+ "p50Ms": 0.005,
+ "p95Ms": 0.017,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.51,
+ "items": 3148
+ },
+ "markers.diff": {
+ "count": 74,
+ "totalMs": 1.08,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.031,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.08,
+ "items": 633
+ },
+ "markers.viewportCompute": {
+ "count": 74,
+ "totalMs": 4.55,
+ "avgMs": 0.061,
+ "p50Ms": 0.043,
+ "p95Ms": 0.104,
+ "maxMs": 1.212,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.55,
+ "items": 3148
+ },
+ "markers.applyDiff": {
+ "count": 74,
+ "totalMs": 13.56,
+ "avgMs": 0.183,
+ "p50Ms": 0.176,
+ "p95Ms": 0.522,
+ "maxMs": 0.969,
+ "mainThreadMs": 13.56,
+ "backgroundMs": 0,
+ "items": 188
+ },
+ "annotation.viewFor": {
+ "count": 67,
+ "totalMs": 1.94,
+ "avgMs": 0.029,
+ "p50Ms": 0.026,
+ "p95Ms": 0.073,
+ "maxMs": 0.094,
+ "mainThreadMs": 1.94,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 36,
+ "totalMs": 0.07,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.007,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 67
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 249.1,
+ "afterLoadMB": 230.7,
+ "afterInteractionMB": 306.2,
+ "afterCleanupMB": 226.7,
+ "peakMB": 306.2,
+ "loadDeltaMB": -18.4,
+ "interactionDeltaMB": 75.5,
+ "retainedAfterCleanupMB": -22.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 249.1,
+ "residentMB": 349.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 210973,
+ "mallocMB": 106.4
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 230.7,
+ "residentMB": 331.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 288786,
+ "mallocMB": 127.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 306.2,
+ "residentMB": 408.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 371768,
+ "mallocMB": 148.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 226.7,
+ "residentMB": 376.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 197910,
+ "mallocMB": 102.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 362624,
+ "gcCount": 1,
+ "gcTimeMs": 0.0024543750000000017,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 82982,
+ "mallocBytesDelta": 22356528
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1673,
+ "wallMs": 6253,
+ "percent": 26.8,
+ "threadsBefore": 23,
+ "threadsAfter": 20,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-zoom-in-10k",
+ "name": "Camera zoom-in, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from country scale into street scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:28.407Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5485,
+ "load": {
+ "commitMs": 9.65,
+ "readyMs": 162,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 18.11,
+ "backgroundMs": 3.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.26,
+ "avgMs": 0.421,
+ "p50Ms": 0.51,
+ "p95Ms": 0.753,
+ "maxMs": 0.753,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.53,
+ "avgMs": 0.265,
+ "p50Ms": 0.002,
+ "p95Ms": 0.527,
+ "maxMs": 0.527,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.51,
+ "avgMs": 1.17,
+ "p50Ms": 1.158,
+ "p95Ms": 1.219,
+ "maxMs": 1.219,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.51,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.077,
+ "p50Ms": 0.077,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 16.22,
+ "avgMs": 0.266,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 15.554,
+ "mainThreadMs": 16.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001207459000000001,
+ "allocatedBytes": 4454752,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 267,
+ "durationMs": 4666.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.4,
+ "p50": 58,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 17.42,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 41.25,
+ "worst": 46.04,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 255,
+ 2,
+ 2,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0375,
+ "droppedFrames": 12,
+ "longFrames": 0,
+ "overBudgetFrames": 12
+ },
+ "js": {
+ "lagMs": {
+ "samples": 281,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.75,
+ "max": 0.76
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.18,
+ "max": 17.43
+ },
+ "lateFrames": 0,
+ "busyMs": 40.6,
+ "busyRatio": 0.0087,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4667.1,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2276,
+ "mainThreadMs": 45.92,
+ "backgroundMs": 16.84,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.82,
+ "avgMs": 0.365,
+ "p50Ms": 0.291,
+ "p95Ms": 0.623,
+ "maxMs": 0.623,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 45,
+ "totalMs": 2.76,
+ "avgMs": 0.061,
+ "p50Ms": 0.017,
+ "p95Ms": 0.208,
+ "maxMs": 0.368,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.76,
+ "items": 450000
+ },
+ "markers.viewportFilter": {
+ "count": 45,
+ "totalMs": 3.32,
+ "avgMs": 0.074,
+ "p50Ms": 0.012,
+ "p95Ms": 0.322,
+ "maxMs": 0.356,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.32,
+ "items": 15779
+ },
+ "markers.diff": {
+ "count": 45,
+ "totalMs": 2.18,
+ "avgMs": 0.049,
+ "p50Ms": 0.025,
+ "p95Ms": 0.107,
+ "maxMs": 0.651,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.18,
+ "items": 5431
+ },
+ "markers.viewportCompute": {
+ "count": 45,
+ "totalMs": 8.57,
+ "avgMs": 0.191,
+ "p50Ms": 0.064,
+ "p95Ms": 0.619,
+ "maxMs": 1.153,
+ "mainThreadMs": 0,
+ "backgroundMs": 8.57,
+ "items": 15779
+ },
+ "markers.applyDiff": {
+ "count": 45,
+ "totalMs": 32.08,
+ "avgMs": 0.713,
+ "p50Ms": 0.212,
+ "p95Ms": 2.687,
+ "maxMs": 3.627,
+ "mainThreadMs": 32.08,
+ "backgroundMs": 0,
+ "items": 4125
+ },
+ "annotation.viewFor": {
+ "count": 2032,
+ "totalMs": 11.89,
+ "avgMs": 0.006,
+ "p50Ms": 0.004,
+ "p95Ms": 0.012,
+ "maxMs": 0.169,
+ "mainThreadMs": 11.89,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.13,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 2032
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 226.8,
+ "afterLoadMB": 221.6,
+ "afterInteractionMB": 417.7,
+ "afterCleanupMB": 266.8,
+ "peakMB": 417.7,
+ "loadDeltaMB": -5.2,
+ "interactionDeltaMB": 196.1,
+ "retainedAfterCleanupMB": 40,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 226.8,
+ "residentMB": 373.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 198618,
+ "mallocMB": 102.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 221.6,
+ "residentMB": 351,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 274419,
+ "mallocMB": 132.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 417.7,
+ "residentMB": 464.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 705102,
+ "mallocMB": 236.3
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 266.8,
+ "residentMB": 460,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 222412,
+ "mallocMB": 112.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 705976,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 430683,
+ "mallocBytesDelta": 108938272
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2206,
+ "wallMs": 4676,
+ "percent": 47.2,
+ "threadsBefore": 20,
+ "threadsAfter": 33,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-zoom-out-10k",
+ "name": "Camera zoom-out, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom from street scale out to country scale in four steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:36.907Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5475,
+ "load": {
+ "commitMs": 8.2,
+ "readyMs": 87,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 8.31,
+ "backgroundMs": 4.44,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.47,
+ "avgMs": 0.489,
+ "p50Ms": 0.515,
+ "p95Ms": 0.951,
+ "maxMs": 0.951,
+ "mainThreadMs": 1.47,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.273,
+ "p50Ms": 0.008,
+ "p95Ms": 0.538,
+ "maxMs": 0.538,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.34,
+ "avgMs": 1.447,
+ "p50Ms": 1.357,
+ "p95Ms": 1.638,
+ "maxMs": 1.638,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.34,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.077,
+ "p50Ms": 0.077,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 6.2,
+ "avgMs": 0.102,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 5.542,
+ "mainThreadMs": 6.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0029221670000000033,
+ "allocatedBytes": 4452248,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 269,
+ "durationMs": 4657.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.8,
+ "p50": 58,
+ "p95": 52.3,
+ "p99": 52.3,
+ "worstWindow": 52.3,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 17.29,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 35.48,
+ "worst": 40.94,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 259,
+ 0,
+ 2,
+ 8,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0372,
+ "droppedFrames": 10,
+ "longFrames": 0,
+ "overBudgetFrames": 10
+ },
+ "js": {
+ "lagMs": {
+ "samples": 280,
+ "p50": 0,
+ "p95": 0.46,
+ "p99": 0.58,
+ "max": 0.67
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.13,
+ "max": 17.34
+ },
+ "lateFrames": 0,
+ "busyMs": 29,
+ "busyRatio": 0.0062,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4658.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1482,
+ "mainThreadMs": 28.09,
+ "backgroundMs": 14.1,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.91,
+ "avgMs": 0.383,
+ "p50Ms": 0.369,
+ "p95Ms": 0.594,
+ "maxMs": 0.594,
+ "mainThreadMs": 1.91,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 45,
+ "totalMs": 2.44,
+ "avgMs": 0.054,
+ "p50Ms": 0.016,
+ "p95Ms": 0.265,
+ "maxMs": 0.306,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.44,
+ "items": 450000
+ },
+ "markers.viewportFilter": {
+ "count": 45,
+ "totalMs": 2.91,
+ "avgMs": 0.065,
+ "p50Ms": 0.005,
+ "p95Ms": 0.359,
+ "maxMs": 1.107,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.91,
+ "items": 10947
+ },
+ "markers.diff": {
+ "count": 45,
+ "totalMs": 1.36,
+ "avgMs": 0.03,
+ "p50Ms": 0.012,
+ "p95Ms": 0.139,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.36,
+ "items": 3738
+ },
+ "markers.viewportCompute": {
+ "count": 45,
+ "totalMs": 7.39,
+ "avgMs": 0.164,
+ "p50Ms": 0.051,
+ "p95Ms": 0.651,
+ "maxMs": 1.572,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.39,
+ "items": 10947
+ },
+ "markers.applyDiff": {
+ "count": 45,
+ "totalMs": 16.67,
+ "avgMs": 0.37,
+ "p50Ms": 0.037,
+ "p95Ms": 2.368,
+ "maxMs": 4.32,
+ "mainThreadMs": 16.67,
+ "backgroundMs": 0,
+ "items": 2179
+ },
+ "annotation.viewFor": {
+ "count": 1230,
+ "totalMs": 9.41,
+ "avgMs": 0.008,
+ "p50Ms": 0.005,
+ "p95Ms": 0.013,
+ "maxMs": 0.129,
+ "mainThreadMs": 9.41,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 22,
+ "totalMs": 0.1,
+ "avgMs": 0.004,
+ "p50Ms": 0.002,
+ "p95Ms": 0.013,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1230
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 267.9,
+ "afterLoadMB": 225.6,
+ "afterInteractionMB": 411.6,
+ "afterCleanupMB": 270.8,
+ "peakMB": 411.6,
+ "loadDeltaMB": -42.3,
+ "interactionDeltaMB": 186,
+ "retainedAfterCleanupMB": 2.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 267.9,
+ "residentMB": 437.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 223121,
+ "mallocMB": 113.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 225.6,
+ "residentMB": 435.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 302844,
+ "mallocMB": 137.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 411.6,
+ "residentMB": 469.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 744899,
+ "mallocMB": 238.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 270.8,
+ "residentMB": 395.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 240396,
+ "mallocMB": 114.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 476616,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 442055,
+ "mallocBytesDelta": 105709664
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2176,
+ "wallMs": 4666,
+ "percent": 46.6,
+ "threadsBefore": 22,
+ "threadsAfter": 29,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-rapid-zoom-10k",
+ "name": "Camera rapid-zoom, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Ten alternating zoom jumps of 300 ms each across three octaves. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:44.441Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4494,
+ "load": {
+ "commitMs": 8.31,
+ "readyMs": 112,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 9.98,
+ "backgroundMs": 6,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.62,
+ "avgMs": 0.541,
+ "p50Ms": 0.518,
+ "p95Ms": 1.105,
+ "maxMs": 1.105,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.56,
+ "avgMs": 0.278,
+ "p50Ms": 0.002,
+ "p95Ms": 0.553,
+ "maxMs": 0.553,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.84,
+ "avgMs": 1.945,
+ "p50Ms": 1.901,
+ "p95Ms": 2.427,
+ "maxMs": 2.427,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.84,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.043,
+ "p50Ms": 0.043,
+ "p95Ms": 0.043,
+ "maxMs": 0.043,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.093,
+ "p50Ms": 0.093,
+ "p95Ms": 0.093,
+ "maxMs": 0.093,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.092,
+ "p50Ms": 0.092,
+ "p95Ms": 0.092,
+ "maxMs": 0.092,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 7.69,
+ "avgMs": 0.126,
+ "p50Ms": 0.01,
+ "p95Ms": 0.017,
+ "maxMs": 7.012,
+ "mainThreadMs": 7.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0012638339999999984,
+ "allocatedBytes": 4452248,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 214,
+ "durationMs": 3675.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.4,
+ "p50": 58.5,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.13,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 37.59,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 208,
+ 0,
+ 1,
+ 5,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 6,
+ "jankRatio": 0.028,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 221,
+ "p50": 0,
+ "p95": 0.54,
+ "p99": 0.6,
+ "max": 0.97
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.21,
+ "max": 17.63
+ },
+ "lateFrames": 0,
+ "busyMs": 27.4,
+ "busyRatio": 0.0075,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3676.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 503,
+ "mainThreadMs": 14.88,
+ "backgroundMs": 6.12,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 3.04,
+ "avgMs": 0.304,
+ "p50Ms": 0.28,
+ "p95Ms": 0.67,
+ "maxMs": 0.67,
+ "mainThreadMs": 3.04,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 36,
+ "totalMs": 1.63,
+ "avgMs": 0.045,
+ "p50Ms": 0.013,
+ "p95Ms": 0.259,
+ "maxMs": 0.514,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.63,
+ "items": 360000
+ },
+ "markers.viewportFilter": {
+ "count": 36,
+ "totalMs": 0.7,
+ "avgMs": 0.019,
+ "p50Ms": 0.006,
+ "p95Ms": 0.038,
+ "maxMs": 0.348,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.7,
+ "items": 3574
+ },
+ "markers.diff": {
+ "count": 36,
+ "totalMs": 0.62,
+ "avgMs": 0.017,
+ "p50Ms": 0.013,
+ "p95Ms": 0.031,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.62,
+ "items": 1442
+ },
+ "markers.viewportCompute": {
+ "count": 36,
+ "totalMs": 3.18,
+ "avgMs": 0.088,
+ "p50Ms": 0.044,
+ "p95Ms": 0.327,
+ "maxMs": 0.909,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.18,
+ "items": 3574
+ },
+ "markers.applyDiff": {
+ "count": 36,
+ "totalMs": 6.8,
+ "avgMs": 0.189,
+ "p50Ms": 0.074,
+ "p95Ms": 0.751,
+ "maxMs": 1.183,
+ "mainThreadMs": 6.8,
+ "backgroundMs": 0,
+ "items": 647
+ },
+ "annotation.viewFor": {
+ "count": 298,
+ "totalMs": 5,
+ "avgMs": 0.017,
+ "p50Ms": 0.004,
+ "p95Ms": 0.031,
+ "maxMs": 1.254,
+ "mainThreadMs": 5,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 15,
+ "totalMs": 0.04,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 298
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 271,
+ "afterLoadMB": 236.6,
+ "afterInteractionMB": 344.5,
+ "afterCleanupMB": 248.5,
+ "peakMB": 344.5,
+ "loadDeltaMB": -34.4,
+ "interactionDeltaMB": 107.9,
+ "retainedAfterCleanupMB": -22.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 271,
+ "residentMB": 388.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 238091,
+ "mallocMB": 114.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 236.6,
+ "residentMB": 361.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 317358,
+ "mallocMB": 139.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 344.5,
+ "residentMB": 427.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 527000,
+ "mallocMB": 185.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 248.5,
+ "residentMB": 422.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249485,
+ "mallocMB": 115.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 289856,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 209642,
+ "mallocBytesDelta": 48577696
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1502,
+ "wallMs": 3682,
+ "percent": 40.8,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-rotate-10k",
+ "name": "Camera rotate, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Four heading changes of 90° at city zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:51.608Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4140,
+ "load": {
+ "commitMs": 12.18,
+ "readyMs": 93,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.1,
+ "backgroundMs": 4.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.15,
+ "avgMs": 0.385,
+ "p50Ms": 0.52,
+ "p95Ms": 0.634,
+ "maxMs": 0.634,
+ "mainThreadMs": 1.15,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.54,
+ "avgMs": 0.272,
+ "p50Ms": 0.003,
+ "p95Ms": 0.541,
+ "maxMs": 0.541,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.05,
+ "avgMs": 1.349,
+ "p50Ms": 1.24,
+ "p95Ms": 1.613,
+ "maxMs": 1.613,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.05,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.047,
+ "p50Ms": 0.047,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.113,
+ "p50Ms": 0.113,
+ "p95Ms": 0.113,
+ "maxMs": 0.113,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.27,
+ "avgMs": 0.086,
+ "p50Ms": 0.01,
+ "p95Ms": 0.013,
+ "maxMs": 4.625,
+ "mainThreadMs": 5.27,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0015190830000000044,
+ "allocatedBytes": 4462248,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 193,
+ "durationMs": 3321.3,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.2,
+ "p50": 60,
+ "p95": 54,
+ "p99": 54,
+ "worstWindow": 54,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.18,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 47.88,
+ "worst": 71.21,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 189,
+ 1,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0155,
+ "droppedFrames": 6,
+ "longFrames": 1,
+ "overBudgetFrames": 4
+ },
+ "js": {
+ "lagMs": {
+ "samples": 200,
+ "p50": 0,
+ "p95": 0.46,
+ "p99": 0.54,
+ "max": 0.64
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.12,
+ "max": 17.3
+ },
+ "lateFrames": 0,
+ "busyMs": 22.3,
+ "busyRatio": 0.0067,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3321.7,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 227,
+ "mainThreadMs": 8.35,
+ "backgroundMs": 2.92,
+ "byName": {
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.75,
+ "avgMs": 0.438,
+ "p50Ms": 0.33,
+ "p95Ms": 0.575,
+ "maxMs": 0.575,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 32,
+ "totalMs": 0.57,
+ "avgMs": 0.018,
+ "p50Ms": 0.012,
+ "p95Ms": 0.051,
+ "maxMs": 0.076,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.57,
+ "items": 320000
+ },
+ "markers.viewportFilter": {
+ "count": 32,
+ "totalMs": 0.25,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.02,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1879
+ },
+ "markers.diff": {
+ "count": 32,
+ "totalMs": 0.52,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 583
+ },
+ "markers.viewportCompute": {
+ "count": 32,
+ "totalMs": 1.58,
+ "avgMs": 0.049,
+ "p50Ms": 0.037,
+ "p95Ms": 0.101,
+ "maxMs": 0.136,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 1879
+ },
+ "markers.applyDiff": {
+ "count": 32,
+ "totalMs": 5.48,
+ "avgMs": 0.171,
+ "p50Ms": 0.057,
+ "p95Ms": 0.491,
+ "maxMs": 0.527,
+ "mainThreadMs": 5.48,
+ "backgroundMs": 0,
+ "items": 149
+ },
+ "annotation.viewFor": {
+ "count": 49,
+ "totalMs": 1.09,
+ "avgMs": 0.022,
+ "p50Ms": 0.013,
+ "p95Ms": 0.055,
+ "maxMs": 0.099,
+ "mainThreadMs": 1.09,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 49
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 245.9,
+ "afterLoadMB": 233.7,
+ "afterInteractionMB": 305.8,
+ "afterCleanupMB": 236.7,
+ "peakMB": 305.8,
+ "loadDeltaMB": -12.2,
+ "interactionDeltaMB": 72.1,
+ "retainedAfterCleanupMB": -9.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 245.9,
+ "residentMB": 429.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249315,
+ "mallocMB": 112.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 233.7,
+ "residentMB": 364.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 324617,
+ "mallocMB": 136.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 305.8,
+ "residentMB": 449.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 406686,
+ "mallocMB": 157
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 236.7,
+ "residentMB": 438.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249242,
+ "mallocMB": 111.6
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 176040,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 82069,
+ "mallocBytesDelta": 21575552
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1075,
+ "wallMs": 3324,
+ "percent": 32.3,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-pitch-10k",
+ "name": "Camera pitch, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Pitch to 45°, 60°, back to 0° at street zoom. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:09:57.941Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 3320,
+ "load": {
+ "commitMs": 12.87,
+ "readyMs": 71,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.61,
+ "backgroundMs": 4.56,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.34,
+ "avgMs": 0.447,
+ "p50Ms": 0.617,
+ "p95Ms": 0.724,
+ "maxMs": 0.724,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.64,
+ "avgMs": 0.319,
+ "p50Ms": 0.003,
+ "p95Ms": 0.636,
+ "maxMs": 0.636,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.46,
+ "avgMs": 1.486,
+ "p50Ms": 1.357,
+ "p95Ms": 1.856,
+ "maxMs": 1.856,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.46,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.52,
+ "avgMs": 0.09,
+ "p50Ms": 0.011,
+ "p95Ms": 0.015,
+ "maxMs": 4.801,
+ "mainThreadMs": 5.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0024575839999999988,
+ "allocatedBytes": 4452512,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 145,
+ "durationMs": 2500.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58,
+ "p50": 60,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 3
+ },
+ "frameTimeMs": {
+ "average": 17.24,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 34.25,
+ "worst": 47.05,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 140,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0276,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 151,
+ "p50": 0,
+ "p95": 0.48,
+ "p99": 0.92,
+ "max": 1.65
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.15,
+ "max": 18.32
+ },
+ "lateFrames": 0,
+ "busyMs": 21.7,
+ "busyRatio": 0.0087,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 2500.8,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 123,
+ "mainThreadMs": 4.29,
+ "backgroundMs": 2.02,
+ "byName": {
+ "camera.apply": {
+ "count": 3,
+ "totalMs": 1.95,
+ "avgMs": 0.652,
+ "p50Ms": 0.696,
+ "p95Ms": 0.984,
+ "maxMs": 0.984,
+ "mainThreadMs": 1.95,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 24,
+ "totalMs": 0.46,
+ "avgMs": 0.019,
+ "p50Ms": 0.014,
+ "p95Ms": 0.041,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.46,
+ "items": 240000
+ },
+ "markers.viewportFilter": {
+ "count": 24,
+ "totalMs": 0.13,
+ "avgMs": 0.005,
+ "p50Ms": 0.003,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 1209
+ },
+ "markers.diff": {
+ "count": 24,
+ "totalMs": 0.33,
+ "avgMs": 0.014,
+ "p50Ms": 0.01,
+ "p95Ms": 0.027,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.33,
+ "items": 172
+ },
+ "markers.viewportCompute": {
+ "count": 24,
+ "totalMs": 1.1,
+ "avgMs": 0.046,
+ "p50Ms": 0.035,
+ "p95Ms": 0.081,
+ "maxMs": 0.132,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.1,
+ "items": 1209
+ },
+ "markers.applyDiff": {
+ "count": 24,
+ "totalMs": 2.34,
+ "avgMs": 0.097,
+ "p50Ms": 0.001,
+ "p95Ms": 0.429,
+ "maxMs": 0.524,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 237.3,
+ "afterLoadMB": 231.6,
+ "afterInteractionMB": 344.9,
+ "afterCleanupMB": 242.7,
+ "peakMB": 344.9,
+ "loadDeltaMB": -5.7,
+ "interactionDeltaMB": 113.3,
+ "retainedAfterCleanupMB": 5.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 237.3,
+ "residentMB": 439.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249931,
+ "mallocMB": 111.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 231.6,
+ "residentMB": 374,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 327000,
+ "mallocMB": 132.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 344.9,
+ "residentMB": 459.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 490973,
+ "mallocMB": 190.1
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 242.7,
+ "residentMB": 448.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256128,
+ "mallocMB": 113.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 125776,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 163973,
+ "mallocBytesDelta": 60085760
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1065,
+ "wallMs": 2505,
+ "percent": 42.5,
+ "threadsBefore": 22,
+ "threadsAfter": 40,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-rapid-10k",
+ "name": "Camera rapid, 10k markers",
+ "group": "camera",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Twenty 150 ms flicks mixing small pans and half-zoom steps. Scene: 10000 markers.",
+ "recordedAt": "2026-09-10T14:10:05.858Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4908,
+ "load": {
+ "commitMs": 10.25,
+ "readyMs": 69,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.46,
+ "backgroundMs": 4.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.19,
+ "avgMs": 0.396,
+ "p50Ms": 0.575,
+ "p95Ms": 0.613,
+ "maxMs": 0.613,
+ "mainThreadMs": 1.19,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.63,
+ "avgMs": 0.315,
+ "p50Ms": 0.003,
+ "p95Ms": 0.628,
+ "maxMs": 0.628,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.89,
+ "avgMs": 1.298,
+ "p50Ms": 1.308,
+ "p95Ms": 1.318,
+ "maxMs": 1.318,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.89,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.064,
+ "p50Ms": 0.064,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.52,
+ "avgMs": 0.09,
+ "p50Ms": 0.011,
+ "p95Ms": 0.015,
+ "maxMs": 4.796,
+ "mainThreadMs": 5.52,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016690840000000012,
+ "allocatedBytes": 4452264,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 234,
+ "durationMs": 4092,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.3,
+ "p50": 57,
+ "p95": 54,
+ "p99": 54,
+ "worstWindow": 54,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.45,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.51,
+ "worst": 45.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 223,
+ 1,
+ 1,
+ 9,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0427,
+ "droppedFrames": 11,
+ "longFrames": 0,
+ "overBudgetFrames": 11
+ },
+ "js": {
+ "lagMs": {
+ "samples": 246,
+ "p50": 0.04,
+ "p95": 0.5,
+ "p99": 0.87,
+ "max": 1.61
+ },
+ "frameGapMs": {
+ "p50": 16.71,
+ "p95": 17.17,
+ "max": 18.28
+ },
+ "lateFrames": 0,
+ "busyMs": 36.7,
+ "busyRatio": 0.009,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4092.4,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 328,
+ "mainThreadMs": 17.66,
+ "backgroundMs": 3.04,
+ "byName": {
+ "camera.apply": {
+ "count": 21,
+ "totalMs": 9.64,
+ "avgMs": 0.459,
+ "p50Ms": 0.416,
+ "p95Ms": 0.845,
+ "maxMs": 0.933,
+ "mainThreadMs": 9.64,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 44,
+ "totalMs": 0.58,
+ "avgMs": 0.013,
+ "p50Ms": 0.011,
+ "p95Ms": 0.026,
+ "maxMs": 0.042,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 440000
+ },
+ "markers.viewportFilter": {
+ "count": 44,
+ "totalMs": 0.23,
+ "avgMs": 0.005,
+ "p50Ms": 0.004,
+ "p95Ms": 0.009,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.23,
+ "items": 2046
+ },
+ "markers.diff": {
+ "count": 44,
+ "totalMs": 0.57,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.024,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.57,
+ "items": 301
+ },
+ "markers.viewportCompute": {
+ "count": 44,
+ "totalMs": 1.66,
+ "avgMs": 0.038,
+ "p50Ms": 0.031,
+ "p95Ms": 0.078,
+ "maxMs": 0.085,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.66,
+ "items": 2046
+ },
+ "markers.applyDiff": {
+ "count": 44,
+ "totalMs": 6.81,
+ "avgMs": 0.155,
+ "p50Ms": 0.167,
+ "p95Ms": 0.33,
+ "maxMs": 0.805,
+ "mainThreadMs": 6.81,
+ "backgroundMs": 0,
+ "items": 171
+ },
+ "annotation.viewFor": {
+ "count": 60,
+ "totalMs": 1.17,
+ "avgMs": 0.02,
+ "p50Ms": 0.012,
+ "p95Ms": 0.035,
+ "maxMs": 0.116,
+ "mainThreadMs": 1.17,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 27,
+ "totalMs": 0.04,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 243.5,
+ "afterLoadMB": 232.2,
+ "afterInteractionMB": 315.7,
+ "afterCleanupMB": 240.7,
+ "peakMB": 315.7,
+ "loadDeltaMB": -11.3,
+ "interactionDeltaMB": 83.5,
+ "retainedAfterCleanupMB": -2.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 243.5,
+ "residentMB": 449.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256826,
+ "mallocMB": 113.4
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 232.2,
+ "residentMB": 406.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 320737,
+ "mallocMB": 136.9
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 315.7,
+ "residentMB": 389,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 455840,
+ "mallocMB": 166.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 240.7,
+ "residentMB": 395,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 246829,
+ "mallocMB": 112.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 298896,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 135103,
+ "mallocBytesDelta": 30893968
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1501,
+ "wallMs": 4097,
+ "percent": 36.6,
+ "threadsBefore": 23,
+ "threadsAfter": 23,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "camera-fast-pan-50k",
+ "name": "Camera fast-pan, 50k markers",
+ "group": "camera",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "Six fast animated pan legs (400 ms each, larger steps). Scene: 50000 markers.",
+ "recordedAt": "2026-09-10T14:10:15.078Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4560,
+ "load": {
+ "commitMs": 43.56,
+ "readyMs": 166,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 308,
+ "mainThreadMs": 16.98,
+ "backgroundMs": 95.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 6.11,
+ "avgMs": 2.037,
+ "p50Ms": 2.807,
+ "p95Ms": 3.302,
+ "maxMs": 3.302,
+ "mainThreadMs": 6.11,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 2.86,
+ "avgMs": 1.428,
+ "p50Ms": 0.004,
+ "p95Ms": 2.852,
+ "maxMs": 2.852,
+ "mainThreadMs": 2.86,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 95.49,
+ "avgMs": 31.831,
+ "p50Ms": 10.64,
+ "p95Ms": 75.634,
+ "maxMs": 75.634,
+ "mainThreadMs": 0,
+ "backgroundMs": 95.49,
+ "items": 150000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 413
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.077,
+ "p50Ms": 0.077,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 287
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.164,
+ "p50Ms": 0.164,
+ "p95Ms": 0.164,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.16,
+ "items": 413
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.358,
+ "p50Ms": 0.358,
+ "p95Ms": 0.358,
+ "maxMs": 0.358,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 287
+ },
+ "annotation.viewFor": {
+ "count": 287,
+ "totalMs": 7.62,
+ "avgMs": 0.027,
+ "p50Ms": 0.01,
+ "p95Ms": 0.015,
+ "maxMs": 4.541,
+ "mainThreadMs": 7.62,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 287
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 7,
+ "gcTimeMs": 0.006978581999999997,
+ "allocatedBytes": 21715000,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 218,
+ "durationMs": 3741.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.4,
+ "p50": 59,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.13,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 35.1,
+ "worst": 47.52,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 212,
+ 1,
+ 1,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 5,
+ "jankRatio": 0.0229,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 225,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.58,
+ "max": 0.92
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.18,
+ "max": 17.59
+ },
+ "lateFrames": 0,
+ "busyMs": 29.6,
+ "busyRatio": 0.0079,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3742.2,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 507,
+ "mainThreadMs": 28.85,
+ "backgroundMs": 7.54,
+ "byName": {
+ "camera.apply": {
+ "count": 7,
+ "totalMs": 3.09,
+ "avgMs": 0.442,
+ "p50Ms": 0.333,
+ "p95Ms": 0.955,
+ "maxMs": 0.955,
+ "mainThreadMs": 3.09,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 2.05,
+ "avgMs": 0.059,
+ "p50Ms": 0.042,
+ "p95Ms": 0.2,
+ "maxMs": 0.24,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.05,
+ "items": 1750000
+ },
+ "markers.viewportFilter": {
+ "count": 35,
+ "totalMs": 0.56,
+ "avgMs": 0.016,
+ "p50Ms": 0.013,
+ "p95Ms": 0.035,
+ "maxMs": 0.063,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 6374
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 0.98,
+ "avgMs": 0.028,
+ "p50Ms": 0.026,
+ "p95Ms": 0.054,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.98,
+ "items": 1585
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 3.95,
+ "avgMs": 0.113,
+ "p50Ms": 0.088,
+ "p95Ms": 0.306,
+ "maxMs": 0.359,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.95,
+ "items": 6374
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 23.35,
+ "avgMs": 0.667,
+ "p50Ms": 0.423,
+ "p95Ms": 1.912,
+ "maxMs": 7.467,
+ "mainThreadMs": 23.35,
+ "backgroundMs": 0,
+ "items": 860
+ },
+ "annotation.viewFor": {
+ "count": 303,
+ "totalMs": 2.35,
+ "avgMs": 0.008,
+ "p50Ms": 0.006,
+ "p95Ms": 0.021,
+ "maxMs": 0.05,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 22,
+ "totalMs": 0.06,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.005,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 303
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 241.1,
+ "afterLoadMB": 267.8,
+ "afterInteractionMB": 402,
+ "afterCleanupMB": 279.6,
+ "peakMB": 402,
+ "loadDeltaMB": 26.7,
+ "interactionDeltaMB": 134.2,
+ "retainedAfterCleanupMB": 38.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 241.1,
+ "residentMB": 396.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 244416,
+ "mallocMB": 112.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 267.8,
+ "residentMB": 474.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 346099,
+ "mallocMB": 181.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 402,
+ "residentMB": 486.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 489290,
+ "mallocMB": 232.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 279.6,
+ "residentMB": 430.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 245000,
+ "mallocMB": 137.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 301600,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 24
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 143191,
+ "mallocBytesDelta": 53568048
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1391,
+ "wallMs": 3751,
+ "percent": 37.1,
+ "threadsBefore": 21,
+ "threadsAfter": 25,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 3578908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-10k",
+ "name": "Marker update cost at 10k",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "With 10000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:10:37.794Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 19684,
+ "load": {
+ "commitMs": 9.95,
+ "readyMs": 101,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.64,
+ "backgroundMs": 4.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.45,
+ "avgMs": 0.483,
+ "p50Ms": 0.685,
+ "p95Ms": 0.765,
+ "maxMs": 0.765,
+ "mainThreadMs": 1.45,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.71,
+ "avgMs": 0.355,
+ "p50Ms": 0.004,
+ "p95Ms": 0.707,
+ "maxMs": 0.707,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.14,
+ "avgMs": 1.381,
+ "p50Ms": 1.421,
+ "p95Ms": 1.557,
+ "maxMs": 1.557,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.14,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.089,
+ "p50Ms": 0.089,
+ "p95Ms": 0.089,
+ "maxMs": 0.089,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.37,
+ "avgMs": 0.088,
+ "p50Ms": 0.01,
+ "p95Ms": 0.016,
+ "maxMs": 4.714,
+ "mainThreadMs": 5.37,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.000914666999999994,
+ "allocatedBytes": 4453040,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ "frames": {
+ "frames": 1129,
+ "durationMs": 18862.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.9,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.7,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 43.51,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1127,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0009,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 1130,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 1.74,
+ "max": 23.05
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.19,
+ "max": 39.72
+ },
+ "lateFrames": 2,
+ "busyMs": 225.3,
+ "busyRatio": 0.0119,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 18863.6,
+ "commits": {
+ "count": 40,
+ "totalMs": 519.72,
+ "avgMs": 12.993,
+ "p95Ms": 18.481,
+ "maxMs": 20.889
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 1.446,
+ "maxMs": 3.172
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 2.049,
+ "maxMs": 4.524
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 324,
+ "mainThreadMs": 114.56,
+ "backgroundMs": 64.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 40,
+ "totalMs": 27.39,
+ "avgMs": 0.685,
+ "p50Ms": 0.617,
+ "p95Ms": 0.981,
+ "maxMs": 1.188,
+ "mainThreadMs": 27.39,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.set": {
+ "count": 40,
+ "totalMs": 81.98,
+ "avgMs": 2.049,
+ "p50Ms": 1.708,
+ "p95Ms": 3.409,
+ "maxMs": 4.524,
+ "mainThreadMs": 81.98,
+ "backgroundMs": 0,
+ "items": 400025
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 60.23,
+ "avgMs": 1.506,
+ "p50Ms": 1.383,
+ "p95Ms": 2.24,
+ "maxMs": 2.919,
+ "mainThreadMs": 0,
+ "backgroundMs": 60.23,
+ "items": 400025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 0.71,
+ "avgMs": 0.018,
+ "p50Ms": 0.016,
+ "p95Ms": 0.028,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.71,
+ "items": 400025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.63,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.024,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.63,
+ "items": 3254
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 0.84,
+ "avgMs": 0.021,
+ "p50Ms": 0.02,
+ "p95Ms": 0.029,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.84,
+ "items": 2365
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 2.49,
+ "avgMs": 0.062,
+ "p50Ms": 0.054,
+ "p95Ms": 0.09,
+ "maxMs": 0.14,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.49,
+ "items": 3254
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 5.05,
+ "avgMs": 0.126,
+ "p50Ms": 0.001,
+ "p95Ms": 0.642,
+ "maxMs": 1.067,
+ "mainThreadMs": 5.05,
+ "backgroundMs": 0,
+ "items": 337
+ },
+ "annotation.viewFor": {
+ "count": 2,
+ "totalMs": 0.14,
+ "avgMs": 0.07,
+ "p50Ms": 0.03,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 264.2,
+ "afterLoadMB": 231.7,
+ "afterInteractionMB": 253.1,
+ "afterCleanupMB": 194.2,
+ "peakMB": 264.2,
+ "loadDeltaMB": -32.5,
+ "interactionDeltaMB": 21.4,
+ "retainedAfterCleanupMB": -70,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 264.2,
+ "residentMB": 416.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 244832,
+ "mallocMB": 121.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 231.7,
+ "residentMB": 421.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 320356,
+ "mallocMB": 136.5
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 253.1,
+ "residentMB": 364.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 314935,
+ "mallocMB": 146.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 194.2,
+ "residentMB": 376.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 114910,
+ "mallocMB": 101.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 85688600,
+ "gcCount": 23,
+ "gcTimeMs": 0.031532832,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -5421,
+ "mallocBytesDelta": 10619456
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1405,
+ "wallMs": 18867,
+ "percent": 7.4,
+ "threadsBefore": 23,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 41,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 410025,
+ "coordinates": 410025,
+ "estimatedBytes": 29361098
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717190
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 462.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.62,
+ "avgMs": 9.619,
+ "p95Ms": 9.619,
+ "maxMs": 9.619
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.132,
+ "maxMs": 1.132
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.634,
+ "maxMs": 1.634
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.51,
+ "backgroundMs": 1.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.617,
+ "p50Ms": 0.617,
+ "p95Ms": 0.617,
+ "maxMs": 0.617,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.63,
+ "avgMs": 1.634,
+ "p50Ms": 1.634,
+ "p95Ms": 1.634,
+ "maxMs": 1.634,
+ "mainThreadMs": 1.63,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.291,
+ "p50Ms": 1.291,
+ "p95Ms": 1.291,
+ "maxMs": 1.291,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.29,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.262,
+ "p50Ms": 0.262,
+ "p95Ms": 0.262,
+ "maxMs": 0.262,
+ "mainThreadMs": 0.26,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2029760,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 1
+ },
+ "wallMs": 483.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 19.7,
+ "avgMs": 19.703,
+ "p95Ms": 19.703,
+ "maxMs": 19.703
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.033,
+ "maxMs": 2.033
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.127,
+ "maxMs": 2.127
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.09,
+ "backgroundMs": 2.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.962,
+ "p50Ms": 0.962,
+ "p95Ms": 0.962,
+ "maxMs": 0.962,
+ "mainThreadMs": 0.96,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.13,
+ "avgMs": 2.127,
+ "p50Ms": 2.127,
+ "p95Ms": 2.127,
+ "maxMs": 2.127,
+ "mainThreadMs": 2.13,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.96,
+ "avgMs": 1.963,
+ "p50Ms": 1.963,
+ "p95Ms": 1.963,
+ "maxMs": 1.963,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.96,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.088,
+ "p50Ms": 0.088,
+ "p95Ms": 0.088,
+ "maxMs": 0.088,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002094041000000005,
+ "allocatedBytes": 2027608,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 2
+ },
+ "wallMs": 465.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.68,
+ "avgMs": 13.678,
+ "p95Ms": 13.678,
+ "maxMs": 13.678
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.203,
+ "maxMs": 1.203
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.601,
+ "maxMs": 1.601
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.27,
+ "backgroundMs": 1.85,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.664,
+ "p50Ms": 0.664,
+ "p95Ms": 0.664,
+ "maxMs": 0.664,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.6,
+ "avgMs": 1.601,
+ "p50Ms": 1.601,
+ "p95Ms": 1.601,
+ "maxMs": 1.601,
+ "mainThreadMs": 1.6,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.72,
+ "avgMs": 1.721,
+ "p50Ms": 1.721,
+ "p95Ms": 1.721,
+ "maxMs": 1.721,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.72,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2028672,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 3
+ },
+ "wallMs": 466.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.16,
+ "avgMs": 11.165,
+ "p95Ms": 11.165,
+ "maxMs": 11.165
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.045,
+ "maxMs": 1.045
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.255,
+ "maxMs": 1.255
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.78,
+ "backgroundMs": 1.85,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.521,
+ "p50Ms": 0.521,
+ "p95Ms": 0.521,
+ "maxMs": 0.521,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.255,
+ "p50Ms": 1.255,
+ "p95Ms": 1.255,
+ "maxMs": 1.255,
+ "mainThreadMs": 1.25,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.72,
+ "avgMs": 1.721,
+ "p50Ms": 1.721,
+ "p95Ms": 1.721,
+ "maxMs": 1.721,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.72,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.067,
+ "p50Ms": 0.067,
+ "p95Ms": 0.067,
+ "maxMs": 0.067,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0008113329999999974,
+ "allocatedBytes": 2026168,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 4
+ },
+ "wallMs": 465.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.31,
+ "avgMs": 12.307,
+ "p95Ms": 12.307,
+ "maxMs": 12.307
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.124,
+ "maxMs": 1.124
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.58,
+ "maxMs": 1.58
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.29,
+ "backgroundMs": 1.59,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.71,
+ "avgMs": 0.712,
+ "p50Ms": 0.712,
+ "p95Ms": 0.712,
+ "maxMs": 0.712,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.58,
+ "p50Ms": 1.58,
+ "p95Ms": 1.58,
+ "maxMs": 1.58,
+ "mainThreadMs": 1.58,
+ "backgroundMs": 0,
+ "items": 10005
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.5,
+ "avgMs": 1.5,
+ "p50Ms": 1.5,
+ "p95Ms": 1.5,
+ "maxMs": 1.5,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.5,
+ "items": 10005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.047,
+ "p50Ms": 0.047,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2031296,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10005,
+ "repeat": 0
+ },
+ "wallMs": 466.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.21,
+ "avgMs": 12.214,
+ "p95Ms": 12.214,
+ "maxMs": 12.214
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.199,
+ "maxMs": 1.199
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.636,
+ "maxMs": 1.636
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.21,
+ "backgroundMs": 2.55,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.577,
+ "p50Ms": 0.577,
+ "p95Ms": 0.577,
+ "maxMs": 0.577,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.64,
+ "avgMs": 1.636,
+ "p50Ms": 1.636,
+ "p95Ms": 1.636,
+ "maxMs": 1.636,
+ "mainThreadMs": 1.64,
+ "backgroundMs": 0,
+ "items": 10004
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.45,
+ "avgMs": 2.449,
+ "p50Ms": 2.449,
+ "p95Ms": 2.449,
+ "maxMs": 2.449,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.45,
+ "items": 10004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007101669999999977,
+ "allocatedBytes": 1843288,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10004,
+ "repeat": 1
+ },
+ "wallMs": 465.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.32,
+ "avgMs": 13.321,
+ "p95Ms": 13.321,
+ "maxMs": 13.321
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.523,
+ "maxMs": 1.523
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.793,
+ "maxMs": 1.793
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.41,
+ "backgroundMs": 1.56,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.616,
+ "p50Ms": 0.616,
+ "p95Ms": 0.616,
+ "maxMs": 0.616,
+ "mainThreadMs": 0.62,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.79,
+ "avgMs": 1.793,
+ "p50Ms": 1.793,
+ "p95Ms": 1.793,
+ "maxMs": 1.793,
+ "mainThreadMs": 1.79,
+ "backgroundMs": 0,
+ "items": 10003
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.46,
+ "avgMs": 1.462,
+ "p50Ms": 1.462,
+ "p95Ms": 1.462,
+ "maxMs": 1.462,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.46,
+ "items": 10003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842928,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10003,
+ "repeat": 2
+ },
+ "wallMs": 466.77,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.75,
+ "avgMs": 11.749,
+ "p95Ms": 11.749,
+ "maxMs": 11.749
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.113,
+ "maxMs": 1.113
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.662,
+ "maxMs": 1.662
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.22,
+ "backgroundMs": 2.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.553,
+ "p50Ms": 0.553,
+ "p95Ms": 0.553,
+ "maxMs": 0.553,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.66,
+ "avgMs": 1.662,
+ "p50Ms": 1.662,
+ "p95Ms": 1.662,
+ "maxMs": 1.662,
+ "mainThreadMs": 1.66,
+ "backgroundMs": 0,
+ "items": 10002
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.04,
+ "avgMs": 2.038,
+ "p50Ms": 2.038,
+ "p95Ms": 2.038,
+ "maxMs": 2.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.04,
+ "items": 10002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.076,
+ "p50Ms": 0.076,
+ "p95Ms": 0.076,
+ "maxMs": 0.076,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842752,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10002,
+ "repeat": 3
+ },
+ "wallMs": 465.67,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.35,
+ "avgMs": 9.352,
+ "p95Ms": 9.352,
+ "maxMs": 9.352
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.219,
+ "maxMs": 1.219
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.227,
+ "maxMs": 1.227
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.78,
+ "backgroundMs": 1.04,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.551,
+ "p50Ms": 0.551,
+ "p95Ms": 0.551,
+ "maxMs": 0.551,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.23,
+ "avgMs": 1.227,
+ "p50Ms": 1.227,
+ "p95Ms": 1.227,
+ "maxMs": 1.227,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 10001
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.962,
+ "p50Ms": 0.962,
+ "p95Ms": 0.962,
+ "maxMs": 0.962,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.96,
+ "items": 10001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.005327291999999997,
+ "allocatedBytes": 1844728,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 10001,
+ "repeat": 4
+ },
+ "wallMs": 466.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.22,
+ "avgMs": 12.215,
+ "p95Ms": 12.215,
+ "maxMs": 12.215
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.063,
+ "maxMs": 1.063
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.458,
+ "maxMs": 1.458
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.97,
+ "backgroundMs": 1.08,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.515,
+ "p50Ms": 0.515,
+ "p95Ms": 0.515,
+ "maxMs": 0.515,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.46,
+ "avgMs": 1.458,
+ "p50Ms": 1.458,
+ "p95Ms": 1.458,
+ "maxMs": 1.458,
+ "mainThreadMs": 1.46,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.984,
+ "p50Ms": 0.984,
+ "p95Ms": 0.984,
+ "maxMs": 0.984,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.98,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.052,
+ "p50Ms": 0.052,
+ "p95Ms": 0.052,
+ "maxMs": 0.052,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1850552,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.12,
+ "avgMs": 12.123,
+ "p95Ms": 12.123,
+ "maxMs": 12.123
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.319,
+ "maxMs": 1.319
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.532,
+ "maxMs": 1.532
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.05,
+ "backgroundMs": 1.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.513,
+ "p50Ms": 0.513,
+ "p95Ms": 0.513,
+ "maxMs": 0.513,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.53,
+ "avgMs": 1.532,
+ "p50Ms": 1.532,
+ "p95Ms": 1.532,
+ "maxMs": 1.532,
+ "mainThreadMs": 1.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.03,
+ "p50Ms": 1.03,
+ "p95Ms": 1.03,
+ "maxMs": 1.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.03,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0009347499999999981,
+ "allocatedBytes": 1842664,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 465.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.23,
+ "avgMs": 11.23,
+ "p95Ms": 11.23,
+ "maxMs": 11.23
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.453,
+ "maxMs": 1.453
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.708,
+ "maxMs": 1.708
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.42,
+ "backgroundMs": 1.96,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.71,
+ "avgMs": 0.714,
+ "p50Ms": 0.714,
+ "p95Ms": 0.714,
+ "maxMs": 0.714,
+ "mainThreadMs": 0.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.71,
+ "avgMs": 1.708,
+ "p50Ms": 1.708,
+ "p95Ms": 1.708,
+ "maxMs": 1.708,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.87,
+ "avgMs": 1.868,
+ "p50Ms": 1.868,
+ "p95Ms": 1.868,
+ "maxMs": 1.868,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.87,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.048,
+ "p50Ms": 0.048,
+ "p95Ms": 0.048,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 465.71,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.94,
+ "avgMs": 13.94,
+ "p95Ms": 13.94,
+ "maxMs": 13.94
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.478,
+ "maxMs": 1.478
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.068,
+ "maxMs": 2.068
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.8,
+ "backgroundMs": 1.31,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.73,
+ "avgMs": 0.732,
+ "p50Ms": 0.732,
+ "p95Ms": 0.732,
+ "maxMs": 0.732,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.07,
+ "avgMs": 2.068,
+ "p50Ms": 2.068,
+ "p95Ms": 2.068,
+ "maxMs": 2.068,
+ "mainThreadMs": 2.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.22,
+ "avgMs": 1.219,
+ "p50Ms": 1.219,
+ "p95Ms": 1.219,
+ "maxMs": 1.219,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.22,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.045,
+ "p50Ms": 0.045,
+ "p95Ms": 0.045,
+ "maxMs": 0.045,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007546670000000005,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 466.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.36,
+ "avgMs": 11.363,
+ "p95Ms": 11.363,
+ "maxMs": 11.363
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.179,
+ "maxMs": 1.179
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.485,
+ "maxMs": 1.485
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.01,
+ "backgroundMs": 2.05,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.525,
+ "p50Ms": 0.525,
+ "p95Ms": 0.525,
+ "maxMs": 0.525,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.485,
+ "p50Ms": 1.485,
+ "p95Ms": 1.485,
+ "maxMs": 1.485,
+ "mainThreadMs": 1.48,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.91,
+ "avgMs": 1.912,
+ "p50Ms": 1.912,
+ "p95Ms": 1.912,
+ "maxMs": 1.912,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.91,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.074,
+ "p50Ms": 0.074,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 465.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.42,
+ "avgMs": 12.422,
+ "p95Ms": 12.422,
+ "maxMs": 12.422
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.387,
+ "maxMs": 1.387
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.498,
+ "maxMs": 2.498
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.16,
+ "backgroundMs": 1.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.66,
+ "p50Ms": 0.66,
+ "p95Ms": 0.66,
+ "maxMs": 0.66,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.5,
+ "avgMs": 2.498,
+ "p50Ms": 2.498,
+ "p95Ms": 2.498,
+ "maxMs": 2.498,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.783,
+ "p50Ms": 1.783,
+ "p95Ms": 1.783,
+ "maxMs": 1.783,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.78,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001072500000000004,
+ "allocatedBytes": 1842592,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 466.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.73,
+ "avgMs": 11.728,
+ "p95Ms": 11.728,
+ "maxMs": 11.728
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.675,
+ "maxMs": 1.675
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.124,
+ "maxMs": 2.124
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.82,
+ "backgroundMs": 2.38,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.696,
+ "p50Ms": 0.696,
+ "p95Ms": 0.696,
+ "maxMs": 0.696,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.12,
+ "avgMs": 2.124,
+ "p50Ms": 2.124,
+ "p95Ms": 2.124,
+ "maxMs": 2.124,
+ "mainThreadMs": 2.12,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.24,
+ "avgMs": 2.24,
+ "p50Ms": 2.24,
+ "p95Ms": 2.24,
+ "maxMs": 2.24,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.072,
+ "p50Ms": 0.072,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1844344,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 466.03,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.57,
+ "avgMs": 13.574,
+ "p95Ms": 13.574,
+ "maxMs": 13.574
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.434,
+ "maxMs": 1.434
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.821,
+ "maxMs": 3.821
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.42,
+ "backgroundMs": 1.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.6,
+ "avgMs": 0.602,
+ "p50Ms": 0.602,
+ "p95Ms": 0.602,
+ "maxMs": 0.602,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.82,
+ "avgMs": 3.821,
+ "p50Ms": 3.821,
+ "p95Ms": 3.821,
+ "maxMs": 3.821,
+ "mainThreadMs": 3.82,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.289,
+ "p50Ms": 1.289,
+ "p95Ms": 1.289,
+ "maxMs": 1.289,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.29,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007353330000000047,
+ "allocatedBytes": 1848752,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.96,
+ "avgMs": 11.959,
+ "p95Ms": 11.959,
+ "maxMs": 11.959
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.195,
+ "maxMs": 1.195
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.469,
+ "maxMs": 1.469
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.04,
+ "backgroundMs": 1.4,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.57,
+ "avgMs": 0.571,
+ "p50Ms": 0.571,
+ "p95Ms": 0.571,
+ "maxMs": 0.571,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.47,
+ "avgMs": 1.469,
+ "p50Ms": 1.469,
+ "p95Ms": 1.469,
+ "maxMs": 1.469,
+ "mainThreadMs": 1.47,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.28,
+ "avgMs": 1.283,
+ "p50Ms": 1.283,
+ "p95Ms": 1.283,
+ "maxMs": 1.283,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.28,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.064,
+ "p50Ms": 0.064,
+ "p95Ms": 0.064,
+ "maxMs": 0.064,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1844344,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 465.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 15.28,
+ "avgMs": 15.282,
+ "p95Ms": 15.282,
+ "maxMs": 15.282
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.299,
+ "maxMs": 2.299
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 4.524,
+ "maxMs": 4.524
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 5.51,
+ "backgroundMs": 2.09,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.981,
+ "p50Ms": 0.981,
+ "p95Ms": 0.981,
+ "maxMs": 0.981,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 4.52,
+ "avgMs": 4.524,
+ "p50Ms": 4.524,
+ "p95Ms": 4.524,
+ "maxMs": 4.524,
+ "mainThreadMs": 4.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.84,
+ "avgMs": 1.84,
+ "p50Ms": 1.84,
+ "p95Ms": 1.84,
+ "maxMs": 1.84,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.84,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.035,
+ "p50Ms": 0.035,
+ "p95Ms": 0.035,
+ "maxMs": 0.035,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.14,
+ "p50Ms": 0.14,
+ "p95Ms": 0.14,
+ "maxMs": 0.14,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860744,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 466.49,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.45,
+ "avgMs": 14.446,
+ "p95Ms": 14.446,
+ "maxMs": 14.446
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.936,
+ "maxMs": 1.936
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.483,
+ "maxMs": 1.483
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.07,
+ "backgroundMs": 1.54,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.587,
+ "p50Ms": 0.587,
+ "p95Ms": 0.587,
+ "maxMs": 0.587,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.48,
+ "avgMs": 1.483,
+ "p50Ms": 1.483,
+ "p95Ms": 1.483,
+ "maxMs": 1.483,
+ "mainThreadMs": 1.48,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.45,
+ "avgMs": 1.447,
+ "p50Ms": 1.447,
+ "p95Ms": 1.447,
+ "maxMs": 1.447,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.45,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001155832999999995,
+ "allocatedBytes": 1844336,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 465.66,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.48,
+ "avgMs": 12.481,
+ "p95Ms": 12.481,
+ "maxMs": 12.481
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.197,
+ "maxMs": 1.197
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.409,
+ "maxMs": 3.409
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.95,
+ "backgroundMs": 1.9,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.54,
+ "avgMs": 0.535,
+ "p50Ms": 0.535,
+ "p95Ms": 0.535,
+ "maxMs": 0.535,
+ "mainThreadMs": 0.54,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.41,
+ "avgMs": 3.409,
+ "p50Ms": 3.409,
+ "p95Ms": 3.409,
+ "maxMs": 3.409,
+ "mainThreadMs": 3.41,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.75,
+ "avgMs": 1.746,
+ "p50Ms": 1.746,
+ "p95Ms": 1.746,
+ "maxMs": 1.746,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.75,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860576,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 466.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.84,
+ "avgMs": 12.84,
+ "p95Ms": 12.84,
+ "maxMs": 12.84
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.176,
+ "maxMs": 1.176
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.347,
+ "maxMs": 2.347
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.01,
+ "backgroundMs": 1.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.658,
+ "p50Ms": 0.658,
+ "p95Ms": 0.658,
+ "maxMs": 0.658,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.35,
+ "avgMs": 2.347,
+ "p50Ms": 2.347,
+ "p95Ms": 2.347,
+ "maxMs": 2.347,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.161,
+ "p50Ms": 1.161,
+ "p95Ms": 1.161,
+ "maxMs": 1.161,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.16,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.053,
+ "p50Ms": 0.053,
+ "p95Ms": 0.053,
+ "maxMs": 0.053,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007536669999999995,
+ "allocatedBytes": 1860600,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 466.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 12.91,
+ "avgMs": 12.909,
+ "p95Ms": 12.909,
+ "maxMs": 12.909
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.487,
+ "maxMs": 1.487
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.528,
+ "maxMs": 1.528
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 1.11,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.75,
+ "avgMs": 0.75,
+ "p50Ms": 0.75,
+ "p95Ms": 0.75,
+ "maxMs": 0.75,
+ "mainThreadMs": 0.75,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.53,
+ "avgMs": 1.528,
+ "p50Ms": 1.528,
+ "p95Ms": 1.528,
+ "maxMs": 1.528,
+ "mainThreadMs": 1.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.03,
+ "avgMs": 1.033,
+ "p50Ms": 1.033,
+ "p95Ms": 1.033,
+ "maxMs": 1.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.03,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.041,
+ "p50Ms": 0.041,
+ "p95Ms": 0.041,
+ "maxMs": 0.041,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860536,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 482.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.48,
+ "avgMs": 18.481,
+ "p95Ms": 18.481,
+ "maxMs": 18.481
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.026,
+ "maxMs": 2.026
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.829,
+ "maxMs": 2.829
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.78,
+ "backgroundMs": 1.99,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.95,
+ "avgMs": 0.945,
+ "p50Ms": 0.945,
+ "p95Ms": 0.945,
+ "maxMs": 0.945,
+ "mainThreadMs": 0.95,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.83,
+ "avgMs": 2.829,
+ "p50Ms": 2.829,
+ "p95Ms": 2.829,
+ "maxMs": 2.829,
+ "mainThreadMs": 2.83,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.86,
+ "avgMs": 1.863,
+ "p50Ms": 1.863,
+ "p95Ms": 1.863,
+ "maxMs": 1.863,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.86,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007888340000000021,
+ "allocatedBytes": 1860800,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 482.43,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.47,
+ "avgMs": 17.474,
+ "p95Ms": 17.474,
+ "maxMs": 17.474
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.727,
+ "maxMs": 1.727
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.19,
+ "maxMs": 2.19
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.19,
+ "backgroundMs": 3.07,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1,
+ "avgMs": 1.002,
+ "p50Ms": 1.002,
+ "p95Ms": 1.002,
+ "maxMs": 1.002,
+ "mainThreadMs": 1,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.19,
+ "avgMs": 2.19,
+ "p50Ms": 2.19,
+ "p95Ms": 2.19,
+ "maxMs": 2.19,
+ "mainThreadMs": 2.19,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 2.92,
+ "avgMs": 2.919,
+ "p50Ms": 2.919,
+ "p95Ms": 2.919,
+ "maxMs": 2.919,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.92,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.078,
+ "p50Ms": 0.078,
+ "p95Ms": 0.078,
+ "maxMs": 0.078,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860752,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 482.65,
+ "commits": {
+ "count": 1,
+ "totalMs": 18.05,
+ "avgMs": 18.05,
+ "p95Ms": 18.05,
+ "maxMs": 18.05
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.637,
+ "maxMs": 1.637
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.386,
+ "maxMs": 2.386
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.64,
+ "backgroundMs": 1.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 1.19,
+ "avgMs": 1.188,
+ "p50Ms": 1.188,
+ "p95Ms": 1.188,
+ "maxMs": 1.188,
+ "mainThreadMs": 1.19,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.39,
+ "avgMs": 2.386,
+ "p50Ms": 2.386,
+ "p95Ms": 2.386,
+ "maxMs": 2.386,
+ "mainThreadMs": 2.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.65,
+ "avgMs": 1.649,
+ "p50Ms": 1.649,
+ "p95Ms": 1.649,
+ "maxMs": 1.649,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.65,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.09,
+ "p50Ms": 0.09,
+ "p95Ms": 0.09,
+ "maxMs": 0.09,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.067,
+ "p50Ms": 1.067,
+ "p95Ms": 1.067,
+ "maxMs": 1.067,
+ "mainThreadMs": 1.07,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013412079999999965,
+ "allocatedBytes": 1861200,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 482.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 16.57,
+ "avgMs": 16.566,
+ "p95Ms": 16.566,
+ "maxMs": 16.566
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.03,
+ "maxMs": 2.03
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.628,
+ "maxMs": 2.628
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.77,
+ "backgroundMs": 2.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.981,
+ "p50Ms": 0.981,
+ "p95Ms": 0.981,
+ "maxMs": 0.981,
+ "mainThreadMs": 0.98,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.63,
+ "avgMs": 2.628,
+ "p50Ms": 2.628,
+ "p95Ms": 2.628,
+ "maxMs": 2.628,
+ "mainThreadMs": 2.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.88,
+ "avgMs": 1.876,
+ "p50Ms": 1.876,
+ "p95Ms": 1.876,
+ "maxMs": 1.876,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.88,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.163,
+ "p50Ms": 0.163,
+ "p95Ms": 0.163,
+ "maxMs": 0.163,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1861200,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 465.43,
+ "commits": {
+ "count": 1,
+ "totalMs": 13.7,
+ "avgMs": 13.701,
+ "p95Ms": 13.701,
+ "maxMs": 13.701
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.545,
+ "maxMs": 1.545
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.878,
+ "maxMs": 1.878
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 1.39,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.883,
+ "p50Ms": 0.883,
+ "p95Ms": 0.883,
+ "maxMs": 0.883,
+ "mainThreadMs": 0.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.88,
+ "avgMs": 1.878,
+ "p50Ms": 1.878,
+ "p95Ms": 1.878,
+ "maxMs": 1.878,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.29,
+ "avgMs": 1.289,
+ "p50Ms": 1.289,
+ "p95Ms": 1.289,
+ "maxMs": 1.289,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.29,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0009915000000000063,
+ "allocatedBytes": 1860976,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 466.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 14.12,
+ "avgMs": 14.124,
+ "p95Ms": 14.124,
+ "maxMs": 14.124
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 3.172,
+ "maxMs": 3.172
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.876,
+ "maxMs": 2.876
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.53,
+ "backgroundMs": 1.37,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.657,
+ "p50Ms": 0.657,
+ "p95Ms": 0.657,
+ "maxMs": 0.657,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.88,
+ "avgMs": 2.876,
+ "p50Ms": 2.876,
+ "p95Ms": 2.876,
+ "maxMs": 2.876,
+ "mainThreadMs": 2.88,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.254,
+ "p50Ms": 1.254,
+ "p95Ms": 1.254,
+ "maxMs": 1.254,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.25,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860984,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 465.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.49,
+ "avgMs": 11.489,
+ "p95Ms": 11.489,
+ "maxMs": 11.489
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.015,
+ "maxMs": 1.015
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.707,
+ "maxMs": 1.707
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.32,
+ "backgroundMs": 1.27,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.519,
+ "p50Ms": 0.519,
+ "p95Ms": 0.519,
+ "maxMs": 0.519,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.71,
+ "avgMs": 1.707,
+ "p50Ms": 1.707,
+ "p95Ms": 1.707,
+ "maxMs": 1.707,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.17,
+ "avgMs": 1.169,
+ "p50Ms": 1.169,
+ "p95Ms": 1.169,
+ "maxMs": 1.169,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.17,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.096,
+ "p50Ms": 0.096,
+ "p95Ms": 0.096,
+ "maxMs": 0.096,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1860992,
+ "heapSizeAfterBytes": 25165824
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 464.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.04,
+ "avgMs": 10.043,
+ "p95Ms": 10.043,
+ "maxMs": 10.043
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.04,
+ "maxMs": 1.04
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.208,
+ "maxMs": 1.208
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 1.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.507,
+ "p50Ms": 0.507,
+ "p95Ms": 0.507,
+ "maxMs": 0.507,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.208,
+ "p50Ms": 1.208,
+ "p95Ms": 1.208,
+ "maxMs": 1.208,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.93,
+ "avgMs": 0.925,
+ "p50Ms": 0.925,
+ "p95Ms": 0.925,
+ "maxMs": 0.925,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.93,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.044,
+ "p50Ms": 0.044,
+ "p95Ms": 0.044,
+ "maxMs": 0.044,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.129,
+ "p50Ms": 0.129,
+ "p95Ms": 0.129,
+ "maxMs": 0.129,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2019384,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 465.68,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.57,
+ "avgMs": 10.566,
+ "p95Ms": 10.566,
+ "maxMs": 10.566
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.7,
+ "maxMs": 1.7
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.386,
+ "maxMs": 3.386
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.08,
+ "backgroundMs": 1.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.56,
+ "p50Ms": 0.56,
+ "p95Ms": 0.56,
+ "maxMs": 0.56,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.39,
+ "avgMs": 3.386,
+ "p50Ms": 3.386,
+ "p95Ms": 3.386,
+ "maxMs": 3.386,
+ "mainThreadMs": 3.39,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.05,
+ "avgMs": 1.05,
+ "p50Ms": 1.05,
+ "p95Ms": 1.05,
+ "maxMs": 1.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.05,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.139,
+ "p50Ms": 0.139,
+ "p95Ms": 0.139,
+ "maxMs": 0.139,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00024620799999999776,
+ "allocatedBytes": 2019392,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 466.77,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.77,
+ "avgMs": 10.765,
+ "p95Ms": 10.765,
+ "maxMs": 10.765
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.094,
+ "maxMs": 1.094
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.831,
+ "maxMs": 1.831
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.47,
+ "backgroundMs": 1.06,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.51,
+ "avgMs": 0.512,
+ "p50Ms": 0.512,
+ "p95Ms": 0.512,
+ "maxMs": 0.512,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.83,
+ "avgMs": 1.831,
+ "p50Ms": 1.831,
+ "p95Ms": 1.831,
+ "maxMs": 1.831,
+ "mainThreadMs": 1.83,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.967,
+ "p50Ms": 0.967,
+ "p95Ms": 0.967,
+ "maxMs": 0.967,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.97,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2028152,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 482.11,
+ "commits": {
+ "count": 1,
+ "totalMs": 17.24,
+ "avgMs": 17.237,
+ "p95Ms": 17.237,
+ "maxMs": 17.237
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 2.011,
+ "maxMs": 2.011
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.159,
+ "maxMs": 2.159
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 10,
+ "mainThreadMs": 3.54,
+ "backgroundMs": 1.96,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.96,
+ "avgMs": 0.96,
+ "p50Ms": 0.96,
+ "p95Ms": 0.96,
+ "maxMs": 0.96,
+ "mainThreadMs": 0.96,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.16,
+ "avgMs": 2.159,
+ "p50Ms": 2.159,
+ "p95Ms": 2.159,
+ "maxMs": 2.159,
+ "mainThreadMs": 2.16,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.8,
+ "avgMs": 1.8,
+ "p50Ms": 1.8,
+ "p95Ms": 1.8,
+ "maxMs": 1.8,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.8,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.082,
+ "p50Ms": 0.082,
+ "p95Ms": 0.082,
+ "maxMs": 0.082,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.308,
+ "p50Ms": 0.308,
+ "p95Ms": 0.308,
+ "maxMs": 0.308,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.111,
+ "p50Ms": 0.111,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0006006659999999997,
+ "allocatedBytes": 2023296,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 1000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 466.42,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.99,
+ "avgMs": 11.991,
+ "p95Ms": 11.991,
+ "maxMs": 11.991
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.216,
+ "maxMs": 1.216
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.45,
+ "maxMs": 1.45
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.3,
+ "backgroundMs": 1.5,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.7,
+ "avgMs": 0.7,
+ "p50Ms": 0.7,
+ "p95Ms": 0.7,
+ "maxMs": 0.7,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.45,
+ "avgMs": 1.45,
+ "p50Ms": 1.45,
+ "p95Ms": 1.45,
+ "maxMs": 1.45,
+ "mainThreadMs": 1.45,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.38,
+ "avgMs": 1.383,
+ "p50Ms": 1.383,
+ "p95Ms": 1.383,
+ "maxMs": 1.383,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.38,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.151,
+ "p50Ms": 0.151,
+ "p95Ms": 0.151,
+ "maxMs": 0.151,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 7
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 2019368,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 0
+ },
+ "wallMs": 483.04,
+ "commits": {
+ "count": 1,
+ "totalMs": 9.27,
+ "avgMs": 9.266,
+ "p95Ms": 9.266,
+ "maxMs": 9.266
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.197,
+ "maxMs": 1.197
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.339,
+ "maxMs": 1.339
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 1.37,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.588,
+ "p50Ms": 0.588,
+ "p95Ms": 0.588,
+ "maxMs": 0.588,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.339,
+ "p50Ms": 1.339,
+ "p95Ms": 1.339,
+ "maxMs": 1.339,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.241,
+ "p50Ms": 1.241,
+ "p95Ms": 1.241,
+ "maxMs": 1.241,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.025,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.07,
+ "p50Ms": 0.07,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.65,
+ "avgMs": 0.65,
+ "p50Ms": 0.65,
+ "p95Ms": 0.65,
+ "maxMs": 0.65,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0011421669999999995,
+ "allocatedBytes": 3705360,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 1
+ },
+ "wallMs": 483.14,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.62,
+ "avgMs": 10.622,
+ "p95Ms": 10.622,
+ "maxMs": 10.622
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.107,
+ "maxMs": 1.107
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.697,
+ "maxMs": 1.697
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 10,
+ "mainThreadMs": 2.8,
+ "backgroundMs": 1.23,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.61,
+ "avgMs": 0.614,
+ "p50Ms": 0.614,
+ "p95Ms": 0.614,
+ "maxMs": 0.614,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.7,
+ "avgMs": 1.697,
+ "p50Ms": 1.697,
+ "p95Ms": 1.697,
+ "maxMs": 1.697,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.1,
+ "avgMs": 1.101,
+ "p50Ms": 1.101,
+ "p95Ms": 1.101,
+ "maxMs": 1.101,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.1,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 82
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 82
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.46,
+ "avgMs": 0.458,
+ "p50Ms": 0.458,
+ "p95Ms": 0.458,
+ "maxMs": 0.458,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0,
+ "items": 60
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.03,
+ "p50Ms": 0.03,
+ "p95Ms": 0.03,
+ "maxMs": 0.03,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001262750000000007,
+ "allocatedBytes": 3741792,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 2
+ },
+ "wallMs": 498.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 20.89,
+ "avgMs": 20.889,
+ "p95Ms": 20.889,
+ "maxMs": 20.889
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.331,
+ "maxMs": 1.331
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.755,
+ "maxMs": 1.755
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.06,
+ "backgroundMs": 1.69,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.81,
+ "avgMs": 0.81,
+ "p50Ms": 0.81,
+ "p95Ms": 0.81,
+ "maxMs": 0.81,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.75,
+ "avgMs": 1.755,
+ "p50Ms": 1.755,
+ "p95Ms": 1.755,
+ "maxMs": 1.755,
+ "mainThreadMs": 1.75,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.578,
+ "p50Ms": 1.578,
+ "p95Ms": 1.578,
+ "maxMs": 1.578,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.058,
+ "p50Ms": 0.058,
+ "p95Ms": 0.058,
+ "maxMs": 0.058,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.06,
+ "items": 83
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.493,
+ "p50Ms": 0.493,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.007473124999999997,
+ "allocatedBytes": 3705256,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 3
+ },
+ "wallMs": 483.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.28,
+ "avgMs": 8.282,
+ "p95Ms": 8.282,
+ "maxMs": 8.282
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.026,
+ "maxMs": 1.026
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.624,
+ "maxMs": 1.624
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 2.5,
+ "backgroundMs": 1.08,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.53,
+ "avgMs": 0.527,
+ "p50Ms": 0.527,
+ "p95Ms": 0.527,
+ "maxMs": 0.527,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.624,
+ "p50Ms": 1.624,
+ "p95Ms": 1.624,
+ "maxMs": 1.624,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.98,
+ "avgMs": 0.985,
+ "p50Ms": 0.985,
+ "p95Ms": 0.985,
+ "maxMs": 0.985,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.98,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 83
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 60
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.047,
+ "p50Ms": 0.047,
+ "p95Ms": 0.047,
+ "maxMs": 0.047,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 83
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.351,
+ "p50Ms": 0.351,
+ "p95Ms": 0.351,
+ "maxMs": 0.351,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0006357909999999967,
+ "allocatedBytes": 3705464,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 10000,
+ "total": 10000,
+ "repeat": 4
+ },
+ "wallMs": 483.07,
+ "commits": {
+ "count": 1,
+ "totalMs": 8.55,
+ "avgMs": 8.551,
+ "p95Ms": 8.551,
+ "maxMs": 8.551
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.082,
+ "maxMs": 1.082
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.071,
+ "maxMs": 3.071
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 4.34,
+ "backgroundMs": 1.34,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.628,
+ "p50Ms": 0.628,
+ "p95Ms": 0.628,
+ "maxMs": 0.628,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 3.07,
+ "avgMs": 3.071,
+ "p50Ms": 3.071,
+ "p95Ms": 3.071,
+ "maxMs": 3.071,
+ "mainThreadMs": 3.07,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.24,
+ "avgMs": 1.239,
+ "p50Ms": 1.239,
+ "p95Ms": 1.239,
+ "maxMs": 1.239,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.24,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 84
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 59
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 84
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.64,
+ "avgMs": 0.642,
+ "p50Ms": 0.642,
+ "p95Ms": 0.642,
+ "maxMs": 0.642,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 60
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0005789999999999962,
+ "allocatedBytes": 3705600,
+ "heapSizeAfterBytes": 33554432
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-1k-children",
+ "name": "Marker update cost at 1k (children)",
+ "group": "mutations",
+ "tags": [
+ "baseline"
+ ],
+ "description": "With 1000 markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, 5 repeats each.",
+ "recordedAt": "2026-09-10T14:11:00.311Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 19491,
+ "load": {
+ "commitMs": 1.86,
+ "readyMs": 103,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 18.59,
+ "backgroundMs": 0.41,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.11,
+ "avgMs": 0.037,
+ "p50Ms": 0.053,
+ "p95Ms": 0.056,
+ "maxMs": 0.056,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.06,
+ "avgMs": 0.031,
+ "p50Ms": 0.002,
+ "p95Ms": 0.06,
+ "maxMs": 0.06,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.38,
+ "avgMs": 0.127,
+ "p50Ms": 0.132,
+ "p95Ms": 0.134,
+ "maxMs": 0.134,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 18.37,
+ "avgMs": 4.591,
+ "p50Ms": 0.015,
+ "p95Ms": 18.306,
+ "maxMs": 18.306,
+ "mainThreadMs": 18.37,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1448440,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 1114,
+ "durationMs": 18669.3,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.7,
+ "p50": 60,
+ "p95": 56,
+ "p99": 56,
+ "worstWindow": 56,
+ "windows": 19
+ },
+ "frameTimeMs": {
+ "average": 16.76,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 84.25,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 1111,
+ 0,
+ 1,
+ 1,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0027,
+ "droppedFrames": 6,
+ "longFrames": 1,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 1121,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.68,
+ "max": 0.9
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.2,
+ "max": 17.56
+ },
+ "lateFrames": 0,
+ "busyMs": 149,
+ "busyRatio": 0.008,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 18670.6,
+ "commits": {
+ "count": 40,
+ "totalMs": 190.32,
+ "avgMs": 4.758,
+ "p95Ms": 7.488,
+ "maxMs": 10.081
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 40,
+ "avgMs": 0.343,
+ "maxMs": 0.529
+ },
+ "setterMs": {
+ "samples": 40,
+ "avgMs": 0.329,
+ "maxMs": 0.835
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 447,
+ "mainThreadMs": 21.94,
+ "backgroundMs": 9.33,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 41,
+ "totalMs": 4.18,
+ "avgMs": 0.102,
+ "p50Ms": 0.108,
+ "p95Ms": 0.134,
+ "maxMs": 0.141,
+ "mainThreadMs": 4.18,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "markers.set": {
+ "count": 41,
+ "totalMs": 13.28,
+ "avgMs": 0.324,
+ "p50Ms": 0.329,
+ "p95Ms": 0.479,
+ "maxMs": 0.835,
+ "mainThreadMs": 13.28,
+ "backgroundMs": 0,
+ "items": 41025
+ },
+ "polylines.set": {
+ "count": 41,
+ "totalMs": 0.07,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 41,
+ "totalMs": 0.03,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.002,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 41,
+ "totalMs": 0.03,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 40,
+ "totalMs": 7.33,
+ "avgMs": 0.183,
+ "p50Ms": 0.178,
+ "p95Ms": 0.261,
+ "maxMs": 0.412,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.33,
+ "items": 40025
+ },
+ "markers.candidates": {
+ "count": 40,
+ "totalMs": 0.38,
+ "avgMs": 0.01,
+ "p50Ms": 0.006,
+ "p95Ms": 0.012,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.38,
+ "items": 40025
+ },
+ "markers.viewportFilter": {
+ "count": 40,
+ "totalMs": 0.09,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 280
+ },
+ "markers.diff": {
+ "count": 40,
+ "totalMs": 0.42,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.016,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.42,
+ "items": 162
+ },
+ "markers.viewportCompute": {
+ "count": 40,
+ "totalMs": 1.12,
+ "avgMs": 0.028,
+ "p50Ms": 0.023,
+ "p95Ms": 0.066,
+ "maxMs": 0.131,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.12,
+ "items": 280
+ },
+ "markers.applyDiff": {
+ "count": 40,
+ "totalMs": 4.16,
+ "avgMs": 0.104,
+ "p50Ms": 0.001,
+ "p95Ms": 0.21,
+ "maxMs": 2.3,
+ "mainThreadMs": 4.16,
+ "backgroundMs": 0,
+ "items": 29
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.197,
+ "p50Ms": 0.197,
+ "p95Ms": 0.197,
+ "maxMs": 0.197,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 195,
+ "afterLoadMB": 232.1,
+ "afterInteractionMB": 223.3,
+ "afterCleanupMB": 177.3,
+ "peakMB": 232.1,
+ "loadDeltaMB": 37.1,
+ "interactionDeltaMB": -8.8,
+ "retainedAfterCleanupMB": -17.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 195,
+ "residentMB": 369.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 115610,
+ "mallocMB": 102
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 232.1,
+ "residentMB": 365.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 270294,
+ "mallocMB": 136.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 223.3,
+ "residentMB": 331,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 268696,
+ "mallocMB": 120.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 177.3,
+ "residentMB": 348.7,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 117758,
+ "mallocMB": 89.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 49251528,
+ "gcCount": 13,
+ "gcTimeMs": 0.03445308300000002,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -1598,
+ "mallocBytesDelta": -16476592
+ }
+ },
+ "cpu": {
+ "processCpuMs": 760,
+ "wallMs": 18678,
+ "percent": 4.1,
+ "threadsBefore": 21,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markerChildren": 41,
+ "region": 1
+ },
+ "payload": {
+ "markerChildren": {
+ "items": 41025,
+ "coordinates": 41025,
+ "estimatedBytes": 2937158
+ }
+ },
+ "largestUpdate": {
+ "markerChildren": {
+ "items": 1005,
+ "coordinates": 1005,
+ "estimatedBytes": 71954
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 468.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.52,
+ "avgMs": 4.52,
+ "p95Ms": 4.52,
+ "maxMs": 4.52
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.277,
+ "maxMs": 0.277
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.316,
+ "maxMs": 0.316
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.116,
+ "p50Ms": 0.116,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.316,
+ "p50Ms": 0.316,
+ "p95Ms": 0.316,
+ "maxMs": 0.316,
+ "mainThreadMs": 0.32,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.138,
+ "p50Ms": 0.138,
+ "p95Ms": 0.138,
+ "maxMs": 0.138,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016153750000000022,
+ "allocatedBytes": 1198600,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 1,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 1
+ },
+ "wallMs": 466.1,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.53,
+ "avgMs": 4.526,
+ "p95Ms": 4.526,
+ "maxMs": 4.526
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.406,
+ "maxMs": 0.406
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.327,
+ "maxMs": 0.327
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.327,
+ "p50Ms": 0.327,
+ "p95Ms": 0.327,
+ "maxMs": 0.327,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.186,
+ "p50Ms": 0.186,
+ "p95Ms": 0.186,
+ "maxMs": 0.186,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1198952,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 2,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 2
+ },
+ "wallMs": 466.25,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.91,
+ "avgMs": 4.905,
+ "p95Ms": 4.905,
+ "maxMs": 4.905
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.406,
+ "maxMs": 0.406
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.329,
+ "maxMs": 0.329
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.46,
+ "backgroundMs": 0.27,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.126,
+ "p50Ms": 0.126,
+ "p95Ms": 0.126,
+ "maxMs": 0.126,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.329,
+ "p50Ms": 0.329,
+ "p95Ms": 0.329,
+ "maxMs": 0.329,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.216,
+ "p50Ms": 0.216,
+ "p95Ms": 0.216,
+ "maxMs": 0.216,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.22,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.033,
+ "p50Ms": 0.033,
+ "p95Ms": 0.033,
+ "maxMs": 0.033,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1201392,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 3,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 3
+ },
+ "wallMs": 465.54,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.29,
+ "avgMs": 7.287,
+ "p95Ms": 7.287,
+ "maxMs": 7.287
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.382,
+ "maxMs": 0.382
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.347,
+ "maxMs": 0.347
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.118,
+ "p50Ms": 0.118,
+ "p95Ms": 0.118,
+ "maxMs": 0.118,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.347,
+ "p50Ms": 0.347,
+ "p95Ms": 0.347,
+ "maxMs": 0.347,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.208,
+ "p50Ms": 0.208,
+ "p95Ms": 0.208,
+ "maxMs": 0.208,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0026918749999999964,
+ "allocatedBytes": 1198968,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 4,
+ "label": "add-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 4
+ },
+ "wallMs": 466.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.64,
+ "avgMs": 4.642,
+ "p95Ms": 4.642,
+ "maxMs": 4.642
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.529,
+ "maxMs": 0.529
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.493,
+ "maxMs": 0.493
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.106,
+ "p50Ms": 0.106,
+ "p95Ms": 0.106,
+ "maxMs": 0.106,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.49,
+ "avgMs": 0.493,
+ "p50Ms": 0.493,
+ "p95Ms": 0.493,
+ "maxMs": 0.493,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.209,
+ "p50Ms": 0.209,
+ "p95Ms": 0.209,
+ "maxMs": 0.209,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1005
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1005
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1204064,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 5,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1005,
+ "repeat": 0
+ },
+ "wallMs": 466.26,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.26,
+ "avgMs": 5.257,
+ "p95Ms": 5.257,
+ "maxMs": 5.257
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.38,
+ "maxMs": 0.38
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.341,
+ "maxMs": 0.341
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.12,
+ "p50Ms": 0.12,
+ "p95Ms": 0.12,
+ "maxMs": 0.12,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.341,
+ "p50Ms": 0.341,
+ "p95Ms": 0.341,
+ "maxMs": 0.341,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.21,
+ "p50Ms": 0.21,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1004
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1004
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1192176,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 6,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1004,
+ "repeat": 1
+ },
+ "wallMs": 465.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.16,
+ "avgMs": 5.156,
+ "p95Ms": 5.156,
+ "maxMs": 5.156
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.285,
+ "maxMs": 0.285
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.373,
+ "maxMs": 0.373
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.52,
+ "backgroundMs": 0.23,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.141,
+ "p50Ms": 0.141,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.373,
+ "p50Ms": 0.373,
+ "p95Ms": 0.373,
+ "maxMs": 0.373,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.187,
+ "p50Ms": 0.187,
+ "p95Ms": 0.187,
+ "maxMs": 0.187,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1003
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1003
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1188904,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 7,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1003,
+ "repeat": 2
+ },
+ "wallMs": 465.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.94,
+ "avgMs": 5.937,
+ "p95Ms": 5.937,
+ "maxMs": 5.937
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.286,
+ "maxMs": 0.286
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.346,
+ "maxMs": 0.346
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.139,
+ "p50Ms": 0.139,
+ "p95Ms": 0.139,
+ "maxMs": 0.139,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.346,
+ "p50Ms": 0.346,
+ "p95Ms": 0.346,
+ "maxMs": 0.346,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.175,
+ "p50Ms": 0.175,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1002
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1002
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0018869579999999941,
+ "allocatedBytes": 1187632,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 8,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1002,
+ "repeat": 3
+ },
+ "wallMs": 465.82,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.76,
+ "avgMs": 3.765,
+ "p95Ms": 3.765,
+ "maxMs": 3.765
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.275,
+ "maxMs": 0.275
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.306,
+ "maxMs": 0.306
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.43,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.119,
+ "p50Ms": 0.119,
+ "p95Ms": 0.119,
+ "maxMs": 0.119,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.306,
+ "p50Ms": 0.306,
+ "p95Ms": 0.306,
+ "maxMs": 0.306,
+ "mainThreadMs": 0.31,
+ "backgroundMs": 0,
+ "items": 1001
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.194,
+ "p50Ms": 0.194,
+ "p95Ms": 0.194,
+ "maxMs": 0.194,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1001
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1001
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1186624,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 9,
+ "label": "remove-1",
+ "meta": {
+ "changed": 1,
+ "total": 1001,
+ "repeat": 4
+ },
+ "wallMs": 465.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.16,
+ "avgMs": 4.156,
+ "p95Ms": 4.156,
+ "maxMs": 4.156
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.466,
+ "maxMs": 0.466
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.479,
+ "maxMs": 0.479
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.59,
+ "backgroundMs": 0.37,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.107,
+ "p50Ms": 0.107,
+ "p95Ms": 0.107,
+ "maxMs": 0.107,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.479,
+ "p50Ms": 0.479,
+ "p95Ms": 0.479,
+ "maxMs": 0.479,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.303,
+ "p50Ms": 0.303,
+ "p95Ms": 0.303,
+ "maxMs": 0.303,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.3,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.034,
+ "p50Ms": 0.034,
+ "p95Ms": 0.034,
+ "maxMs": 0.034,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1193520,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 10,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 10.08,
+ "avgMs": 10.081,
+ "p95Ms": 10.081,
+ "maxMs": 10.081
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.413,
+ "maxMs": 0.413
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.328,
+ "maxMs": 0.328
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.115,
+ "p50Ms": 0.115,
+ "p95Ms": 0.115,
+ "maxMs": 0.115,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.328,
+ "p50Ms": 0.328,
+ "p95Ms": 0.328,
+ "maxMs": 0.328,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.191,
+ "p50Ms": 0.191,
+ "p95Ms": 0.191,
+ "maxMs": 0.191,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.19,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.027,
+ "p50Ms": 0.027,
+ "p95Ms": 0.027,
+ "maxMs": 0.027,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.002837791000000006,
+ "allocatedBytes": 1185552,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 11,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.57,
+ "avgMs": 2.575,
+ "p95Ms": 2.575,
+ "maxMs": 2.575
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.216,
+ "maxMs": 0.216
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.194,
+ "maxMs": 0.194
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0.15,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.073,
+ "p50Ms": 0.073,
+ "p95Ms": 0.073,
+ "maxMs": 0.073,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.194,
+ "p50Ms": 0.194,
+ "p95Ms": 0.194,
+ "maxMs": 0.194,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.121,
+ "p50Ms": 0.121,
+ "p95Ms": 0.121,
+ "maxMs": 0.121,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1189600,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 12,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 466.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.47,
+ "avgMs": 2.467,
+ "p95Ms": 2.467,
+ "maxMs": 2.467
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.453,
+ "maxMs": 0.453
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.272,
+ "maxMs": 0.272
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0.17,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.076,
+ "p50Ms": 0.076,
+ "p95Ms": 0.076,
+ "maxMs": 0.076,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.272,
+ "p50Ms": 0.272,
+ "p95Ms": 0.272,
+ "maxMs": 0.272,
+ "mainThreadMs": 0.27,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.148,
+ "p50Ms": 0.148,
+ "p95Ms": 0.148,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1185480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 13,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.19,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.11,
+ "avgMs": 4.108,
+ "p95Ms": 4.108,
+ "maxMs": 4.108
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.328,
+ "maxMs": 0.328
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.343,
+ "maxMs": 0.343
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0.24,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.34,
+ "avgMs": 0.343,
+ "p50Ms": 0.343,
+ "p95Ms": 0.343,
+ "maxMs": 0.343,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.2,
+ "p50Ms": 0.2,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1185480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 14,
+ "label": "update-1",
+ "meta": {
+ "changed": 1,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.49,
+ "avgMs": 7.488,
+ "p95Ms": 7.488,
+ "maxMs": 7.488
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.209,
+ "maxMs": 0.209
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.179,
+ "maxMs": 0.179
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0.12,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.179,
+ "p50Ms": 0.179,
+ "p95Ms": 0.179,
+ "maxMs": 0.179,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.097,
+ "p50Ms": 0.097,
+ "p95Ms": 0.097,
+ "maxMs": 0.097,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.004038957999999995,
+ "allocatedBytes": 1185480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 15,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.15,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.64,
+ "avgMs": 4.643,
+ "p95Ms": 4.643,
+ "maxMs": 4.643
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.315,
+ "maxMs": 0.315
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.3,
+ "maxMs": 0.3
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.3,
+ "avgMs": 0.3,
+ "p50Ms": 0.3,
+ "p95Ms": 0.3,
+ "maxMs": 0.3,
+ "mainThreadMs": 0.3,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.178,
+ "p50Ms": 0.178,
+ "p95Ms": 0.178,
+ "maxMs": 0.178,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187240,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 16,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 466.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.4,
+ "avgMs": 2.398,
+ "p95Ms": 2.398,
+ "maxMs": 2.398
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.335,
+ "maxMs": 0.335
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.378,
+ "maxMs": 0.378
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.068,
+ "p50Ms": 0.068,
+ "p95Ms": 0.068,
+ "maxMs": 0.068,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.378,
+ "p50Ms": 0.378,
+ "p95Ms": 0.378,
+ "maxMs": 0.378,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.12,
+ "p50Ms": 0.12,
+ "p95Ms": 0.12,
+ "maxMs": 0.12,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.022,
+ "p50Ms": 0.022,
+ "p95Ms": 0.022,
+ "maxMs": 0.022,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187496,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 17,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.34,
+ "avgMs": 7.339,
+ "p95Ms": 7.339,
+ "maxMs": 7.339
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.301,
+ "maxMs": 0.301
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.198,
+ "maxMs": 0.198
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0.2,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.054,
+ "p50Ms": 0.054,
+ "p95Ms": 0.054,
+ "maxMs": 0.054,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.198,
+ "p50Ms": 0.198,
+ "p95Ms": 0.198,
+ "maxMs": 0.198,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.003089042000000014,
+ "allocatedBytes": 1187240,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 18,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.05,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.29,
+ "avgMs": 2.291,
+ "p95Ms": 2.291,
+ "maxMs": 2.291
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.222,
+ "maxMs": 0.222
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.22,
+ "maxMs": 0.22
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.29,
+ "backgroundMs": 0.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.22,
+ "avgMs": 0.22,
+ "p50Ms": 0.22,
+ "p95Ms": 0.22,
+ "maxMs": 0.22,
+ "mainThreadMs": 0.22,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203640,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 19,
+ "label": "update-10",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.48,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.27,
+ "avgMs": 5.271,
+ "p95Ms": 5.271,
+ "maxMs": 5.271
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.356,
+ "maxMs": 0.356
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.362,
+ "maxMs": 0.362
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.49,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.121,
+ "p50Ms": 0.121,
+ "p95Ms": 0.121,
+ "maxMs": 0.121,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.362,
+ "p50Ms": 0.362,
+ "p95Ms": 0.362,
+ "maxMs": 0.362,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.213,
+ "p50Ms": 0.213,
+ "p95Ms": 0.213,
+ "maxMs": 0.213,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.21,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187240,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 20,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.06,
+ "avgMs": 4.056,
+ "p95Ms": 4.056,
+ "maxMs": 4.056
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.379,
+ "maxMs": 0.379
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.835,
+ "maxMs": 0.835
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 3.25,
+ "backgroundMs": 0.32,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.117,
+ "p50Ms": 0.117,
+ "p95Ms": 0.117,
+ "maxMs": 0.117,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.84,
+ "avgMs": 0.835,
+ "p50Ms": 0.835,
+ "p95Ms": 0.835,
+ "maxMs": 0.835,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.261,
+ "p50Ms": 0.261,
+ "p95Ms": 0.261,
+ "maxMs": 0.261,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.038,
+ "p50Ms": 0.038,
+ "p95Ms": 0.038,
+ "maxMs": 0.038,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 2.3,
+ "avgMs": 2.3,
+ "p50Ms": 2.3,
+ "p95Ms": 2.3,
+ "maxMs": 2.3,
+ "mainThreadMs": 2.3,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.006312499999999999,
+ "allocatedBytes": 1203520,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 21,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.81,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.67,
+ "avgMs": 4.666,
+ "p95Ms": 4.666,
+ "maxMs": 4.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.393,
+ "maxMs": 0.393
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.188,
+ "maxMs": 0.188
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.19,
+ "avgMs": 0.188,
+ "p50Ms": 0.188,
+ "p95Ms": 0.188,
+ "maxMs": 0.188,
+ "mainThreadMs": 0.19,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.087,
+ "p50Ms": 0.087,
+ "p95Ms": 0.087,
+ "maxMs": 0.087,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203504,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 22,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.16,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.3,
+ "avgMs": 4.303,
+ "p95Ms": 4.303,
+ "maxMs": 4.303
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.366,
+ "maxMs": 0.366
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.36,
+ "maxMs": 0.36
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.58,
+ "backgroundMs": 0.25,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.134,
+ "p50Ms": 0.134,
+ "p95Ms": 0.134,
+ "maxMs": 0.134,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.36,
+ "p50Ms": 0.36,
+ "p95Ms": 0.36,
+ "maxMs": 0.36,
+ "mainThreadMs": 0.36,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.198,
+ "p50Ms": 0.198,
+ "p95Ms": 0.198,
+ "maxMs": 0.198,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.088,
+ "p50Ms": 0.088,
+ "p95Ms": 0.088,
+ "maxMs": 0.088,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1211728,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 23,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.23,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.37,
+ "avgMs": 2.372,
+ "p95Ms": 2.372,
+ "maxMs": 2.372
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.221,
+ "maxMs": 0.221
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.25,
+ "maxMs": 0.25
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.25,
+ "p50Ms": 0.25,
+ "p95Ms": 0.25,
+ "maxMs": 0.25,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.11,
+ "p50Ms": 0.11,
+ "p95Ms": 0.11,
+ "maxMs": 0.11,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.09,
+ "p50Ms": 0.09,
+ "p95Ms": 0.09,
+ "maxMs": 0.09,
+ "mainThreadMs": 0.09,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203512,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 24,
+ "label": "update-100",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.21,
+ "avgMs": 6.215,
+ "p95Ms": 6.215,
+ "maxMs": 6.215
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.242,
+ "maxMs": 0.242
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.196,
+ "maxMs": 0.196
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.34,
+ "backgroundMs": 0.14,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.063,
+ "p50Ms": 0.063,
+ "p95Ms": 0.063,
+ "maxMs": 0.063,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.196,
+ "p50Ms": 0.196,
+ "p95Ms": 0.196,
+ "maxMs": 0.196,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.084,
+ "p50Ms": 0.084,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0016822499999999962,
+ "allocatedBytes": 1203424,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 25,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 465.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.94,
+ "avgMs": 4.944,
+ "p95Ms": 4.944,
+ "maxMs": 4.944
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.34,
+ "maxMs": 0.34
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.377,
+ "maxMs": 0.377
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.126,
+ "p50Ms": 0.126,
+ "p95Ms": 0.126,
+ "maxMs": 0.126,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.377,
+ "p50Ms": 0.377,
+ "p95Ms": 0.377,
+ "maxMs": 0.377,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.168,
+ "p50Ms": 0.168,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187616,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 26,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 466.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.82,
+ "avgMs": 3.825,
+ "p95Ms": 3.825,
+ "maxMs": 3.825
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.238,
+ "maxMs": 0.238
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.214,
+ "maxMs": 0.214
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.065,
+ "p50Ms": 0.065,
+ "p95Ms": 0.065,
+ "maxMs": 0.065,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.214,
+ "p50Ms": 0.214,
+ "p95Ms": 0.214,
+ "maxMs": 0.214,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.126,
+ "p50Ms": 0.126,
+ "p95Ms": 0.126,
+ "maxMs": 0.126,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.019,
+ "p50Ms": 0.019,
+ "p95Ms": 0.019,
+ "maxMs": 0.019,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 27,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.7,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.4,
+ "avgMs": 6.398,
+ "p95Ms": 6.398,
+ "maxMs": 6.398
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.419,
+ "maxMs": 0.419
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.326,
+ "maxMs": 0.326
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.45,
+ "backgroundMs": 0.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.123,
+ "p50Ms": 0.123,
+ "p95Ms": 0.123,
+ "maxMs": 0.123,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.326,
+ "p50Ms": 0.326,
+ "p95Ms": 0.326,
+ "maxMs": 0.326,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.247,
+ "p50Ms": 0.247,
+ "p95Ms": 0.247,
+ "maxMs": 0.247,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0022477919999999985,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 28,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.6,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.68,
+ "avgMs": 4.683,
+ "p95Ms": 4.683,
+ "maxMs": 4.683
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.29,
+ "maxMs": 0.29
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.278,
+ "maxMs": 0.278
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.108,
+ "p50Ms": 0.108,
+ "p95Ms": 0.108,
+ "maxMs": 0.108,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.28,
+ "avgMs": 0.278,
+ "p50Ms": 0.278,
+ "p95Ms": 0.278,
+ "maxMs": 0.278,
+ "mainThreadMs": 0.28,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.168,
+ "p50Ms": 0.168,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.026,
+ "p50Ms": 0.026,
+ "p95Ms": 0.026,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 29,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.97,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.02,
+ "avgMs": 4.018,
+ "p95Ms": 4.018,
+ "maxMs": 4.018
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.42,
+ "maxMs": 0.42
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.438,
+ "maxMs": 0.438
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0.55,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.122,
+ "p50Ms": 0.122,
+ "p95Ms": 0.122,
+ "maxMs": 0.122,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.438,
+ "p50Ms": 0.438,
+ "p95Ms": 0.438,
+ "maxMs": 0.438,
+ "mainThreadMs": 0.44,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.412,
+ "p50Ms": 0.412,
+ "p95Ms": 0.412,
+ "maxMs": 0.412,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.039,
+ "p50Ms": 0.039,
+ "p95Ms": 0.039,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.086,
+ "p50Ms": 0.086,
+ "p95Ms": 0.086,
+ "maxMs": 0.086,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1187624,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 30,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 465.92,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.19,
+ "avgMs": 4.193,
+ "p95Ms": 4.193,
+ "maxMs": 4.193
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.411,
+ "maxMs": 0.411
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.408,
+ "maxMs": 0.408
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.9,
+ "backgroundMs": 0.36,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.408,
+ "p50Ms": 0.408,
+ "p95Ms": 0.408,
+ "maxMs": 0.408,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.249,
+ "p50Ms": 0.249,
+ "p95Ms": 0.249,
+ "maxMs": 0.249,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.066,
+ "p50Ms": 0.066,
+ "p95Ms": 0.066,
+ "maxMs": 0.066,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.38,
+ "avgMs": 0.379,
+ "p50Ms": 0.379,
+ "p95Ms": 0.379,
+ "maxMs": 0.379,
+ "mainThreadMs": 0.38,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1204368,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 31,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 466.28,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.88,
+ "avgMs": 7.884,
+ "p95Ms": 7.884,
+ "maxMs": 7.884
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.443,
+ "maxMs": 0.443
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.385,
+ "maxMs": 0.385
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0.45,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.121,
+ "p50Ms": 0.121,
+ "p95Ms": 0.121,
+ "maxMs": 0.121,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.385,
+ "p50Ms": 0.385,
+ "p95Ms": 0.385,
+ "maxMs": 0.385,
+ "mainThreadMs": 0.39,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.2,
+ "p50Ms": 0.2,
+ "p95Ms": 0.2,
+ "maxMs": 0.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.103,
+ "p50Ms": 0.103,
+ "p95Ms": 0.103,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.131,
+ "p50Ms": 0.131,
+ "p95Ms": 0.131,
+ "maxMs": 0.131,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.13,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0035079169999999993,
+ "allocatedBytes": 1204048,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 32,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 465.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.12,
+ "avgMs": 4.121,
+ "p95Ms": 4.121,
+ "maxMs": 4.121
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.346,
+ "maxMs": 0.346
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.352,
+ "maxMs": 0.352
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.61,
+ "backgroundMs": 0.26,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.104,
+ "p50Ms": 0.104,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.352,
+ "p50Ms": 0.352,
+ "p95Ms": 0.352,
+ "maxMs": 0.352,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.199,
+ "p50Ms": 0.199,
+ "p95Ms": 0.199,
+ "maxMs": 0.199,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.16,
+ "avgMs": 0.155,
+ "p50Ms": 0.155,
+ "p95Ms": 0.155,
+ "maxMs": 0.155,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1204584,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 33,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 466.32,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.05,
+ "avgMs": 2.052,
+ "p95Ms": 2.052,
+ "maxMs": 2.052
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.164,
+ "maxMs": 0.164
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.169,
+ "maxMs": 0.169
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.06,
+ "avgMs": 0.062,
+ "p50Ms": 0.062,
+ "p95Ms": 0.062,
+ "maxMs": 0.062,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.169,
+ "p50Ms": 0.169,
+ "p95Ms": 0.169,
+ "maxMs": 0.169,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.102,
+ "p50Ms": 0.102,
+ "p95Ms": 0.102,
+ "maxMs": 0.102,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.1,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1203952,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 34,
+ "label": "update-10pct",
+ "meta": {
+ "changed": 100,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 466.11,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.57,
+ "avgMs": 5.573,
+ "p95Ms": 5.573,
+ "maxMs": 5.573
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.342,
+ "maxMs": 0.342
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.369,
+ "maxMs": 0.369
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0.3,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.1,
+ "avgMs": 0.104,
+ "p50Ms": 0.104,
+ "p95Ms": 0.104,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.369,
+ "p50Ms": 0.369,
+ "p95Ms": 0.369,
+ "maxMs": 0.369,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.243,
+ "p50Ms": 0.243,
+ "p95Ms": 0.243,
+ "maxMs": 0.243,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.013,
+ "maxMs": 0.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.029,
+ "p50Ms": 0.029,
+ "p95Ms": 0.029,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0018465830000000127,
+ "allocatedBytes": 1203880,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 35,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 0
+ },
+ "wallMs": 466.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.14,
+ "avgMs": 4.141,
+ "p95Ms": 4.141,
+ "maxMs": 4.141
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.49,
+ "maxMs": 0.49
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.352,
+ "maxMs": 0.352
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.7,
+ "backgroundMs": 0.22,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.132,
+ "p50Ms": 0.132,
+ "p95Ms": 0.132,
+ "maxMs": 0.132,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.35,
+ "avgMs": 0.352,
+ "p50Ms": 0.352,
+ "p95Ms": 0.352,
+ "maxMs": 0.352,
+ "mainThreadMs": 0.35,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.175,
+ "p50Ms": 0.175,
+ "p95Ms": 0.175,
+ "maxMs": 0.175,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.18,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.21,
+ "avgMs": 0.21,
+ "p50Ms": 0.21,
+ "p95Ms": 0.21,
+ "maxMs": 0.21,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1362272,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 36,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 1
+ },
+ "wallMs": 465.83,
+ "commits": {
+ "count": 1,
+ "totalMs": 3.97,
+ "avgMs": 3.968,
+ "p95Ms": 3.968,
+ "maxMs": 3.968
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.403,
+ "maxMs": 0.403
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.332,
+ "maxMs": 0.332
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0.21,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.105,
+ "p50Ms": 0.105,
+ "p95Ms": 0.105,
+ "maxMs": 0.105,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.33,
+ "avgMs": 0.332,
+ "p50Ms": 0.332,
+ "p95Ms": 0.332,
+ "maxMs": 0.332,
+ "mainThreadMs": 0.33,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.167,
+ "p50Ms": 0.167,
+ "p95Ms": 0.167,
+ "maxMs": 0.167,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.195,
+ "p50Ms": 0.195,
+ "p95Ms": 0.195,
+ "maxMs": 0.195,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1395032,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 37,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 2
+ },
+ "wallMs": 466.29,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.33,
+ "avgMs": 7.331,
+ "p95Ms": 7.331,
+ "maxMs": 7.331
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.348,
+ "maxMs": 0.348
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.247,
+ "maxMs": 0.247
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.5,
+ "backgroundMs": 0.18,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.08,
+ "p50Ms": 0.08,
+ "p95Ms": 0.08,
+ "maxMs": 0.08,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.247,
+ "p50Ms": 0.247,
+ "p95Ms": 0.247,
+ "maxMs": 0.247,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.141,
+ "p50Ms": 0.141,
+ "p95Ms": 0.141,
+ "maxMs": 0.141,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.14,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.023,
+ "p50Ms": 0.023,
+ "p95Ms": 0.023,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.17,
+ "p50Ms": 0.17,
+ "p95Ms": 0.17,
+ "maxMs": 0.17,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0026960420000000096,
+ "allocatedBytes": 1362320,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 38,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 3
+ },
+ "wallMs": 465.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.28,
+ "avgMs": 2.28,
+ "p95Ms": 2.28,
+ "maxMs": 2.28
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.17,
+ "maxMs": 0.17
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.178,
+ "maxMs": 0.178
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 13,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0.16,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.069,
+ "p50Ms": 0.069,
+ "p95Ms": 0.069,
+ "maxMs": 0.069,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.178,
+ "p50Ms": 0.178,
+ "p95Ms": 0.178,
+ "maxMs": 0.178,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.125,
+ "p50Ms": 0.125,
+ "p95Ms": 0.125,
+ "maxMs": 0.125,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.12,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.18,
+ "avgMs": 0.182,
+ "p50Ms": 0.182,
+ "p95Ms": 0.182,
+ "maxMs": 0.182,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 5
+ },
+ "annotation.viewFor": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.197,
+ "p50Ms": 0.197,
+ "p95Ms": 0.197,
+ "maxMs": 0.197,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1364992,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 39,
+ "label": "update-100pct",
+ "meta": {
+ "changed": 1000,
+ "total": 1000,
+ "repeat": 4
+ },
+ "wallMs": 465.93,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.49,
+ "avgMs": 4.493,
+ "p95Ms": 4.493,
+ "maxMs": 4.493
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.446,
+ "maxMs": 0.446
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.478,
+ "maxMs": 0.478
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 11,
+ "mainThreadMs": 0.81,
+ "backgroundMs": 0.31,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.132,
+ "p50Ms": 0.132,
+ "p95Ms": 0.132,
+ "maxMs": 0.132,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.478,
+ "p50Ms": 0.478,
+ "p95Ms": 0.478,
+ "maxMs": 0.478,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.254,
+ "p50Ms": 0.254,
+ "p95Ms": 0.254,
+ "maxMs": 0.254,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 5
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.028,
+ "p50Ms": 0.028,
+ "p95Ms": 0.028,
+ "maxMs": 0.028,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.201,
+ "p50Ms": 0.201,
+ "p95Ms": 0.201,
+ "maxMs": 0.201,
+ "mainThreadMs": 0.2,
+ "backgroundMs": 0,
+ "items": 5
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1362352,
+ "heapSizeAfterBytes": 33554432
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-continuous-1k",
+ "name": "Continuous updates: 100 of 1k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:11:09.207Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6381,
+ "load": {
+ "commitMs": 5.97,
+ "readyMs": 89,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 25,
+ "mainThreadMs": 20.99,
+ "backgroundMs": 0.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.13,
+ "avgMs": 0.043,
+ "p50Ms": 0.058,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.08,
+ "avgMs": 0.04,
+ "p50Ms": 0.003,
+ "p95Ms": 0.077,
+ "maxMs": 0.077,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 0.44,
+ "avgMs": 0.146,
+ "p50Ms": 0.142,
+ "p95Ms": 0.168,
+ "maxMs": 0.168,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 7
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.007,
+ "p50Ms": 0.007,
+ "p95Ms": 0.007,
+ "maxMs": 0.007,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 4
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 7
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.031,
+ "p50Ms": 0.031,
+ "p95Ms": 0.031,
+ "maxMs": 0.031,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 4
+ },
+ "annotation.viewFor": {
+ "count": 4,
+ "totalMs": 20.74,
+ "avgMs": 5.185,
+ "p50Ms": 0.016,
+ "p95Ms": 20.679,
+ "maxMs": 20.679,
+ "mainThreadMs": 20.74,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0033506670000000016,
+ "allocatedBytes": 522608,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 333,
+ "durationMs": 5565.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 333,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0
+ },
+ "js": {
+ "lagMs": {
+ "samples": 334,
+ "p50": 0.02,
+ "p95": 0.49,
+ "p99": 0.58,
+ "max": 0.74
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.15,
+ "max": 17.4
+ },
+ "lateFrames": 0,
+ "busyMs": 47,
+ "busyRatio": 0.0084,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5565.5,
+ "commits": {
+ "count": 50,
+ "totalMs": 129.41,
+ "avgMs": 2.588,
+ "p95Ms": 3.474,
+ "maxMs": 4.281
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 0.417,
+ "maxMs": 0.679
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.407,
+ "maxMs": 0.667
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 35.09,
+ "backgroundMs": 14.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 6.11,
+ "avgMs": 0.122,
+ "p50Ms": 0.123,
+ "p95Ms": 0.152,
+ "maxMs": 0.163,
+ "mainThreadMs": 6.11,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 20.37,
+ "avgMs": 0.407,
+ "p50Ms": 0.402,
+ "p95Ms": 0.601,
+ "maxMs": 0.667,
+ "mainThreadMs": 20.37,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 11.72,
+ "avgMs": 0.234,
+ "p50Ms": 0.216,
+ "p95Ms": 0.426,
+ "maxMs": 0.636,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.72,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.44,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.014,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.11,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 350
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.73,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.73,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 1.47,
+ "avgMs": 0.029,
+ "p50Ms": 0.027,
+ "p95Ms": 0.043,
+ "maxMs": 0.068,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.47,
+ "items": 350
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 8.62,
+ "avgMs": 0.172,
+ "p50Ms": 0.165,
+ "p95Ms": 0.254,
+ "maxMs": 0.289,
+ "mainThreadMs": 8.62,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 178.1,
+ "afterLoadMB": 210.7,
+ "afterInteractionMB": 208.4,
+ "afterCleanupMB": 189.9,
+ "peakMB": 210.7,
+ "loadDeltaMB": 32.6,
+ "interactionDeltaMB": -2.3,
+ "retainedAfterCleanupMB": 11.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 178.1,
+ "residentMB": 350,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 118461,
+ "mallocMB": 90.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 210.7,
+ "residentMB": 399.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 268771,
+ "mallocMB": 120.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 208.4,
+ "residentMB": 400.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 264082,
+ "mallocMB": 118.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 189.9,
+ "residentMB": 364.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 194678,
+ "mallocMB": 100.8
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 12745496,
+ "gcCount": 4,
+ "gcTimeMs": 0.0037027089999999985,
+ "heapSizeAfterMB": 32
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -4689,
+ "mallocBytesDelta": -1871184
+ }
+ },
+ "cpu": {
+ "processCpuMs": 697,
+ "wallMs": 5568,
+ "percent": 12.5,
+ "threadsBefore": 21,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 51000,
+ "coordinates": 51000,
+ "estimatedBytes": 3653136
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 71752
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5562.12,
+ "commits": {
+ "count": 50,
+ "totalMs": 129.41,
+ "avgMs": 2.588,
+ "p95Ms": 3.474,
+ "maxMs": 4.281
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 0.417,
+ "maxMs": 0.679
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 0.407,
+ "maxMs": 0.667
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 35.09,
+ "backgroundMs": 14.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 6.11,
+ "avgMs": 0.122,
+ "p50Ms": 0.123,
+ "p95Ms": 0.152,
+ "maxMs": 0.163,
+ "mainThreadMs": 6.11,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 20.37,
+ "avgMs": 0.407,
+ "p50Ms": 0.402,
+ "p95Ms": 0.601,
+ "maxMs": 0.667,
+ "mainThreadMs": 20.37,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 11.72,
+ "avgMs": 0.234,
+ "p50Ms": 0.216,
+ "p95Ms": 0.426,
+ "maxMs": 0.636,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.72,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.44,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.014,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 50000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.11,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.11,
+ "items": 350
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 0.73,
+ "avgMs": 0.015,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.73,
+ "items": 200
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 1.47,
+ "avgMs": 0.029,
+ "p50Ms": 0.027,
+ "p95Ms": 0.043,
+ "maxMs": 0.068,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.47,
+ "items": 350
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 8.62,
+ "avgMs": 0.172,
+ "p50Ms": 0.165,
+ "p95Ms": 0.254,
+ "maxMs": 0.289,
+ "mainThreadMs": 8.62,
+ "backgroundMs": 0,
+ "items": 50
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 4,
+ "gcTimeMs": 0.0037027089999999985,
+ "allocatedBytes": 12689488,
+ "heapSizeAfterBytes": 33554432
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "mutations-continuous-10k",
+ "name": "Continuous updates: 100 of 10k markers at 10 Hz",
+ "group": "mutations",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "100 markers move every 100 ms for 5 s through prop updates while the camera is still.",
+ "recordedAt": "2026-09-10T14:11:18.109Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6363,
+ "load": {
+ "commitMs": 11.99,
+ "readyMs": 98,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.5,
+ "backgroundMs": 4.66,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.36,
+ "avgMs": 0.452,
+ "p50Ms": 0.648,
+ "p95Ms": 0.709,
+ "maxMs": 0.709,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.66,
+ "avgMs": 0.332,
+ "p50Ms": 0.004,
+ "p95Ms": 0.661,
+ "maxMs": 0.661,
+ "mainThreadMs": 0.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 4.57,
+ "avgMs": 1.523,
+ "p50Ms": 1.332,
+ "p95Ms": 1.938,
+ "maxMs": 1.938,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.57,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.017,
+ "p95Ms": 0.017,
+ "maxMs": 0.017,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.049,
+ "p50Ms": 0.049,
+ "p95Ms": 0.049,
+ "maxMs": 0.049,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.111,
+ "p50Ms": 0.111,
+ "p95Ms": 0.111,
+ "maxMs": 0.111,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.35,
+ "avgMs": 0.088,
+ "p50Ms": 0.011,
+ "p95Ms": 0.016,
+ "maxMs": 4.65,
+ "mainThreadMs": 5.35,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013113329999999979,
+ "allocatedBytes": 4453864,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ "frames": {
+ "frames": 332,
+ "durationMs": 5546.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 60,
+ "p50": 60,
+ "p95": 60,
+ "p99": 60,
+ "worstWindow": 60,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.67,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 16.67,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 332,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 0,
+ "jankRatio": 0,
+ "droppedFrames": 0,
+ "longFrames": 0,
+ "overBudgetFrames": 0
+ },
+ "js": {
+ "lagMs": {
+ "samples": 333,
+ "p50": 0.02,
+ "p95": 0.58,
+ "p99": 3.06,
+ "max": 4.23
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.24,
+ "max": 20.9
+ },
+ "lateFrames": 0,
+ "busyMs": 74.1,
+ "busyRatio": 0.0134,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5547.4,
+ "commits": {
+ "count": 50,
+ "totalMs": 768.26,
+ "avgMs": 15.365,
+ "p95Ms": 19.529,
+ "maxMs": 20.193
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 1.717,
+ "maxMs": 2.972
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 2.366,
+ "maxMs": 5.483
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 162.65,
+ "backgroundMs": 89.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 43.83,
+ "avgMs": 0.877,
+ "p50Ms": 0.859,
+ "p95Ms": 1.337,
+ "maxMs": 1.465,
+ "mainThreadMs": 43.83,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 118.31,
+ "avgMs": 2.366,
+ "p50Ms": 1.999,
+ "p95Ms": 4.986,
+ "maxMs": 5.483,
+ "mainThreadMs": 118.31,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 82.88,
+ "avgMs": 1.658,
+ "p50Ms": 1.602,
+ "p95Ms": 2.404,
+ "maxMs": 2.605,
+ "mainThreadMs": 0,
+ "backgroundMs": 82.88,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.94,
+ "avgMs": 0.019,
+ "p50Ms": 0.018,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.78,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 1.23,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.033,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 2950
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 3.29,
+ "avgMs": 0.066,
+ "p50Ms": 0.063,
+ "p95Ms": 0.091,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.29,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.51,
+ "avgMs": 0.01,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.474,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.7,
+ "afterLoadMB": 224.6,
+ "afterInteractionMB": 245.3,
+ "afterCleanupMB": 216.8,
+ "peakMB": 245.3,
+ "loadDeltaMB": 33.9,
+ "interactionDeltaMB": 20.7,
+ "retainedAfterCleanupMB": 26.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.7,
+ "residentMB": 365.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 195383,
+ "mallocMB": 101
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 224.6,
+ "residentMB": 405.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 276806,
+ "mallocMB": 131.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 245.3,
+ "residentMB": 412.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 273268,
+ "mallocMB": 148.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 216.8,
+ "residentMB": 363.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 194211,
+ "mallocMB": 121
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 91920768,
+ "gcCount": 23,
+ "gcTimeMs": 0.02864908400000002,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": -3538,
+ "mallocBytesDelta": 18592288
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1207,
+ "wallMs": 5551,
+ "percent": 21.7,
+ "threadsBefore": 21,
+ "threadsAfter": 9,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 51,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 510000,
+ "coordinates": 510000,
+ "estimatedBytes": 36525893
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 717815
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "continuous",
+ "meta": {},
+ "wallMs": 5543.01,
+ "commits": {
+ "count": 50,
+ "totalMs": 768.26,
+ "avgMs": 15.365,
+ "p95Ms": 19.529,
+ "maxMs": 20.193
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 50,
+ "avgMs": 1.717,
+ "maxMs": 2.972
+ },
+ "setterMs": {
+ "samples": 50,
+ "avgMs": 2.366,
+ "maxMs": 5.483
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 400,
+ "mainThreadMs": 162.65,
+ "backgroundMs": 89.13,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 50,
+ "totalMs": 43.83,
+ "avgMs": 0.877,
+ "p50Ms": 0.859,
+ "p95Ms": 1.337,
+ "maxMs": 1.465,
+ "mainThreadMs": 43.83,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.set": {
+ "count": 50,
+ "totalMs": 118.31,
+ "avgMs": 2.366,
+ "p50Ms": 1.999,
+ "p95Ms": 4.986,
+ "maxMs": 5.483,
+ "mainThreadMs": 118.31,
+ "backgroundMs": 0,
+ "items": 500000
+ },
+ "markers.indexBuild": {
+ "count": 50,
+ "totalMs": 82.88,
+ "avgMs": 1.658,
+ "p50Ms": 1.602,
+ "p95Ms": 2.404,
+ "maxMs": 2.605,
+ "mainThreadMs": 0,
+ "backgroundMs": 82.88,
+ "items": 500000
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 0.94,
+ "avgMs": 0.019,
+ "p50Ms": 0.018,
+ "p95Ms": 0.029,
+ "maxMs": 0.03,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.94,
+ "items": 500000
+ },
+ "markers.viewportFilter": {
+ "count": 50,
+ "totalMs": 0.78,
+ "avgMs": 0.016,
+ "p50Ms": 0.014,
+ "p95Ms": 0.023,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 4050
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 1.23,
+ "avgMs": 0.025,
+ "p50Ms": 0.025,
+ "p95Ms": 0.033,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.23,
+ "items": 2950
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 3.29,
+ "avgMs": 0.066,
+ "p50Ms": 0.063,
+ "p95Ms": 0.091,
+ "maxMs": 0.103,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.29,
+ "items": 4050
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 0.51,
+ "avgMs": 0.01,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.474,
+ "mainThreadMs": 0.51,
+ "backgroundMs": 0,
+ "items": 2
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 23,
+ "gcTimeMs": 0.02864908400000002,
+ "allocatedBytes": 91864784,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-100",
+ "name": "Polyline, 100 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:26.046Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5876,
+ "load": {
+ "commitMs": 1.34,
+ "readyMs": 137,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 1.84,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 1.82,
+ "avgMs": 0.912,
+ "p50Ms": 0.001,
+ "p95Ms": 1.822,
+ "maxMs": 1.822,
+ "mainThreadMs": 1.82,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 92920,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 301,
+ "durationMs": 5057.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.6,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.78,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 46.93,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 299,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0033,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 304,
+ "p50": 0,
+ "p95": 0.5,
+ "p99": 0.55,
+ "max": 0.58
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.16,
+ "max": 17.25
+ },
+ "lateFrames": 0,
+ "busyMs": 39.1,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5058.1,
+ "commits": {
+ "count": 8,
+ "totalMs": 2.88,
+ "avgMs": 0.36,
+ "p95Ms": 0.578,
+ "maxMs": 0.578
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.117,
+ "maxMs": 0.201
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 1.79,
+ "maxMs": 2.658
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 16.13,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 14.32,
+ "avgMs": 1.79,
+ "p50Ms": 1.57,
+ "p95Ms": 2.658,
+ "maxMs": 2.658,
+ "mainThreadMs": 14.32,
+ "backgroundMs": 0,
+ "items": 800
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.81,
+ "avgMs": 0.452,
+ "p50Ms": 0.476,
+ "p95Ms": 0.602,
+ "maxMs": 0.602,
+ "mainThreadMs": 1.81,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 217.5,
+ "afterLoadMB": 237.4,
+ "afterInteractionMB": 318.5,
+ "afterCleanupMB": 199.1,
+ "peakMB": 318.5,
+ "loadDeltaMB": 19.9,
+ "interactionDeltaMB": 81.1,
+ "retainedAfterCleanupMB": -18.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 217.5,
+ "residentMB": 364.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 194794,
+ "mallocMB": 121.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 237.4,
+ "residentMB": 366.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 266660,
+ "mallocMB": 142.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 318.5,
+ "residentMB": 388.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 361739,
+ "mallocMB": 161
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 199.1,
+ "residentMB": 354.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 121390,
+ "mallocMB": 109.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 706632,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 95079,
+ "mallocBytesDelta": 19833296
+ }
+ },
+ "cpu": {
+ "processCpuMs": 999,
+ "wallMs": 5061,
+ "percent": 19.7,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900,
+ "estimatedBytes": 40852
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4543
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 302.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.27,
+ "avgMs": 0.269,
+ "p95Ms": 0.269,
+ "maxMs": 0.269
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.091,
+ "maxMs": 0.091
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.658,
+ "maxMs": 2.658
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.66,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.66,
+ "avgMs": 2.658,
+ "p50Ms": 2.658,
+ "p95Ms": 2.658,
+ "maxMs": 2.658,
+ "mainThreadMs": 2.66,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 61480,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 316.72,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.253,
+ "p95Ms": 0.253,
+ "maxMs": 0.253
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.086,
+ "maxMs": 0.086
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.296,
+ "maxMs": 1.296
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.3,
+ "avgMs": 1.296,
+ "p50Ms": 1.296,
+ "p95Ms": 1.296,
+ "maxMs": 1.296,
+ "mainThreadMs": 1.3,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 59976,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 316.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.441,
+ "p95Ms": 0.441,
+ "maxMs": 0.441
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.167,
+ "maxMs": 0.167
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.917,
+ "maxMs": 1.917
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.92,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.92,
+ "avgMs": 1.917,
+ "p50Ms": 1.917,
+ "p95Ms": 1.917,
+ "maxMs": 1.917,
+ "mainThreadMs": 1.92,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58776,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 315.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.233,
+ "p95Ms": 0.233,
+ "maxMs": 0.233
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.071,
+ "maxMs": 0.071
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.057,
+ "maxMs": 1.057
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.06,
+ "avgMs": 1.057,
+ "p50Ms": 1.057,
+ "p95Ms": 1.057,
+ "maxMs": 1.057,
+ "mainThreadMs": 1.06,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60640,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 316.54,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.23,
+ "avgMs": 0.229,
+ "p95Ms": 0.229,
+ "maxMs": 0.229
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.056,
+ "maxMs": 0.056
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.995,
+ "maxMs": 0.995
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 0.99,
+ "avgMs": 0.995,
+ "p50Ms": 0.995,
+ "p95Ms": 0.995,
+ "maxMs": 0.995,
+ "mainThreadMs": 0.99,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58688,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 316.3,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.32,
+ "avgMs": 0.324,
+ "p95Ms": 0.324,
+ "maxMs": 0.324
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.086,
+ "maxMs": 0.086
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.57,
+ "maxMs": 1.57
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.57,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.57,
+ "avgMs": 1.57,
+ "p50Ms": 1.57,
+ "p95Ms": 1.57,
+ "maxMs": 1.57,
+ "mainThreadMs": 1.57,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60000,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 316.53,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.578,
+ "p95Ms": 0.578,
+ "maxMs": 0.578
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.201,
+ "maxMs": 0.201
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.461,
+ "maxMs": 2.461
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.46,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.46,
+ "avgMs": 2.461,
+ "p50Ms": 2.461,
+ "p95Ms": 2.461,
+ "maxMs": 2.461,
+ "mainThreadMs": 2.46,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 64088,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 315.77,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.55,
+ "avgMs": 0.552,
+ "p95Ms": 0.552,
+ "maxMs": 0.552
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.181,
+ "maxMs": 0.181
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.365,
+ "maxMs": 2.365
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.365,
+ "p50Ms": 2.365,
+ "p95Ms": 2.365,
+ "maxMs": 2.365,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 59960,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-1k",
+ "name": "Polyline, 1k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:33.925Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5874,
+ "load": {
+ "commitMs": 1.08,
+ "readyMs": 87,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.25,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.23,
+ "avgMs": 0.116,
+ "p50Ms": 0.001,
+ "p95Ms": 0.231,
+ "maxMs": 0.231,
+ "mainThreadMs": 0.23,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 372296,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 299,
+ "durationMs": 5054.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 59,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.89,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 35.6,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 295,
+ 0,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0134,
+ "droppedFrames": 4,
+ "longFrames": 0,
+ "overBudgetFrames": 4
+ },
+ "js": {
+ "lagMs": {
+ "samples": 304,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.68,
+ "max": 0.87
+ },
+ "frameGapMs": {
+ "p50": 16.65,
+ "p95": 17.18,
+ "max": 17.53
+ },
+ "lateFrames": 0,
+ "busyMs": 44.7,
+ "busyRatio": 0.0088,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5054.6,
+ "commits": {
+ "count": 8,
+ "totalMs": 4.79,
+ "avgMs": 0.598,
+ "p95Ms": 0.8,
+ "maxMs": 0.8
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.178,
+ "maxMs": 0.25
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 2.521,
+ "maxMs": 3.454
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 21.68,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 20.17,
+ "avgMs": 2.521,
+ "p50Ms": 2.551,
+ "p95Ms": 3.454,
+ "maxMs": 3.454,
+ "mainThreadMs": 20.17,
+ "backgroundMs": 0,
+ "items": 8000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.52,
+ "avgMs": 0.379,
+ "p50Ms": 0.358,
+ "p95Ms": 0.488,
+ "maxMs": 0.488,
+ "mainThreadMs": 1.52,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193.2,
+ "afterLoadMB": 220.5,
+ "afterInteractionMB": 312,
+ "afterCleanupMB": 193.4,
+ "peakMB": 312,
+ "loadDeltaMB": 27.3,
+ "interactionDeltaMB": 91.5,
+ "retainedAfterCleanupMB": 0.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193.2,
+ "residentMB": 357.7,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 119339,
+ "mallocMB": 102.6
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 220.5,
+ "residentMB": 379.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 264043,
+ "mallocMB": 135.3
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 312,
+ "residentMB": 391.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 357386,
+ "mallocMB": 154.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 193.4,
+ "residentMB": 358.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 125470,
+ "mallocMB": 103.4
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 2411456,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 93343,
+ "mallocBytesDelta": 19816304
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1068,
+ "wallMs": 5057,
+ "percent": 21.1,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 9000,
+ "estimatedBytes": 403674
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44865
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 302.33,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.627,
+ "p95Ms": 0.627,
+ "maxMs": 0.627
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.179,
+ "maxMs": 0.179
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.454,
+ "maxMs": 3.454
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.45,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.45,
+ "avgMs": 3.454,
+ "p50Ms": 3.454,
+ "p95Ms": 3.454,
+ "maxMs": 3.454,
+ "mainThreadMs": 3.45,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257104,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 316.17,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.666,
+ "p95Ms": 0.666,
+ "maxMs": 0.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.218,
+ "maxMs": 0.218
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.115,
+ "maxMs": 3.115
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.12,
+ "avgMs": 3.115,
+ "p50Ms": 3.115,
+ "p95Ms": 3.115,
+ "maxMs": 3.115,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 256840,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 315.72,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.666,
+ "p95Ms": 0.666,
+ "maxMs": 0.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.209,
+ "maxMs": 0.209
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.085,
+ "maxMs": 3.085
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.08,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.08,
+ "avgMs": 3.085,
+ "p50Ms": 3.085,
+ "p95Ms": 3.085,
+ "maxMs": 3.085,
+ "mainThreadMs": 3.08,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255832,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 315.91,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.56,
+ "avgMs": 0.558,
+ "p95Ms": 0.558,
+ "maxMs": 0.558
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.205,
+ "maxMs": 0.205
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.032,
+ "maxMs": 3.032
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.03,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.03,
+ "avgMs": 3.032,
+ "p50Ms": 3.032,
+ "p95Ms": 3.032,
+ "maxMs": 3.032,
+ "mainThreadMs": 3.03,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257768,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 316.63,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.357,
+ "p95Ms": 0.357,
+ "maxMs": 0.357
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.094,
+ "maxMs": 0.094
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.677,
+ "maxMs": 1.677
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.68,
+ "avgMs": 1.677,
+ "p50Ms": 1.677,
+ "p95Ms": 1.677,
+ "maxMs": 1.677,
+ "mainThreadMs": 1.68,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255928,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 315.56,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.8,
+ "avgMs": 0.8,
+ "p95Ms": 0.8,
+ "maxMs": 0.8
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.25,
+ "maxMs": 0.25
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.551,
+ "maxMs": 2.551
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.55,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.55,
+ "avgMs": 2.551,
+ "p50Ms": 2.551,
+ "p95Ms": 2.551,
+ "maxMs": 2.551,
+ "mainThreadMs": 2.55,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 271640,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 316.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.48,
+ "avgMs": 0.483,
+ "p95Ms": 0.483,
+ "maxMs": 0.483
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.119,
+ "maxMs": 0.119
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.757,
+ "maxMs": 1.757
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.76,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.76,
+ "avgMs": 1.757,
+ "p50Ms": 1.757,
+ "p95Ms": 1.757,
+ "maxMs": 1.757,
+ "mainThreadMs": 1.76,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 275816,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 315.88,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.63,
+ "avgMs": 0.628,
+ "p95Ms": 0.628,
+ "maxMs": 0.628
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.149,
+ "maxMs": 0.149
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.497,
+ "maxMs": 1.497
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.5,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.5,
+ "avgMs": 1.497,
+ "p50Ms": 1.497,
+ "p95Ms": 1.497,
+ "maxMs": 1.497,
+ "mainThreadMs": 1.5,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 271752,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-10k",
+ "name": "Polyline, 10k points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:41.808Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5893,
+ "load": {
+ "commitMs": 1.09,
+ "readyMs": 55,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.48,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.47,
+ "avgMs": 0.233,
+ "p50Ms": 0.002,
+ "p95Ms": 0.464,
+ "maxMs": 0.464,
+ "mainThreadMs": 0.47,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001278208000000003,
+ "allocatedBytes": 2862840,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 301,
+ "durationMs": 5078.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.4,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.83,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 46.65,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 298,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0066,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 305,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.62,
+ "max": 0.79
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.17,
+ "max": 17.46
+ },
+ "lateFrames": 0,
+ "busyMs": 33.2,
+ "busyRatio": 0.0065,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5079.4,
+ "commits": {
+ "count": 8,
+ "totalMs": 9.96,
+ "avgMs": 1.245,
+ "p95Ms": 1.782,
+ "maxMs": 1.782
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.187,
+ "maxMs": 0.263
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 1.96,
+ "maxMs": 2.733
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 17.16,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 15.68,
+ "avgMs": 1.96,
+ "p50Ms": 1.729,
+ "p95Ms": 2.733,
+ "maxMs": 2.733,
+ "mainThreadMs": 15.68,
+ "backgroundMs": 0,
+ "items": 80000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.48,
+ "avgMs": 0.371,
+ "p50Ms": 0.346,
+ "p95Ms": 0.458,
+ "maxMs": 0.458,
+ "mainThreadMs": 1.48,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.3,
+ "afterLoadMB": 232.5,
+ "afterInteractionMB": 317.9,
+ "afterCleanupMB": 195.7,
+ "peakMB": 317.9,
+ "loadDeltaMB": 38.2,
+ "interactionDeltaMB": 85.4,
+ "retainedAfterCleanupMB": 1.4,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.3,
+ "residentMB": 360.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 126053,
+ "mallocMB": 103.6
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 232.5,
+ "residentMB": 350.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 268613,
+ "mallocMB": 137.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 317.9,
+ "residentMB": 378.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 360342,
+ "mallocMB": 156.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 195.7,
+ "residentMB": 338,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 128738,
+ "mallocMB": 105.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 16008216,
+ "gcCount": 6,
+ "gcTimeMs": 0.0023806249999999696,
+ "heapSizeAfterMB": 28
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 91729,
+ "mallocBytesDelta": 20602544
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1108,
+ "wallMs": 5082,
+ "percent": 21.8,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 90000,
+ "estimatedBytes": 4030707
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 316.84,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.79,
+ "avgMs": 0.794,
+ "p95Ms": 0.794,
+ "maxMs": 0.794
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.141,
+ "maxMs": 0.141
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.4,
+ "maxMs": 1.4
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.4,
+ "p50Ms": 1.4,
+ "p95Ms": 1.4,
+ "maxMs": 1.4,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.000697540999999996,
+ "allocatedBytes": 1782104,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 316.22,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.92,
+ "avgMs": 0.923,
+ "p95Ms": 0.923,
+ "maxMs": 0.923
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.145,
+ "maxMs": 0.145
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.404,
+ "maxMs": 1.404
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.404,
+ "p50Ms": 1.404,
+ "p95Ms": 1.404,
+ "maxMs": 1.404,
+ "mainThreadMs": 1.4,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0001745840000000054,
+ "allocatedBytes": 1781704,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 315.76,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.782,
+ "p95Ms": 1.782,
+ "maxMs": 1.782
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.262,
+ "maxMs": 0.262
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.733,
+ "maxMs": 2.733
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.73,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.73,
+ "avgMs": 2.733,
+ "p50Ms": 2.733,
+ "p95Ms": 2.733,
+ "maxMs": 2.733,
+ "mainThreadMs": 2.73,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1780768,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 317.09,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.77,
+ "avgMs": 0.767,
+ "p95Ms": 0.767,
+ "maxMs": 0.767
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.111,
+ "maxMs": 0.111
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.206,
+ "maxMs": 1.206
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.21,
+ "avgMs": 1.206,
+ "p50Ms": 1.206,
+ "p95Ms": 1.206,
+ "maxMs": 1.206,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00017166699999998647,
+ "allocatedBytes": 1782632,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 315.74,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.76,
+ "avgMs": 1.762,
+ "p95Ms": 1.762,
+ "maxMs": 1.762
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.239,
+ "maxMs": 0.239
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.56,
+ "maxMs": 2.56
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.56,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.56,
+ "avgMs": 2.56,
+ "p50Ms": 2.56,
+ "p95Ms": 2.56,
+ "maxMs": 2.56,
+ "mainThreadMs": 2.56,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.000309541999999996,
+ "allocatedBytes": 1780792,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 316.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.4,
+ "avgMs": 1.404,
+ "p95Ms": 1.404,
+ "maxMs": 1.404
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.198,
+ "maxMs": 0.198
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.283,
+ "maxMs": 2.283
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.28,
+ "avgMs": 2.283,
+ "p50Ms": 2.283,
+ "p95Ms": 2.283,
+ "maxMs": 2.283,
+ "mainThreadMs": 2.28,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1940528,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 316.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.53,
+ "avgMs": 1.531,
+ "p95Ms": 1.531,
+ "maxMs": 1.531
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.263,
+ "maxMs": 0.263
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.365,
+ "maxMs": 2.365
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.36,
+ "avgMs": 2.365,
+ "p50Ms": 2.365,
+ "p95Ms": 2.365,
+ "maxMs": 2.365,
+ "mainThreadMs": 2.36,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007199159999999871,
+ "allocatedBytes": 1944584,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 316.24,
+ "commits": {
+ "count": 1,
+ "totalMs": 1,
+ "avgMs": 1,
+ "p95Ms": 1,
+ "maxMs": 1
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.138,
+ "maxMs": 0.138
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.729,
+ "maxMs": 1.729
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.73,
+ "avgMs": 1.729,
+ "p50Ms": 1.729,
+ "p95Ms": 1.729,
+ "maxMs": 1.729,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0003073749999999986,
+ "allocatedBytes": 1940512,
+ "heapSizeAfterBytes": 29360128
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polyline-100k",
+ "name": "Polyline, 100k points",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "heavy"
+ ],
+ "description": "One 100000-point polyline: mount, five style-only updates, three geometry updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:50.309Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6405,
+ "load": {
+ "commitMs": 6.59,
+ "readyMs": 60,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 2.11,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 2.09,
+ "avgMs": 1.046,
+ "p50Ms": 0.001,
+ "p95Ms": 2.09,
+ "maxMs": 2.09,
+ "mainThreadMs": 2.09,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 9,
+ "gcTimeMs": 0.006792126000000009,
+ "allocatedBytes": 27625312,
+ "heapSizeAfterBytes": 29360128
+ }
+ },
+ "frames": {
+ "frames": 322,
+ "durationMs": 5585.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.5,
+ "p50": 60,
+ "p95": 48,
+ "p99": 48,
+ "worstWindow": 48,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 17.39,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 50.44,
+ "worst": 69.65,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 313,
+ 2,
+ 1,
+ 2,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 7,
+ "jankRatio": 0.0217,
+ "droppedFrames": 14,
+ "longFrames": 4,
+ "overBudgetFrames": 9
+ },
+ "js": {
+ "lagMs": {
+ "samples": 307,
+ "p50": 0,
+ "p95": 0.65,
+ "p99": 53.62,
+ "max": 100.88
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.32,
+ "max": 117.54
+ },
+ "lateFrames": 10,
+ "busyMs": 517.1,
+ "busyRatio": 0.0926,
+ "longTasks": {
+ "count": 8,
+ "totalMs": 479.2,
+ "maxMs": 68.1,
+ "source": "performance-observer"
+ },
+ "durationMs": 5586.1,
+ "commits": {
+ "count": 8,
+ "totalMs": 54.16,
+ "avgMs": 6.77,
+ "p95Ms": 7.363,
+ "maxMs": 7.363
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 8,
+ "avgMs": 0.493,
+ "maxMs": 0.65
+ },
+ "setterMs": {
+ "samples": 8,
+ "avgMs": 3.273,
+ "maxMs": 3.614
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 27.88,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 8,
+ "totalMs": 26.19,
+ "avgMs": 3.273,
+ "p50Ms": 3.242,
+ "p95Ms": 3.614,
+ "maxMs": 3.614,
+ "mainThreadMs": 26.19,
+ "backgroundMs": 0,
+ "items": 800000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.7,
+ "avgMs": 0.424,
+ "p50Ms": 0.349,
+ "p95Ms": 0.656,
+ "maxMs": 0.656,
+ "mainThreadMs": 1.7,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 196.5,
+ "afterLoadMB": 213.5,
+ "afterInteractionMB": 320.7,
+ "afterCleanupMB": 189.5,
+ "peakMB": 320.7,
+ "loadDeltaMB": 17,
+ "interactionDeltaMB": 107.2,
+ "retainedAfterCleanupMB": -7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 196.5,
+ "residentMB": 338.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 129316,
+ "mallocMB": 105.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 213.5,
+ "residentMB": 405.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 269839,
+ "mallocMB": 123.9
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 320.7,
+ "residentMB": 389,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 356648,
+ "mallocMB": 151.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 189.5,
+ "residentMB": 356.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 124245,
+ "mallocMB": 93.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 154969128,
+ "gcCount": 44,
+ "gcTimeMs": 0.010022956999999971,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 86809,
+ "mallocBytesDelta": 28881664
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1533,
+ "wallMs": 5589,
+ "percent": 27.4,
+ "threadsBefore": 21,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 9,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 9,
+ "coordinates": 900000,
+ "estimatedBytes": 40300927
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 1,
+ "coordinates": 100000,
+ "estimatedBytes": 4477935
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 350.37,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.33,
+ "avgMs": 6.327,
+ "p95Ms": 6.327,
+ "maxMs": 6.327
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.425,
+ "maxMs": 0.425
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.91,
+ "maxMs": 2.91
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.91,
+ "avgMs": 2.91,
+ "p50Ms": 2.91,
+ "p95Ms": 2.91,
+ "maxMs": 2.91,
+ "mainThreadMs": 2.91,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.0008272510000000011,
+ "allocatedBytes": 17485728,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 382.61,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.8,
+ "avgMs": 6.805,
+ "p95Ms": 6.805,
+ "maxMs": 6.805
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.386,
+ "maxMs": 0.386
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.139,
+ "maxMs": 3.139
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.14,
+ "avgMs": 3.139,
+ "p50Ms": 3.139,
+ "p95Ms": 3.139,
+ "maxMs": 3.139,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0005251669999999931,
+ "allocatedBytes": 17481016,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 366.02,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.13,
+ "avgMs": 7.129,
+ "p95Ms": 7.129,
+ "maxMs": 7.129
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.456,
+ "maxMs": 0.456
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.142,
+ "maxMs": 3.142
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.14,
+ "avgMs": 3.142,
+ "p50Ms": 3.142,
+ "p95Ms": 3.142,
+ "maxMs": 3.142,
+ "mainThreadMs": 3.14,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0006080409999999759,
+ "allocatedBytes": 17479088,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 3
+ },
+ "wallMs": 383.54,
+ "commits": {
+ "count": 1,
+ "totalMs": 7,
+ "avgMs": 7.001,
+ "p95Ms": 7.001,
+ "maxMs": 7.001
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.458,
+ "maxMs": 0.458
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.333,
+ "maxMs": 3.333
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.33,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.33,
+ "avgMs": 3.333,
+ "p50Ms": 3.333,
+ "p95Ms": 3.333,
+ "maxMs": 3.333,
+ "mainThreadMs": 3.33,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0007463329999999879,
+ "allocatedBytes": 17480992,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100000,
+ "tick": 4
+ },
+ "wallMs": 382.06,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.88,
+ "avgMs": 6.881,
+ "p95Ms": 6.881,
+ "maxMs": 6.881
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.65,
+ "maxMs": 0.65
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.242,
+ "maxMs": 3.242
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.24,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.24,
+ "avgMs": 3.242,
+ "p50Ms": 3.242,
+ "p95Ms": 3.242,
+ "maxMs": 3.242,
+ "mainThreadMs": 3.24,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0007079569999999813,
+ "allocatedBytes": 17479032,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 5,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 0
+ },
+ "wallMs": 366.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.16,
+ "avgMs": 6.159,
+ "p95Ms": 6.159,
+ "maxMs": 6.159
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.42,
+ "maxMs": 0.42
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.335,
+ "maxMs": 3.335
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.34,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.34,
+ "avgMs": 3.335,
+ "p50Ms": 3.335,
+ "p95Ms": 3.335,
+ "maxMs": 3.335,
+ "mainThreadMs": 3.34,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.0011432500000000123,
+ "allocatedBytes": 19084848,
+ "heapSizeAfterBytes": 33554432
+ }
+ },
+ {
+ "index": 6,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 1
+ },
+ "wallMs": 366.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 6.49,
+ "avgMs": 6.491,
+ "p95Ms": 6.491,
+ "maxMs": 6.491
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.548,
+ "maxMs": 0.548
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.614,
+ "maxMs": 3.614
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.61,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.61,
+ "avgMs": 3.614,
+ "p50Ms": 3.614,
+ "p95Ms": 3.614,
+ "maxMs": 3.614,
+ "mainThreadMs": 3.61,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.00107770900000001,
+ "allocatedBytes": 19083720,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 7,
+ "label": "perturb",
+ "meta": {
+ "points": 100000,
+ "tick": 2
+ },
+ "wallMs": 382.87,
+ "commits": {
+ "count": 1,
+ "totalMs": 7.36,
+ "avgMs": 7.363,
+ "p95Ms": 7.363,
+ "maxMs": 7.363
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.596,
+ "maxMs": 0.596
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.47,
+ "maxMs": 3.47
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.47,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 3.47,
+ "avgMs": 3.47,
+ "p50Ms": 3.47,
+ "p95Ms": 3.47,
+ "maxMs": 3.47,
+ "mainThreadMs": 3.47,
+ "backgroundMs": 0,
+ "items": 100000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 5,
+ "gcTimeMs": 0.0011127489999999962,
+ "allocatedBytes": 19078632,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygon-100",
+ "name": "Polygon, 100 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 100-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:11:57.240Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4920,
+ "load": {
+ "commitMs": 1.06,
+ "readyMs": 88,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.57,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.276,
+ "p50Ms": 0,
+ "p95Ms": 0.552,
+ "maxMs": 0.552,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 100
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 99528,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 243,
+ "durationMs": 4107,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.3,
+ "p50": 59,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.87,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 17.62,
+ "worst": 49.04,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 240,
+ 1,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0082,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 247,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.57,
+ "max": 0.79
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.46
+ },
+ "lateFrames": 0,
+ "busyMs": 33.5,
+ "busyRatio": 0.0081,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4107.5,
+ "commits": {
+ "count": 5,
+ "totalMs": 2.17,
+ "avgMs": 0.434,
+ "p95Ms": 0.62,
+ "maxMs": 0.62
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 0.145,
+ "maxMs": 0.225
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 2.641,
+ "maxMs": 3.187
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 15.36,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 13.2,
+ "avgMs": 2.641,
+ "p50Ms": 2.773,
+ "p95Ms": 3.187,
+ "maxMs": 3.187,
+ "mainThreadMs": 13.2,
+ "backgroundMs": 0,
+ "items": 500
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 2.15,
+ "avgMs": 0.538,
+ "p50Ms": 0.446,
+ "p95Ms": 0.992,
+ "maxMs": 0.992,
+ "mainThreadMs": 2.15,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.3,
+ "afterLoadMB": 235,
+ "afterInteractionMB": 306.9,
+ "afterCleanupMB": 190,
+ "peakMB": 306.9,
+ "loadDeltaMB": 44.7,
+ "interactionDeltaMB": 71.9,
+ "retainedAfterCleanupMB": -0.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.3,
+ "residentMB": 344.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 124834,
+ "mallocMB": 93.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 235,
+ "residentMB": 318,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 270121,
+ "mallocMB": 122.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 306.9,
+ "residentMB": 408.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 363359,
+ "mallocMB": 144.6
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 190,
+ "residentMB": 364.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 130714,
+ "mallocMB": 93.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 470480,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 93238,
+ "mallocBytesDelta": 23130784
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1029,
+ "wallMs": 4110,
+ "percent": 25,
+ "threadsBefore": 21,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 600,
+ "estimatedBytes": 27462
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 100,
+ "estimatedBytes": 4577
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 0
+ },
+ "wallMs": 301.85,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.31,
+ "avgMs": 0.314,
+ "p95Ms": 0.314,
+ "maxMs": 0.314
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.12,
+ "maxMs": 0.12
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.761,
+ "maxMs": 2.761
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.76,
+ "avgMs": 2.761,
+ "p50Ms": 2.761,
+ "p95Ms": 2.761,
+ "maxMs": 2.761,
+ "mainThreadMs": 2.76,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 61528,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 1
+ },
+ "wallMs": 316.51,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.26,
+ "avgMs": 0.258,
+ "p95Ms": 0.258,
+ "maxMs": 0.258
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.084,
+ "maxMs": 0.084
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.709,
+ "maxMs": 1.709
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 1.71,
+ "avgMs": 1.709,
+ "p50Ms": 1.709,
+ "p95Ms": 1.709,
+ "maxMs": 1.709,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60368,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 2
+ },
+ "wallMs": 316.21,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.582,
+ "p95Ms": 0.582,
+ "maxMs": 0.582
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.167,
+ "maxMs": 0.167
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.774,
+ "maxMs": 2.774
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.77,
+ "avgMs": 2.774,
+ "p50Ms": 2.774,
+ "p95Ms": 2.774,
+ "maxMs": 2.774,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58872,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 3
+ },
+ "wallMs": 316.23,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.62,
+ "avgMs": 0.62,
+ "p95Ms": 0.62,
+ "maxMs": 0.62
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.225,
+ "maxMs": 0.225
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.187,
+ "maxMs": 3.187
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.19,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.19,
+ "avgMs": 3.187,
+ "p50Ms": 3.187,
+ "p95Ms": 3.187,
+ "maxMs": 3.187,
+ "mainThreadMs": 3.19,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 60808,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 100,
+ "tick": 4
+ },
+ "wallMs": 315.72,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.39,
+ "avgMs": 0.395,
+ "p95Ms": 0.395,
+ "maxMs": 0.395
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.131,
+ "maxMs": 0.131
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.773,
+ "maxMs": 2.773
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.77,
+ "avgMs": 2.773,
+ "p50Ms": 2.773,
+ "p95Ms": 2.773,
+ "maxMs": 2.773,
+ "mainThreadMs": 2.77,
+ "backgroundMs": 0,
+ "items": 100
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 58712,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.002 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygon-1k",
+ "name": "Polygon, 1k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "One 1000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:12:04.158Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4928,
+ "load": {
+ "commitMs": 0.98,
+ "readyMs": 65,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 0.42,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.4,
+ "avgMs": 0.202,
+ "p50Ms": 0,
+ "p95Ms": 0.404,
+ "maxMs": 0.404,
+ "mainThreadMs": 0.4,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 376712,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 244,
+ "durationMs": 4113.5,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 59,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.8,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 35.29,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 242,
+ 0,
+ 0,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 2,
+ "jankRatio": 0.0082,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 247,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.68,
+ "max": 0.97
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.18,
+ "max": 17.63
+ },
+ "lateFrames": 0,
+ "busyMs": 37.3,
+ "busyRatio": 0.0091,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4114,
+ "commits": {
+ "count": 5,
+ "totalMs": 3.27,
+ "avgMs": 0.654,
+ "p95Ms": 0.778,
+ "maxMs": 0.778
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 0.15,
+ "maxMs": 0.17
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 2.785,
+ "maxMs": 3.073
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 15.72,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 13.93,
+ "avgMs": 2.785,
+ "p50Ms": 2.782,
+ "p95Ms": 3.073,
+ "maxMs": 3.073,
+ "mainThreadMs": 13.93,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.79,
+ "avgMs": 0.448,
+ "p50Ms": 0.469,
+ "p95Ms": 0.541,
+ "maxMs": 0.541,
+ "mainThreadMs": 1.79,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 190.8,
+ "afterLoadMB": 212.9,
+ "afterInteractionMB": 303.5,
+ "afterCleanupMB": 190.8,
+ "peakMB": 303.5,
+ "loadDeltaMB": 22.1,
+ "interactionDeltaMB": 90.6,
+ "retainedAfterCleanupMB": 0,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 190.8,
+ "residentMB": 366,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 131308,
+ "mallocMB": 94
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 212.9,
+ "residentMB": 390.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 275876,
+ "mallocMB": 123.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 303.5,
+ "residentMB": 406.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 367313,
+ "mallocMB": 145.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 190.8,
+ "residentMB": 364.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 134935,
+ "mallocMB": 94.5
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1540072,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 91437,
+ "mallocBytesDelta": 22779136
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1015,
+ "wallMs": 4116,
+ "percent": 24.7,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 6000,
+ "estimatedBytes": 269292
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 1000,
+ "estimatedBytes": 44882
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 0
+ },
+ "wallMs": 307.45,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.52,
+ "avgMs": 0.523,
+ "p95Ms": 0.523,
+ "maxMs": 0.523
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.144,
+ "maxMs": 0.144
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.479,
+ "maxMs": 2.479
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.48,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.48,
+ "avgMs": 2.479,
+ "p50Ms": 2.479,
+ "p95Ms": 2.479,
+ "maxMs": 2.479,
+ "mainThreadMs": 2.48,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257032,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 1
+ },
+ "wallMs": 315.71,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.78,
+ "avgMs": 0.778,
+ "p95Ms": 0.778,
+ "maxMs": 0.778
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.146,
+ "maxMs": 0.146
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.695,
+ "maxMs": 2.695
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.69,
+ "avgMs": 2.695,
+ "p50Ms": 2.695,
+ "p95Ms": 2.695,
+ "maxMs": 2.695,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 256912,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 2
+ },
+ "wallMs": 316.11,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.58,
+ "avgMs": 0.584,
+ "p95Ms": 0.584,
+ "maxMs": 0.584
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.139,
+ "maxMs": 0.139
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.897,
+ "maxMs": 2.897
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.9,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.9,
+ "avgMs": 2.897,
+ "p50Ms": 2.897,
+ "p95Ms": 2.897,
+ "maxMs": 2.897,
+ "mainThreadMs": 2.9,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255832,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 3
+ },
+ "wallMs": 316.28,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.67,
+ "avgMs": 0.666,
+ "p95Ms": 0.666,
+ "maxMs": 0.666
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.17,
+ "maxMs": 0.17
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.782,
+ "maxMs": 2.782
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.78,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.78,
+ "avgMs": 2.782,
+ "p50Ms": 2.782,
+ "p95Ms": 2.782,
+ "maxMs": 2.782,
+ "mainThreadMs": 2.78,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 257768,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 1000,
+ "tick": 4
+ },
+ "wallMs": 315.89,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.72,
+ "avgMs": 0.719,
+ "p95Ms": 0.719,
+ "maxMs": 0.719
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.15,
+ "maxMs": 0.15
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.073,
+ "maxMs": 3.073
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.07,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.07,
+ "avgMs": 3.073,
+ "p50Ms": 3.073,
+ "p95Ms": 3.073,
+ "maxMs": 3.073,
+ "mainThreadMs": 3.07,
+ "backgroundMs": 0,
+ "items": 1000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 255928,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygon-10k",
+ "name": "Polygon, 10k vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "One 10000-vertex polygon: mount, five fill/stroke updates, then a short pan.",
+ "recordedAt": "2026-09-10T14:12:11.142Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4943,
+ "load": {
+ "commitMs": 1.21,
+ "readyMs": 108,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 1.73,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.001,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 1.71,
+ "avgMs": 0.855,
+ "p50Ms": 0,
+ "p95Ms": 1.71,
+ "maxMs": 1.71,
+ "mainThreadMs": 1.71,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013839579999999907,
+ "allocatedBytes": 2866720,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 245,
+ "durationMs": 4127.4,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 16.8,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 45.59,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 243,
+ 1,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0041,
+ "droppedFrames": 2,
+ "longFrames": 0,
+ "overBudgetFrames": 2
+ },
+ "js": {
+ "lagMs": {
+ "samples": 248,
+ "p50": 0.02,
+ "p95": 0.45,
+ "p99": 0.49,
+ "max": 0.51
+ },
+ "frameGapMs": {
+ "p50": 16.69,
+ "p95": 17.11,
+ "max": 17.18
+ },
+ "lateFrames": 0,
+ "busyMs": 31.9,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4128.6,
+ "commits": {
+ "count": 5,
+ "totalMs": 4.47,
+ "avgMs": 0.895,
+ "p95Ms": 1.012,
+ "maxMs": 1.012
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 5,
+ "avgMs": 0.155,
+ "maxMs": 0.219
+ },
+ "setterMs": {
+ "samples": 5,
+ "avgMs": 2.713,
+ "maxMs": 3.122
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 9,
+ "mainThreadMs": 14.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 5,
+ "totalMs": 13.56,
+ "avgMs": 2.713,
+ "p50Ms": 2.588,
+ "p95Ms": 3.122,
+ "maxMs": 3.122,
+ "mainThreadMs": 13.56,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.39,
+ "avgMs": 0.348,
+ "p50Ms": 0.302,
+ "p95Ms": 0.504,
+ "maxMs": 0.504,
+ "mainThreadMs": 1.39,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 191.7,
+ "afterLoadMB": 223.4,
+ "afterInteractionMB": 313.9,
+ "afterCleanupMB": 192.2,
+ "peakMB": 313.9,
+ "loadDeltaMB": 31.7,
+ "interactionDeltaMB": 90.5,
+ "retainedAfterCleanupMB": 0.5,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 191.7,
+ "residentMB": 365.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 135523,
+ "mallocMB": 94.6
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 223.4,
+ "residentMB": 378.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 276573,
+ "mallocMB": 126.4
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 313.9,
+ "residentMB": 372.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 368499,
+ "mallocMB": 145.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.2,
+ "residentMB": 343.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 135642,
+ "mallocMB": 94.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 10130464,
+ "gcCount": 4,
+ "gcTimeMs": 0.001400375999999981,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 91926,
+ "mallocBytesDelta": 20231568
+ }
+ },
+ "cpu": {
+ "processCpuMs": 876,
+ "wallMs": 4130,
+ "percent": 21.2,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 6,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 6,
+ "coordinates": 60000,
+ "estimatedBytes": 2687472
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447912
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 0
+ },
+ "wallMs": 319.44,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.8,
+ "avgMs": 0.805,
+ "p95Ms": 0.805,
+ "maxMs": 0.805
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.135,
+ "maxMs": 0.135
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.579,
+ "maxMs": 2.579
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.58,
+ "avgMs": 2.579,
+ "p50Ms": 2.579,
+ "p95Ms": 2.579,
+ "maxMs": 2.579,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0007163749999999913,
+ "allocatedBytes": 1782600,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 1
+ },
+ "wallMs": 315.96,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.87,
+ "avgMs": 0.873,
+ "p95Ms": 0.873,
+ "maxMs": 0.873
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.139,
+ "maxMs": 0.139
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.588,
+ "maxMs": 2.588
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.59,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.59,
+ "avgMs": 2.588,
+ "p50Ms": 2.588,
+ "p95Ms": 2.588,
+ "maxMs": 2.588,
+ "mainThreadMs": 2.59,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00017100000000000448,
+ "allocatedBytes": 1781816,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 2
+ },
+ "wallMs": 316.08,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.97,
+ "avgMs": 0.967,
+ "p95Ms": 0.967,
+ "maxMs": 0.967
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.155,
+ "maxMs": 0.155
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.693,
+ "maxMs": 2.693
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.69,
+ "avgMs": 2.693,
+ "p50Ms": 2.693,
+ "p95Ms": 2.693,
+ "maxMs": 2.693,
+ "mainThreadMs": 2.69,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1780808,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 3,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 3
+ },
+ "wallMs": 315.86,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.01,
+ "avgMs": 1.012,
+ "p95Ms": 1.012,
+ "maxMs": 1.012
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.219,
+ "maxMs": 0.219
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 3.122,
+ "maxMs": 3.122
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 3.12,
+ "avgMs": 3.122,
+ "p50Ms": 3.122,
+ "p95Ms": 3.122,
+ "maxMs": 3.122,
+ "mainThreadMs": 3.12,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.00037945899999999866,
+ "allocatedBytes": 1782632,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 4,
+ "label": "restyle",
+ "meta": {
+ "points": 10000,
+ "tick": 4
+ },
+ "wallMs": 316.46,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.818,
+ "p95Ms": 0.818,
+ "maxMs": 0.818
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.123,
+ "maxMs": 0.123
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.583,
+ "maxMs": 2.583
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 2.58,
+ "avgMs": 2.583,
+ "p50Ms": 2.583,
+ "p95Ms": 2.583,
+ "maxMs": 2.583,
+ "mainThreadMs": 2.58,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0001335419999999865,
+ "allocatedBytes": 1780792,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polylines-200x50",
+ "name": "200 polylines of 50 points",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polylines: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:12:17.457Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4307,
+ "load": {
+ "commitMs": 1.26,
+ "readyMs": 80,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 13.69,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 13.66,
+ "avgMs": 6.83,
+ "p50Ms": 0.001,
+ "p95Ms": 13.659,
+ "maxMs": 13.659,
+ "mainThreadMs": 13.66,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.001,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1949576,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 201,
+ "durationMs": 3495.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.7,
+ "p50": 58,
+ "p95": 55,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.33,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 37.69,
+ "worst": 50,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 194,
+ 1,
+ 1,
+ 4,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 6,
+ "jankRatio": 0.0299,
+ "droppedFrames": 8,
+ "longFrames": 1,
+ "overBudgetFrames": 7
+ },
+ "js": {
+ "lagMs": {
+ "samples": 210,
+ "p50": 0,
+ "p95": 0.5,
+ "p99": 0.68,
+ "max": 0.75
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.17,
+ "max": 17.42
+ },
+ "lateFrames": 0,
+ "busyMs": 30,
+ "busyRatio": 0.0086,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3495.6,
+ "commits": {
+ "count": 3,
+ "totalMs": 3.49,
+ "avgMs": 1.162,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.221,
+ "maxMs": 0.286
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 29.576,
+ "maxMs": 30.875
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 90.08,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 88.73,
+ "avgMs": 29.576,
+ "p50Ms": 28.965,
+ "p95Ms": 30.875,
+ "maxMs": 30.875,
+ "mainThreadMs": 88.73,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.36,
+ "avgMs": 0.339,
+ "p50Ms": 0.286,
+ "p95Ms": 0.401,
+ "maxMs": 0.401,
+ "mainThreadMs": 1.36,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193,
+ "afterLoadMB": 248.5,
+ "afterInteractionMB": 346.2,
+ "afterCleanupMB": 192.1,
+ "peakMB": 346.2,
+ "loadDeltaMB": 55.5,
+ "interactionDeltaMB": 97.7,
+ "retainedAfterCleanupMB": -0.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193,
+ "residentMB": 341.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 136232,
+ "mallocMB": 94.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 248.5,
+ "residentMB": 369.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 300580,
+ "mallocMB": 132
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 346.2,
+ "residentMB": 474.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 414287,
+ "mallocMB": 154.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.1,
+ "residentMB": 384.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 137960,
+ "mallocMB": 94.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 3733064,
+ "gcCount": 1,
+ "gcTimeMs": 0.001592666999999992,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 113707,
+ "mallocBytesDelta": 23741872
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1131,
+ "wallMs": 3497,
+ "percent": 32.3,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "polylines": {
+ "items": 800,
+ "coordinates": 40000,
+ "estimatedBytes": 1850384
+ }
+ },
+ "largestUpdate": {
+ "polylines": {
+ "items": 200,
+ "coordinates": 10000,
+ "estimatedBytes": 462596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 0
+ },
+ "wallMs": 313.52,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.88,
+ "avgMs": 0.881,
+ "p95Ms": 0.881,
+ "maxMs": 0.881
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.205,
+ "maxMs": 0.205
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 28.965,
+ "maxMs": 28.965
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 28.96,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 28.96,
+ "avgMs": 28.965,
+ "p50Ms": 28.965,
+ "p95Ms": 28.965,
+ "maxMs": 28.965,
+ "mainThreadMs": 28.96,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 812912,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 1
+ },
+ "wallMs": 315.93,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.82,
+ "avgMs": 0.823,
+ "p95Ms": 0.823,
+ "maxMs": 0.823
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.173,
+ "maxMs": 0.173
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 28.889,
+ "maxMs": 28.889
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 28.89,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 28.89,
+ "avgMs": 28.889,
+ "p50Ms": 28.889,
+ "p95Ms": 28.889,
+ "maxMs": 28.889,
+ "mainThreadMs": 28.89,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 812200,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polylines": 200,
+ "tick": 2
+ },
+ "wallMs": 316.13,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.783,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.286,
+ "maxMs": 0.286
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 30.875,
+ "maxMs": 30.875
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 30.87,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 30.87,
+ "avgMs": 30.875,
+ "p50Ms": 30.875,
+ "p95Ms": 30.875,
+ "maxMs": 30.875,
+ "mainThreadMs": 30.87,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 811192,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "polygons-200x20",
+ "name": "200 polygons of 20 vertices",
+ "group": "geometry",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Many small polygons: mount, three whole-set restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:12:23.774Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 4294,
+ "load": {
+ "commitMs": 1.8,
+ "readyMs": 95,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 12,
+ "mainThreadMs": 19.36,
+ "backgroundMs": 0,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 19.34,
+ "avgMs": 9.67,
+ "p50Ms": 0,
+ "p95Ms": 19.339,
+ "maxMs": 19.339,
+ "mainThreadMs": 19.34,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.001435040999999998,
+ "allocatedBytes": 993416,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 199,
+ "durationMs": 3479.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 57.4,
+ "p50": 58,
+ "p95": 53,
+ "p99": 53,
+ "worstWindow": 53,
+ "windows": 4
+ },
+ "frameTimeMs": {
+ "average": 17.42,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 43.99,
+ "worst": 61.48,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 191,
+ 3,
+ 1,
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 5,
+ "jankRatio": 0.0251,
+ "droppedFrames": 9,
+ "longFrames": 1,
+ "overBudgetFrames": 8
+ },
+ "js": {
+ "lagMs": {
+ "samples": 209,
+ "p50": 0,
+ "p95": 0.54,
+ "p99": 0.59,
+ "max": 0.75
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.2,
+ "max": 17.41
+ },
+ "lateFrames": 0,
+ "busyMs": 29.1,
+ "busyRatio": 0.0084,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 3479.6,
+ "commits": {
+ "count": 3,
+ "totalMs": 2.53,
+ "avgMs": 0.845,
+ "p95Ms": 1.072,
+ "maxMs": 1.072
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.226,
+ "maxMs": 0.346
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 40.605,
+ "maxMs": 46.057
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7,
+ "mainThreadMs": 123.2,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 121.81,
+ "avgMs": 40.605,
+ "p50Ms": 40.698,
+ "p95Ms": 46.057,
+ "maxMs": 46.057,
+ "mainThreadMs": 121.81,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 4,
+ "totalMs": 1.39,
+ "avgMs": 0.347,
+ "p50Ms": 0.29,
+ "p95Ms": 0.562,
+ "maxMs": 0.562,
+ "mainThreadMs": 1.39,
+ "backgroundMs": 0,
+ "items": 0
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 192.9,
+ "afterLoadMB": 244.4,
+ "afterInteractionMB": 347.9,
+ "afterCleanupMB": 192.6,
+ "peakMB": 347.9,
+ "loadDeltaMB": 51.5,
+ "interactionDeltaMB": 103.5,
+ "retainedAfterCleanupMB": -0.3,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 192.9,
+ "residentMB": 385.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 138540,
+ "mallocMB": 94.2
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 244.4,
+ "residentMB": 440.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 307421,
+ "mallocMB": 127.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 347.9,
+ "residentMB": 467.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 408373,
+ "mallocMB": 150.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 192.6,
+ "residentMB": 381.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 141541,
+ "mallocMB": 94.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1846368,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 100952,
+ "mallocBytesDelta": 24879776
+ }
+ },
+ "cpu": {
+ "processCpuMs": 903,
+ "wallMs": 3481,
+ "percent": 25.9,
+ "threadsBefore": 22,
+ "threadsAfter": 22,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 0
+ },
+ "wallMs": 305.18,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.07,
+ "avgMs": 1.072,
+ "p95Ms": 1.072,
+ "maxMs": 1.072
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.346,
+ "maxMs": 0.346
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 46.057,
+ "maxMs": 46.057
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 46.06,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 46.06,
+ "avgMs": 46.057,
+ "p50Ms": 46.057,
+ "p95Ms": 46.057,
+ "maxMs": 46.057,
+ "mainThreadMs": 46.06,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 362152,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 1
+ },
+ "wallMs": 316.62,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.87,
+ "avgMs": 0.872,
+ "p95Ms": 0.872,
+ "maxMs": 0.872
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.191,
+ "maxMs": 0.191
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 40.698,
+ "maxMs": 40.698
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 40.7,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 40.7,
+ "avgMs": 40.698,
+ "p50Ms": 40.698,
+ "p95Ms": 40.698,
+ "maxMs": 40.698,
+ "mainThreadMs": 40.7,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 362144,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {
+ "polygons": 200,
+ "tick": 2
+ },
+ "wallMs": 316.38,
+ "commits": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.59,
+ "p95Ms": 0.59,
+ "maxMs": 0.59
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.142,
+ "maxMs": 0.142
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 35.06,
+ "maxMs": 35.06
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 35.06,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 35.06,
+ "avgMs": 35.06,
+ "p50Ms": 35.06,
+ "p95Ms": 35.06,
+ "maxMs": 35.06,
+ "mainThreadMs": 35.06,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 361024,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "cluster-1k",
+ "name": "Clustering, 1k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "1000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:12:37.625Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10865,
+ "load": {
+ "commitMs": 1.49,
+ "readyMs": 62,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 45,
+ "mainThreadMs": 4.36,
+ "backgroundMs": 1.84,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 0.11,
+ "avgMs": 0.038,
+ "p50Ms": 0.055,
+ "p95Ms": 0.059,
+ "maxMs": 0.059,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.07,
+ "avgMs": 0.036,
+ "p50Ms": 0.003,
+ "p95Ms": 0.07,
+ "maxMs": 0.07,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 0.52,
+ "avgMs": 0.13,
+ "p50Ms": 0.138,
+ "p95Ms": 0.194,
+ "maxMs": 0.194,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 3000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.171,
+ "p50Ms": 0.171,
+ "p95Ms": 0.171,
+ "maxMs": 0.171,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 0.44,
+ "avgMs": 0.437,
+ "p50Ms": 0.437,
+ "p95Ms": 0.437,
+ "maxMs": 0.437,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.44,
+ "items": 1000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.05,
+ "p50Ms": 0.05,
+ "p95Ms": 0.05,
+ "maxMs": 0.05,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 23
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.66,
+ "avgMs": 0.663,
+ "p50Ms": 0.663,
+ "p95Ms": 0.663,
+ "maxMs": 0.663,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.66,
+ "items": 1000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 1.99,
+ "avgMs": 1.993,
+ "p50Ms": 1.993,
+ "p95Ms": 1.993,
+ "maxMs": 1.993,
+ "mainThreadMs": 1.99,
+ "backgroundMs": 0,
+ "items": 23
+ },
+ "annotation.viewFor": {
+ "count": 23,
+ "totalMs": 2.16,
+ "avgMs": 0.094,
+ "p50Ms": 0.036,
+ "p95Ms": 0.092,
+ "maxMs": 1.312,
+ "mainThreadMs": 2.16,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 23
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 544304,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ "frames": {
+ "frames": 596,
+ "durationMs": 10046.1,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.4,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.83,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 34.66,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 590,
+ 0,
+ 0,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 6,
+ "jankRatio": 0.0101,
+ "droppedFrames": 6,
+ "longFrames": 0,
+ "overBudgetFrames": 6
+ },
+ "js": {
+ "lagMs": {
+ "samples": 603,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.59,
+ "max": 0.76
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 17.43
+ },
+ "lateFrames": 0,
+ "busyMs": 78.5,
+ "busyRatio": 0.0078,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10046.8,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.01,
+ "avgMs": 5.008,
+ "p95Ms": 5.008,
+ "maxMs": 5.008
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.408,
+ "maxMs": 0.408
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.373,
+ "maxMs": 0.373
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1432,
+ "mainThreadMs": 67.99,
+ "backgroundMs": 84.18,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 5.29,
+ "avgMs": 0.529,
+ "p50Ms": 0.52,
+ "p95Ms": 0.869,
+ "maxMs": 0.869,
+ "mainThreadMs": 5.29,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 86,
+ "totalMs": 10.6,
+ "avgMs": 0.123,
+ "p50Ms": 0.113,
+ "p95Ms": 0.298,
+ "maxMs": 0.569,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.6,
+ "items": 86000
+ },
+ "markers.cluster": {
+ "count": 86,
+ "totalMs": 27.01,
+ "avgMs": 0.314,
+ "p50Ms": 0.281,
+ "p95Ms": 0.755,
+ "maxMs": 1.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 27.01,
+ "items": 34044
+ },
+ "markers.diff": {
+ "count": 86,
+ "totalMs": 3.73,
+ "avgMs": 0.043,
+ "p50Ms": 0.038,
+ "p95Ms": 0.089,
+ "maxMs": 0.128,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.73,
+ "items": 5371
+ },
+ "markers.viewportCompute": {
+ "count": 86,
+ "totalMs": 42.6,
+ "avgMs": 0.495,
+ "p50Ms": 0.513,
+ "p95Ms": 1.021,
+ "maxMs": 1.422,
+ "mainThreadMs": 0,
+ "backgroundMs": 42.6,
+ "items": 34044
+ },
+ "markers.applyDiff": {
+ "count": 86,
+ "totalMs": 39.77,
+ "avgMs": 0.462,
+ "p50Ms": 0.456,
+ "p95Ms": 1.152,
+ "maxMs": 1.397,
+ "mainThreadMs": 39.77,
+ "backgroundMs": 0,
+ "items": 2027
+ },
+ "annotation.viewFor": {
+ "count": 928,
+ "totalMs": 22.28,
+ "avgMs": 0.024,
+ "p50Ms": 0.008,
+ "p95Ms": 0.046,
+ "maxMs": 7.57,
+ "mainThreadMs": 22.28,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 61,
+ "totalMs": 0.16,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 928
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.116,
+ "p50Ms": 0.116,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.373,
+ "p50Ms": 0.373,
+ "p95Ms": 0.373,
+ "maxMs": 0.373,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.236,
+ "p50Ms": 0.236,
+ "p95Ms": 0.236,
+ "maxMs": 0.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 193.5,
+ "afterLoadMB": 252.4,
+ "afterInteractionMB": 407.9,
+ "afterCleanupMB": 195.1,
+ "peakMB": 407.9,
+ "loadDeltaMB": 58.9,
+ "interactionDeltaMB": 155.5,
+ "retainedAfterCleanupMB": 1.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 193.5,
+ "residentMB": 382,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 142117,
+ "mallocMB": 94.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 252.4,
+ "residentMB": 454.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 356393,
+ "mallocMB": 152.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 407.9,
+ "residentMB": 339.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 574395,
+ "mallocMB": 222.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 195.1,
+ "residentMB": 389.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 130248,
+ "mallocMB": 95
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1120800,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 36
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 218002,
+ "mallocBytesDelta": 72998672
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2975,
+ "wallMs": 10050,
+ "percent": 29.6,
+ "threadsBefore": 22,
+ "threadsAfter": 11,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 2000,
+ "coordinates": 2000,
+ "estimatedBytes": 181192
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 1000,
+ "coordinates": 1000,
+ "estimatedBytes": 90596
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5161.74,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 987,
+ "mainThreadMs": 40.96,
+ "backgroundMs": 32.94,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.73,
+ "avgMs": 0.547,
+ "p50Ms": 0.52,
+ "p95Ms": 0.869,
+ "maxMs": 0.869,
+ "mainThreadMs": 2.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 3.71,
+ "avgMs": 0.074,
+ "p50Ms": 0.034,
+ "p95Ms": 0.298,
+ "maxMs": 0.357,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.71,
+ "items": 50000
+ },
+ "markers.cluster": {
+ "count": 50,
+ "totalMs": 10.87,
+ "avgMs": 0.217,
+ "p50Ms": 0.134,
+ "p95Ms": 0.527,
+ "maxMs": 1.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.87,
+ "items": 13618
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 1.58,
+ "avgMs": 0.032,
+ "p50Ms": 0.025,
+ "p95Ms": 0.059,
+ "maxMs": 0.128,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 2066
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 16.78,
+ "avgMs": 0.336,
+ "p50Ms": 0.237,
+ "p95Ms": 0.903,
+ "maxMs": 1.422,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.78,
+ "items": 13618
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 19.86,
+ "avgMs": 0.397,
+ "p50Ms": 0.383,
+ "p95Ms": 0.979,
+ "maxMs": 1.178,
+ "mainThreadMs": 19.86,
+ "backgroundMs": 0,
+ "items": 1431
+ },
+ "annotation.viewFor": {
+ "count": 696,
+ "totalMs": 18.26,
+ "avgMs": 0.026,
+ "p50Ms": 0.008,
+ "p95Ms": 0.046,
+ "maxMs": 7.57,
+ "mainThreadMs": 18.26,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 36,
+ "totalMs": 0.1,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.1,
+ "backgroundMs": 0,
+ "items": 696
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 449120,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3661.99,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 437,
+ "mainThreadMs": 26.4,
+ "backgroundMs": 50.29,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.56,
+ "avgMs": 0.512,
+ "p50Ms": 0.521,
+ "p95Ms": 0.638,
+ "maxMs": 0.638,
+ "mainThreadMs": 2.56,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 6.81,
+ "avgMs": 0.195,
+ "p50Ms": 0.185,
+ "p95Ms": 0.31,
+ "maxMs": 0.569,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.81,
+ "items": 35000
+ },
+ "markers.cluster": {
+ "count": 35,
+ "totalMs": 15.89,
+ "avgMs": 0.454,
+ "p50Ms": 0.431,
+ "p95Ms": 0.758,
+ "maxMs": 0.812,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.89,
+ "items": 19903
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 2.12,
+ "avgMs": 0.061,
+ "p50Ms": 0.064,
+ "p95Ms": 0.099,
+ "maxMs": 0.109,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.12,
+ "items": 3211
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 25.46,
+ "avgMs": 0.727,
+ "p50Ms": 0.71,
+ "p95Ms": 1.103,
+ "maxMs": 1.207,
+ "mainThreadMs": 0,
+ "backgroundMs": 25.46,
+ "items": 19903
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 19.76,
+ "avgMs": 0.565,
+ "p50Ms": 0.533,
+ "p95Ms": 1.244,
+ "maxMs": 1.397,
+ "mainThreadMs": 19.76,
+ "backgroundMs": 0,
+ "items": 592
+ },
+ "annotation.viewFor": {
+ "count": 232,
+ "totalMs": 4.02,
+ "avgMs": 0.017,
+ "p50Ms": 0.011,
+ "p95Ms": 0.045,
+ "maxMs": 0.135,
+ "mainThreadMs": 4.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 25,
+ "totalMs": 0.06,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 232
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 298144,
+ "heapSizeAfterBytes": 37748736
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 10,
+ "total": 1000
+ },
+ "wallMs": 1212.75,
+ "commits": {
+ "count": 1,
+ "totalMs": 5.01,
+ "avgMs": 5.008,
+ "p95Ms": 5.008,
+ "maxMs": 5.008
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.408,
+ "maxMs": 0.408
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 0.373,
+ "maxMs": 0.373
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 0.63,
+ "backgroundMs": 0.95,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.12,
+ "avgMs": 0.116,
+ "p50Ms": 0.116,
+ "p95Ms": 0.116,
+ "maxMs": 0.116,
+ "mainThreadMs": 0.12,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 0.37,
+ "avgMs": 0.373,
+ "p50Ms": 0.373,
+ "p95Ms": 0.373,
+ "maxMs": 0.373,
+ "mainThreadMs": 0.37,
+ "backgroundMs": 0,
+ "items": 1000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 0.24,
+ "avgMs": 0.236,
+ "p50Ms": 0.236,
+ "p95Ms": 0.236,
+ "maxMs": 0.236,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.24,
+ "items": 1000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.074,
+ "p50Ms": 0.074,
+ "p95Ms": 0.074,
+ "maxMs": 0.074,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.07,
+ "items": 1000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 0.25,
+ "avgMs": 0.247,
+ "p50Ms": 0.247,
+ "p95Ms": 0.247,
+ "maxMs": 0.247,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.25,
+ "items": 523
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.03,
+ "avgMs": 0.032,
+ "p50Ms": 0.032,
+ "p95Ms": 0.032,
+ "maxMs": 0.032,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.03,
+ "items": 94
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.36,
+ "avgMs": 0.359,
+ "p50Ms": 0.359,
+ "p95Ms": 0.359,
+ "maxMs": 0.359,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.36,
+ "items": 523
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.14,
+ "avgMs": 0.145,
+ "p50Ms": 0.145,
+ "p95Ms": 0.145,
+ "maxMs": 0.145,
+ "mainThreadMs": 0.14,
+ "backgroundMs": 0,
+ "items": 4
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 274592,
+ "heapSizeAfterBytes": 37748736
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "cluster-10k",
+ "name": "Clustering, 10k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "10000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:12:51.563Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10892,
+ "load": {
+ "commitMs": 11.38,
+ "readyMs": 106,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 48,
+ "mainThreadMs": 3.84,
+ "backgroundMs": 80.92,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.27,
+ "avgMs": 0.424,
+ "p50Ms": 0.585,
+ "p95Ms": 0.686,
+ "maxMs": 0.686,
+ "mainThreadMs": 1.27,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.6,
+ "avgMs": 0.3,
+ "p50Ms": 0.002,
+ "p95Ms": 0.597,
+ "maxMs": 0.597,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 4.46,
+ "avgMs": 1.116,
+ "p50Ms": 1.183,
+ "p95Ms": 1.687,
+ "maxMs": 1.687,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.46,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 1.82,
+ "avgMs": 1.824,
+ "p50Ms": 1.824,
+ "p95Ms": 1.824,
+ "maxMs": 1.824,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.82,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 35.19,
+ "avgMs": 35.191,
+ "p50Ms": 35.191,
+ "p95Ms": 35.191,
+ "maxMs": 35.191,
+ "mainThreadMs": 0,
+ "backgroundMs": 35.19,
+ "items": 10000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 1.14,
+ "avgMs": 1.138,
+ "p50Ms": 1.138,
+ "p95Ms": 1.138,
+ "maxMs": 1.138,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.14,
+ "items": 26
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 38.31,
+ "avgMs": 38.309,
+ "p50Ms": 38.309,
+ "p95Ms": 38.309,
+ "maxMs": 38.309,
+ "mainThreadMs": 0,
+ "backgroundMs": 38.31,
+ "items": 10000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.07,
+ "avgMs": 0.072,
+ "p50Ms": 0.072,
+ "p95Ms": 0.072,
+ "maxMs": 0.072,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 26
+ },
+ "annotation.viewFor": {
+ "count": 26,
+ "totalMs": 1.88,
+ "avgMs": 0.072,
+ "p50Ms": 0.035,
+ "p95Ms": 0.265,
+ "maxMs": 0.6,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0012099170000000048,
+ "allocatedBytes": 4445624,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ "frames": {
+ "frames": 592,
+ "durationMs": 10068.7,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.9,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 16.98,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 37.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 581,
+ 0,
+ 0,
+ 11,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 11,
+ "jankRatio": 0.0186,
+ "droppedFrames": 11,
+ "longFrames": 0,
+ "overBudgetFrames": 11
+ },
+ "js": {
+ "lagMs": {
+ "samples": 605,
+ "p50": 0,
+ "p95": 0.52,
+ "p99": 0.56,
+ "max": 1.66
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.18,
+ "max": 18.33
+ },
+ "lateFrames": 0,
+ "busyMs": 77.9,
+ "busyRatio": 0.0077,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10069.4,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.34,
+ "avgMs": 11.337,
+ "p95Ms": 11.337,
+ "maxMs": 11.337
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.25,
+ "maxMs": 1.25
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.354,
+ "maxMs": 2.354
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2821,
+ "mainThreadMs": 118.78,
+ "backgroundMs": 739.88,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 5.01,
+ "avgMs": 0.501,
+ "p50Ms": 0.375,
+ "p95Ms": 1.143,
+ "maxMs": 1.143,
+ "mainThreadMs": 5.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 86,
+ "totalMs": 72.15,
+ "avgMs": 0.839,
+ "p50Ms": 0.681,
+ "p95Ms": 2.332,
+ "maxMs": 9.738,
+ "mainThreadMs": 0,
+ "backgroundMs": 72.15,
+ "items": 860000
+ },
+ "markers.cluster": {
+ "count": 86,
+ "totalMs": 273.6,
+ "avgMs": 3.181,
+ "p50Ms": 2.696,
+ "p95Ms": 7.748,
+ "maxMs": 28.794,
+ "mainThreadMs": 0,
+ "backgroundMs": 273.6,
+ "items": 338815
+ },
+ "markers.diff": {
+ "count": 86,
+ "totalMs": 21.4,
+ "avgMs": 0.249,
+ "p50Ms": 0.257,
+ "p95Ms": 0.61,
+ "maxMs": 0.78,
+ "mainThreadMs": 0,
+ "backgroundMs": 21.4,
+ "items": 9760
+ },
+ "markers.viewportCompute": {
+ "count": 86,
+ "totalMs": 371.16,
+ "avgMs": 4.316,
+ "p50Ms": 3.703,
+ "p95Ms": 14.866,
+ "maxMs": 31.282,
+ "mainThreadMs": 0,
+ "backgroundMs": 371.16,
+ "items": 338815
+ },
+ "markers.applyDiff": {
+ "count": 86,
+ "totalMs": 69.08,
+ "avgMs": 0.803,
+ "p50Ms": 0.749,
+ "p95Ms": 1.765,
+ "maxMs": 3.077,
+ "mainThreadMs": 69.08,
+ "backgroundMs": 0,
+ "items": 5220
+ },
+ "annotation.viewFor": {
+ "count": 2308,
+ "totalMs": 41.33,
+ "avgMs": 0.018,
+ "p50Ms": 0.009,
+ "p95Ms": 0.037,
+ "maxMs": 8.107,
+ "mainThreadMs": 41.33,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 70,
+ "totalMs": 0.24,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.008,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.24,
+ "backgroundMs": 0,
+ "items": 2308
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.76,
+ "p50Ms": 0.76,
+ "p95Ms": 0.76,
+ "maxMs": 0.76,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.35,
+ "avgMs": 2.354,
+ "p50Ms": 2.354,
+ "p95Ms": 2.354,
+ "maxMs": 2.354,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.576,
+ "p50Ms": 1.576,
+ "p95Ms": 1.576,
+ "maxMs": 1.576,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 10000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.4,
+ "afterLoadMB": 293.9,
+ "afterInteractionMB": 426.5,
+ "afterCleanupMB": 206.1,
+ "peakMB": 426.5,
+ "loadDeltaMB": 99.5,
+ "interactionDeltaMB": 132.6,
+ "retainedAfterCleanupMB": 11.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.4,
+ "residentMB": 392.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 126253,
+ "mallocMB": 93.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 293.9,
+ "residentMB": 375,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 342244,
+ "mallocMB": 162
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 426.5,
+ "residentMB": 411.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 585811,
+ "mallocMB": 240
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 206.1,
+ "residentMB": 419.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 126383,
+ "mallocMB": 104.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 3176552,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 243567,
+ "mallocBytesDelta": 81767952
+ }
+ },
+ "cpu": {
+ "processCpuMs": 3381,
+ "wallMs": 10075,
+ "percent": 33.6,
+ "threadsBefore": 20,
+ "threadsAfter": 12,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 20000,
+ "coordinates": 20000,
+ "estimatedBytes": 1811880
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5168.25,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2191,
+ "mainThreadMs": 79.83,
+ "backgroundMs": 387.83,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.42,
+ "avgMs": 0.484,
+ "p50Ms": 0.429,
+ "p95Ms": 0.741,
+ "maxMs": 0.741,
+ "mainThreadMs": 2.42,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 50,
+ "totalMs": 37.76,
+ "avgMs": 0.755,
+ "p50Ms": 0.126,
+ "p95Ms": 3.039,
+ "maxMs": 9.738,
+ "mainThreadMs": 0,
+ "backgroundMs": 37.76,
+ "items": 500000
+ },
+ "markers.cluster": {
+ "count": 50,
+ "totalMs": 145.23,
+ "avgMs": 2.905,
+ "p50Ms": 0.515,
+ "p95Ms": 14.669,
+ "maxMs": 28.794,
+ "mainThreadMs": 0,
+ "backgroundMs": 145.23,
+ "items": 135380
+ },
+ "markers.diff": {
+ "count": 50,
+ "totalMs": 9.47,
+ "avgMs": 0.189,
+ "p50Ms": 0.063,
+ "p95Ms": 0.702,
+ "maxMs": 0.78,
+ "mainThreadMs": 0,
+ "backgroundMs": 9.47,
+ "items": 4661
+ },
+ "markers.viewportCompute": {
+ "count": 50,
+ "totalMs": 195.38,
+ "avgMs": 3.908,
+ "p50Ms": 0.771,
+ "p95Ms": 16.847,
+ "maxMs": 31.282,
+ "mainThreadMs": 0,
+ "backgroundMs": 195.38,
+ "items": 135380
+ },
+ "markers.applyDiff": {
+ "count": 50,
+ "totalMs": 41.98,
+ "avgMs": 0.84,
+ "p50Ms": 0.764,
+ "p95Ms": 2.004,
+ "maxMs": 3.077,
+ "mainThreadMs": 41.98,
+ "backgroundMs": 0,
+ "items": 3984
+ },
+ "annotation.viewFor": {
+ "count": 1891,
+ "totalMs": 35.25,
+ "avgMs": 0.019,
+ "p50Ms": 0.008,
+ "p95Ms": 0.037,
+ "maxMs": 8.107,
+ "mainThreadMs": 35.25,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 45,
+ "totalMs": 0.18,
+ "avgMs": 0.004,
+ "p50Ms": 0.003,
+ "p95Ms": 0.01,
+ "maxMs": 0.012,
+ "mainThreadMs": 0.18,
+ "backgroundMs": 0,
+ "items": 1891
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 786272,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3659.86,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 622,
+ "mainThreadMs": 35.42,
+ "backgroundMs": 343.38,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.59,
+ "avgMs": 0.519,
+ "p50Ms": 0.375,
+ "p95Ms": 1.143,
+ "maxMs": 1.143,
+ "mainThreadMs": 2.59,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 35,
+ "totalMs": 33.81,
+ "avgMs": 0.966,
+ "p50Ms": 0.944,
+ "p95Ms": 1.354,
+ "maxMs": 2.54,
+ "mainThreadMs": 0,
+ "backgroundMs": 33.81,
+ "items": 350000
+ },
+ "markers.cluster": {
+ "count": 35,
+ "totalMs": 125.71,
+ "avgMs": 3.592,
+ "p50Ms": 3.366,
+ "p95Ms": 6.599,
+ "maxMs": 7.013,
+ "mainThreadMs": 0,
+ "backgroundMs": 125.71,
+ "items": 198227
+ },
+ "markers.diff": {
+ "count": 35,
+ "totalMs": 11.64,
+ "avgMs": 0.333,
+ "p50Ms": 0.314,
+ "p95Ms": 0.49,
+ "maxMs": 0.652,
+ "mainThreadMs": 0,
+ "backgroundMs": 11.64,
+ "items": 4955
+ },
+ "markers.viewportCompute": {
+ "count": 35,
+ "totalMs": 172.22,
+ "avgMs": 4.921,
+ "p50Ms": 4.645,
+ "p95Ms": 8.224,
+ "maxMs": 8.374,
+ "mainThreadMs": 0,
+ "backgroundMs": 172.22,
+ "items": 198227
+ },
+ "markers.applyDiff": {
+ "count": 35,
+ "totalMs": 26.69,
+ "avgMs": 0.763,
+ "p50Ms": 0.701,
+ "p95Ms": 1.422,
+ "maxMs": 1.774,
+ "mainThreadMs": 26.69,
+ "backgroundMs": 0,
+ "items": 1199
+ },
+ "annotation.viewFor": {
+ "count": 417,
+ "totalMs": 6.07,
+ "avgMs": 0.015,
+ "p50Ms": 0.012,
+ "p95Ms": 0.038,
+ "maxMs": 0.119,
+ "mainThreadMs": 6.07,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 25,
+ "totalMs": 0.06,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 417
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 417632,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 100,
+ "total": 10000
+ },
+ "wallMs": 1227.56,
+ "commits": {
+ "count": 1,
+ "totalMs": 11.34,
+ "avgMs": 11.337,
+ "p95Ms": 11.337,
+ "maxMs": 11.337
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.25,
+ "maxMs": 1.25
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.354,
+ "maxMs": 2.354
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 3.53,
+ "backgroundMs": 8.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 0.76,
+ "avgMs": 0.76,
+ "p50Ms": 0.76,
+ "p95Ms": 0.76,
+ "maxMs": 0.76,
+ "mainThreadMs": 0.76,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 2.35,
+ "avgMs": 2.354,
+ "p50Ms": 2.354,
+ "p95Ms": 2.354,
+ "maxMs": 2.354,
+ "mainThreadMs": 2.35,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 1.58,
+ "avgMs": 1.576,
+ "p50Ms": 1.576,
+ "p95Ms": 1.576,
+ "maxMs": 1.576,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.58,
+ "items": 10000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.59,
+ "avgMs": 0.589,
+ "p50Ms": 0.589,
+ "p95Ms": 0.589,
+ "maxMs": 0.589,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.59,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 2.66,
+ "avgMs": 2.663,
+ "p50Ms": 2.663,
+ "p95Ms": 2.663,
+ "maxMs": 2.663,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.66,
+ "items": 5208
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.29,
+ "avgMs": 0.287,
+ "p50Ms": 0.287,
+ "p95Ms": 0.287,
+ "maxMs": 0.287,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.29,
+ "items": 144
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 3.55,
+ "avgMs": 3.555,
+ "p50Ms": 3.555,
+ "p95Ms": 3.555,
+ "maxMs": 3.555,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.55,
+ "items": 5208
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.41,
+ "avgMs": 0.412,
+ "p50Ms": 0.412,
+ "p95Ms": 0.412,
+ "maxMs": 0.412,
+ "mainThreadMs": 0.41,
+ "backgroundMs": 0,
+ "items": 37
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1873776,
+ "heapSizeAfterBytes": 41943040
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "cluster-50k",
+ "name": "Clustering, 50k markers",
+ "group": "clustering",
+ "tags": [
+ "baseline"
+ ],
+ "description": "50000 clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.",
+ "recordedAt": "2026-09-10T14:13:07.226Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 10925,
+ "load": {
+ "commitMs": 45.98,
+ "readyMs": 251,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 44,
+ "mainThreadMs": 12.61,
+ "backgroundMs": 1664.8,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 7.15,
+ "avgMs": 2.383,
+ "p50Ms": 3.169,
+ "p95Ms": 3.981,
+ "maxMs": 3.981,
+ "mainThreadMs": 7.15,
+ "backgroundMs": 0,
+ "items": 100000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 4.04,
+ "avgMs": 2.02,
+ "p50Ms": 0.004,
+ "p95Ms": 4.035,
+ "maxMs": 4.035,
+ "mainThreadMs": 4.04,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.014,
+ "maxMs": 0.014,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 92.45,
+ "avgMs": 23.112,
+ "p50Ms": 22.342,
+ "p95Ms": 42.56,
+ "maxMs": 42.56,
+ "mainThreadMs": 0,
+ "backgroundMs": 92.45,
+ "items": 150000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 12.56,
+ "avgMs": 12.565,
+ "p50Ms": 12.565,
+ "p95Ms": 12.565,
+ "maxMs": 12.565,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.56,
+ "items": 50000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 770.72,
+ "avgMs": 770.721,
+ "p50Ms": 770.721,
+ "p95Ms": 770.721,
+ "maxMs": 770.721,
+ "mainThreadMs": 0,
+ "backgroundMs": 770.72,
+ "items": 50000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 2.87,
+ "avgMs": 2.872,
+ "p50Ms": 2.872,
+ "p95Ms": 2.872,
+ "maxMs": 2.872,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.87,
+ "items": 22
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 786.2,
+ "avgMs": 786.2,
+ "p50Ms": 786.2,
+ "p95Ms": 786.2,
+ "maxMs": 786.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 786.2,
+ "items": 50000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.129,
+ "p50Ms": 0.129,
+ "p95Ms": 0.129,
+ "maxMs": 0.129,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 22
+ },
+ "annotation.viewFor": {
+ "count": 22,
+ "totalMs": 1.26,
+ "avgMs": 0.057,
+ "p50Ms": 0.039,
+ "p95Ms": 0.084,
+ "maxMs": 0.383,
+ "mainThreadMs": 1.26,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.0069257499999999805,
+ "allocatedBytes": 21551600,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ "frames": {
+ "frames": 590,
+ "durationMs": 10104.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.4,
+ "p50": 59,
+ "p95": 53,
+ "p99": 53,
+ "worstWindow": 53,
+ "windows": 10
+ },
+ "frameTimeMs": {
+ "average": 17.12,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 34.13,
+ "worst": 87.81,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 579,
+ 1,
+ 2,
+ 6,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 10,
+ "jankRatio": 0.0169,
+ "droppedFrames": 16,
+ "longFrames": 2,
+ "overBudgetFrames": 10
+ },
+ "js": {
+ "lagMs": {
+ "samples": 604,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.76,
+ "max": 36.88
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.2,
+ "max": 53.55
+ },
+ "lateFrames": 2,
+ "busyMs": 135.3,
+ "busyRatio": 0.0134,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 10105.5,
+ "commits": {
+ "count": 1,
+ "totalMs": 49.31,
+ "avgMs": 49.313,
+ "p95Ms": 49.313,
+ "maxMs": 49.313
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.509,
+ "maxMs": 8.509
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 8.163,
+ "maxMs": 8.163
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2852,
+ "mainThreadMs": 128.38,
+ "backgroundMs": 7898.43,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 4.6,
+ "avgMs": 0.46,
+ "p50Ms": 0.396,
+ "p95Ms": 1.047,
+ "maxMs": 1.047,
+ "mainThreadMs": 4.6,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 86,
+ "totalMs": 211.01,
+ "avgMs": 2.454,
+ "p50Ms": 2.341,
+ "p95Ms": 5.98,
+ "maxMs": 17.924,
+ "mainThreadMs": 0,
+ "backgroundMs": 211.01,
+ "items": 4300000
+ },
+ "markers.cluster": {
+ "count": 86,
+ "totalMs": 3647.66,
+ "avgMs": 42.415,
+ "p50Ms": 26.156,
+ "p95Ms": 144.462,
+ "maxMs": 380.601,
+ "mainThreadMs": 0,
+ "backgroundMs": 3647.66,
+ "items": 1690380
+ },
+ "markers.diff": {
+ "count": 86,
+ "totalMs": 84.84,
+ "avgMs": 0.986,
+ "p50Ms": 1.128,
+ "p95Ms": 2.499,
+ "maxMs": 3.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 84.84,
+ "items": 12354
+ },
+ "markers.viewportCompute": {
+ "count": 86,
+ "totalMs": 3947.18,
+ "avgMs": 45.897,
+ "p50Ms": 31.007,
+ "p95Ms": 150.381,
+ "maxMs": 401.597,
+ "mainThreadMs": 0,
+ "backgroundMs": 3947.18,
+ "items": 1690380
+ },
+ "markers.applyDiff": {
+ "count": 58,
+ "totalMs": 64.55,
+ "avgMs": 1.113,
+ "p50Ms": 0.992,
+ "p95Ms": 2.874,
+ "maxMs": 3.067,
+ "mainThreadMs": 64.55,
+ "backgroundMs": 0,
+ "items": 5493
+ },
+ "annotation.viewFor": {
+ "count": 2387,
+ "totalMs": 47.4,
+ "avgMs": 0.02,
+ "p50Ms": 0.008,
+ "p95Ms": 0.045,
+ "maxMs": 11.991,
+ "mainThreadMs": 47.4,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 50,
+ "totalMs": 0.21,
+ "avgMs": 0.004,
+ "p50Ms": 0.002,
+ "p95Ms": 0.013,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.21,
+ "backgroundMs": 0,
+ "items": 2387
+ },
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.46,
+ "avgMs": 3.461,
+ "p50Ms": 3.461,
+ "p95Ms": 3.461,
+ "maxMs": 3.461,
+ "mainThreadMs": 3.46,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 8.16,
+ "avgMs": 8.163,
+ "p50Ms": 8.163,
+ "p95Ms": 8.163,
+ "maxMs": 8.163,
+ "mainThreadMs": 8.16,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 7.74,
+ "avgMs": 7.742,
+ "p50Ms": 7.742,
+ "p95Ms": 7.742,
+ "maxMs": 7.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.74,
+ "items": 50000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 194.1,
+ "afterLoadMB": 336.3,
+ "afterInteractionMB": 466.8,
+ "afterCleanupMB": 308.3,
+ "peakMB": 466.8,
+ "loadDeltaMB": 142.2,
+ "interactionDeltaMB": 130.5,
+ "retainedAfterCleanupMB": 114.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 194.1,
+ "residentMB": 444.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 123191,
+ "mallocMB": 90.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 336.3,
+ "residentMB": 296,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 339702,
+ "mallocMB": 199.7
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 466.8,
+ "residentMB": 464.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 616516,
+ "mallocMB": 292.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 308.3,
+ "residentMB": 440.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 237558,
+ "mallocMB": 136.4
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 10311304,
+ "gcCount": 2,
+ "gcTimeMs": 0.008436748999999993,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 276814,
+ "mallocBytesDelta": 97202192
+ }
+ },
+ "cpu": {
+ "processCpuMs": 6595,
+ "wallMs": 10115,
+ "percent": 65.2,
+ "threadsBefore": 20,
+ "threadsAfter": 11,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 2,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 100000,
+ "coordinates": 100000,
+ "estimatedBytes": 9057816
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 50000,
+ "coordinates": 50000,
+ "estimatedBytes": 4528908
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "zoom-sweep",
+ "meta": {},
+ "wallMs": 5170.66,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2439,
+ "mainThreadMs": 87.21,
+ "backgroundMs": 4306.68,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.57,
+ "avgMs": 0.514,
+ "p50Ms": 0.396,
+ "p95Ms": 1.047,
+ "maxMs": 1.047,
+ "mainThreadMs": 2.57,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 49,
+ "totalMs": 105.02,
+ "avgMs": 2.143,
+ "p50Ms": 0.618,
+ "p95Ms": 7.597,
+ "maxMs": 17.924,
+ "mainThreadMs": 0,
+ "backgroundMs": 105.02,
+ "items": 2450000
+ },
+ "markers.cluster": {
+ "count": 48,
+ "totalMs": 2016.61,
+ "avgMs": 42.013,
+ "p50Ms": 2.182,
+ "p95Ms": 360.193,
+ "maxMs": 380.601,
+ "mainThreadMs": 0,
+ "backgroundMs": 2016.61,
+ "items": 587204
+ },
+ "markers.diff": {
+ "count": 48,
+ "totalMs": 32.68,
+ "avgMs": 0.681,
+ "p50Ms": 0.202,
+ "p95Ms": 2.726,
+ "maxMs": 3.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 32.68,
+ "items": 6843
+ },
+ "markers.viewportCompute": {
+ "count": 48,
+ "totalMs": 2152.37,
+ "avgMs": 44.841,
+ "p50Ms": 3.013,
+ "p95Ms": 368.659,
+ "maxMs": 401.597,
+ "mainThreadMs": 0,
+ "backgroundMs": 2152.37,
+ "items": 587204
+ },
+ "markers.applyDiff": {
+ "count": 29,
+ "totalMs": 39.77,
+ "avgMs": 1.372,
+ "p50Ms": 1.292,
+ "p95Ms": 3.047,
+ "maxMs": 3.067,
+ "mainThreadMs": 39.77,
+ "backgroundMs": 0,
+ "items": 4433
+ },
+ "annotation.viewFor": {
+ "count": 2181,
+ "totalMs": 44.69,
+ "avgMs": 0.02,
+ "p50Ms": 0.007,
+ "p95Ms": 0.046,
+ "maxMs": 11.991,
+ "mainThreadMs": 44.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 31,
+ "totalMs": 0.17,
+ "avgMs": 0.006,
+ "p50Ms": 0.004,
+ "p95Ms": 0.015,
+ "maxMs": 0.016,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 2181
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 893048,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 1,
+ "label": "pan",
+ "meta": {},
+ "wallMs": 3660.33,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 405,
+ "mainThreadMs": 28.71,
+ "backgroundMs": 3526.8,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.03,
+ "avgMs": 0.405,
+ "p50Ms": 0.427,
+ "p95Ms": 0.453,
+ "maxMs": 0.453,
+ "mainThreadMs": 2.03,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.cluster": {
+ "count": 37,
+ "totalMs": 1605.76,
+ "avgMs": 43.399,
+ "p50Ms": 30.834,
+ "p95Ms": 128.367,
+ "maxMs": 132.648,
+ "mainThreadMs": 0,
+ "backgroundMs": 1605.76,
+ "items": 1077180
+ },
+ "markers.diff": {
+ "count": 37,
+ "totalMs": 51,
+ "avgMs": 1.378,
+ "p50Ms": 1.231,
+ "p95Ms": 2.429,
+ "maxMs": 2.499,
+ "mainThreadMs": 0,
+ "backgroundMs": 51,
+ "items": 5354
+ },
+ "markers.viewportCompute": {
+ "count": 37,
+ "totalMs": 1766.19,
+ "avgMs": 47.735,
+ "p50Ms": 34.984,
+ "p95Ms": 134.12,
+ "maxMs": 137.69,
+ "mainThreadMs": 0,
+ "backgroundMs": 1766.19,
+ "items": 1077180
+ },
+ "markers.candidates": {
+ "count": 36,
+ "totalMs": 103.84,
+ "avgMs": 2.885,
+ "p50Ms": 2.81,
+ "p95Ms": 4.162,
+ "maxMs": 4.427,
+ "mainThreadMs": 0,
+ "backgroundMs": 103.84,
+ "items": 1800000
+ },
+ "markers.applyDiff": {
+ "count": 28,
+ "totalMs": 23.93,
+ "avgMs": 0.855,
+ "p50Ms": 0.753,
+ "p95Ms": 1.663,
+ "maxMs": 1.767,
+ "mainThreadMs": 23.93,
+ "backgroundMs": 0,
+ "items": 990
+ },
+ "annotation.viewFor": {
+ "count": 206,
+ "totalMs": 2.71,
+ "avgMs": 0.013,
+ "p50Ms": 0.013,
+ "p95Ms": 0.026,
+ "maxMs": 0.064,
+ "mainThreadMs": 2.71,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 19,
+ "totalMs": 0.04,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.04,
+ "backgroundMs": 0,
+ "items": 206
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 335896,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ {
+ "index": 2,
+ "label": "update-1pct",
+ "meta": {
+ "changed": 500,
+ "total": 50000
+ },
+ "wallMs": 1264.75,
+ "commits": {
+ "count": 1,
+ "totalMs": 49.31,
+ "avgMs": 49.313,
+ "p95Ms": 49.313,
+ "maxMs": 49.313
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 8.509,
+ "maxMs": 8.509
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 8.163,
+ "maxMs": 8.163
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 8,
+ "mainThreadMs": 12.46,
+ "backgroundMs": 64.95,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 1,
+ "totalMs": 3.46,
+ "avgMs": 3.461,
+ "p50Ms": 3.461,
+ "p95Ms": 3.461,
+ "maxMs": 3.461,
+ "mainThreadMs": 3.46,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.set": {
+ "count": 1,
+ "totalMs": 8.16,
+ "avgMs": 8.163,
+ "p50Ms": 8.163,
+ "p95Ms": 8.163,
+ "maxMs": 8.163,
+ "mainThreadMs": 8.16,
+ "backgroundMs": 0,
+ "items": 50000
+ },
+ "markers.indexBuild": {
+ "count": 1,
+ "totalMs": 7.74,
+ "avgMs": 7.742,
+ "p50Ms": 7.742,
+ "p95Ms": 7.742,
+ "maxMs": 7.742,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.74,
+ "items": 50000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 2.14,
+ "avgMs": 2.144,
+ "p50Ms": 2.144,
+ "p95Ms": 2.144,
+ "maxMs": 2.144,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.14,
+ "items": 50000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 25.29,
+ "avgMs": 25.285,
+ "p50Ms": 25.285,
+ "p95Ms": 25.285,
+ "maxMs": 25.285,
+ "mainThreadMs": 0,
+ "backgroundMs": 25.29,
+ "items": 25996
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 1.16,
+ "avgMs": 1.161,
+ "p50Ms": 1.161,
+ "p95Ms": 1.161,
+ "maxMs": 1.161,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.16,
+ "items": 157
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 28.61,
+ "avgMs": 28.613,
+ "p50Ms": 28.613,
+ "p95Ms": 28.613,
+ "maxMs": 28.613,
+ "mainThreadMs": 0,
+ "backgroundMs": 28.61,
+ "items": 25996
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.84,
+ "avgMs": 0.84,
+ "p50Ms": 0.84,
+ "p95Ms": 0.84,
+ "maxMs": 0.84,
+ "mainThreadMs": 0.84,
+ "backgroundMs": 0,
+ "items": 70
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.008436748999999993,
+ "allocatedBytes": 8983520,
+ "heapSizeAfterBytes": 41943040
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.000 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-camera",
+ "name": "10k markers + camera",
+ "group": "combined",
+ "tags": [
+ "baseline",
+ "quick"
+ ],
+ "description": "Six fast pan legs and a zoom sweep with 10k markers (no clustering).",
+ "recordedAt": "2026-09-10T14:13:17.326Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7051,
+ "load": {
+ "commitMs": 9.51,
+ "readyMs": 111,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 7.8,
+ "backgroundMs": 3.82,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.34,
+ "avgMs": 0.446,
+ "p50Ms": 0.51,
+ "p95Ms": 0.828,
+ "maxMs": 0.828,
+ "mainThreadMs": 1.34,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.53,
+ "avgMs": 0.266,
+ "p50Ms": 0.002,
+ "p95Ms": 0.53,
+ "maxMs": 0.53,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.65,
+ "avgMs": 1.218,
+ "p50Ms": 1.242,
+ "p95Ms": 1.268,
+ "maxMs": 1.268,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.65,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.04,
+ "avgMs": 0.037,
+ "p50Ms": 0.037,
+ "p95Ms": 0.037,
+ "maxMs": 0.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.04,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.018,
+ "p50Ms": 0.018,
+ "p95Ms": 0.018,
+ "maxMs": 0.018,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.09,
+ "avgMs": 0.093,
+ "p50Ms": 0.093,
+ "p95Ms": 0.093,
+ "maxMs": 0.093,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.09,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.084,
+ "p50Ms": 0.084,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.83,
+ "avgMs": 0.096,
+ "p50Ms": 0.01,
+ "p95Ms": 0.024,
+ "maxMs": 5.126,
+ "mainThreadMs": 5.83,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0008482079999999892,
+ "allocatedBytes": 4454304,
+ "heapSizeAfterBytes": 41943040
+ }
+ },
+ "frames": {
+ "frames": 365,
+ "durationMs": 6234.8,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.7,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 17.03,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.39,
+ "worst": 48.85,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 357,
+ 1,
+ 1,
+ 6,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 7,
+ "jankRatio": 0.0192,
+ "droppedFrames": 8,
+ "longFrames": 0,
+ "overBudgetFrames": 8
+ },
+ "js": {
+ "lagMs": {
+ "samples": 375,
+ "p50": 0.01,
+ "p95": 0.5,
+ "p99": 0.62,
+ "max": 1.36
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.17,
+ "max": 18.03
+ },
+ "lateFrames": 0,
+ "busyMs": 51.7,
+ "busyRatio": 0.0083,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6235.3,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 519,
+ "mainThreadMs": 16.93,
+ "backgroundMs": 11.22,
+ "byName": {
+ "camera.apply": {
+ "count": 10,
+ "totalMs": 4.13,
+ "avgMs": 0.413,
+ "p50Ms": 0.363,
+ "p95Ms": 0.749,
+ "maxMs": 0.749,
+ "mainThreadMs": 4.13,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 59,
+ "totalMs": 3.78,
+ "avgMs": 0.064,
+ "p50Ms": 0.014,
+ "p95Ms": 0.241,
+ "maxMs": 1.533,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.78,
+ "items": 590000
+ },
+ "markers.viewportFilter": {
+ "count": 59,
+ "totalMs": 0.58,
+ "avgMs": 0.01,
+ "p50Ms": 0.005,
+ "p95Ms": 0.034,
+ "maxMs": 0.087,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.58,
+ "items": 3652
+ },
+ "markers.diff": {
+ "count": 59,
+ "totalMs": 0.91,
+ "avgMs": 0.015,
+ "p50Ms": 0.013,
+ "p95Ms": 0.029,
+ "maxMs": 0.036,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.91,
+ "items": 1192
+ },
+ "markers.viewportCompute": {
+ "count": 59,
+ "totalMs": 5.96,
+ "avgMs": 0.101,
+ "p50Ms": 0.042,
+ "p95Ms": 0.293,
+ "maxMs": 1.593,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.96,
+ "items": 3652
+ },
+ "markers.applyDiff": {
+ "count": 59,
+ "totalMs": 10.4,
+ "avgMs": 0.176,
+ "p50Ms": 0.151,
+ "p95Ms": 0.62,
+ "maxMs": 0.966,
+ "mainThreadMs": 10.4,
+ "backgroundMs": 0,
+ "items": 415
+ },
+ "annotation.viewFor": {
+ "count": 182,
+ "totalMs": 2.34,
+ "avgMs": 0.013,
+ "p50Ms": 0.009,
+ "p95Ms": 0.034,
+ "maxMs": 0.103,
+ "mainThreadMs": 2.34,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 32,
+ "totalMs": 0.06,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.06,
+ "backgroundMs": 0,
+ "items": 182
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 309,
+ "afterLoadMB": 264.4,
+ "afterInteractionMB": 445.8,
+ "afterCleanupMB": 316.2,
+ "peakMB": 445.8,
+ "loadDeltaMB": -44.6,
+ "interactionDeltaMB": 181.4,
+ "retainedAfterCleanupMB": 7.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 309,
+ "residentMB": 408.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 237078,
+ "mallocMB": 136.5
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 264.4,
+ "residentMB": 404.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 310575,
+ "mallocMB": 147.6
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 445.8,
+ "residentMB": 453.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 636244,
+ "mallocMB": 233.9
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 316.2,
+ "residentMB": 419,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 255737,
+ "mallocMB": 130.2
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 375832,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 325669,
+ "mallocBytesDelta": 90437488
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2354,
+ "wallMs": 6242,
+ "percent": 37.7,
+ "threadsBefore": 21,
+ "threadsAfter": 28,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-cluster-camera",
+ "name": "10k markers + clustering + camera",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "Zoom sweep and pan with 10k clustered markers at country scale.",
+ "recordedAt": "2026-09-10T14:13:27.176Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 6785,
+ "load": {
+ "commitMs": 15.79,
+ "readyMs": 122,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 48,
+ "mainThreadMs": 3.85,
+ "backgroundMs": 35.01,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.23,
+ "avgMs": 0.409,
+ "p50Ms": 0.514,
+ "p95Ms": 0.713,
+ "maxMs": 0.713,
+ "mainThreadMs": 1.23,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.53,
+ "avgMs": 0.264,
+ "p50Ms": 0.003,
+ "p95Ms": 0.525,
+ "maxMs": 0.525,
+ "mainThreadMs": 0.53,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 3.55,
+ "avgMs": 0.888,
+ "p50Ms": 1.139,
+ "p95Ms": 1.198,
+ "maxMs": 1.198,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.55,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 1.25,
+ "avgMs": 1.251,
+ "p50Ms": 1.251,
+ "p95Ms": 1.251,
+ "maxMs": 1.251,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.25,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 13.93,
+ "avgMs": 13.93,
+ "p50Ms": 13.93,
+ "p95Ms": 13.93,
+ "maxMs": 13.93,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.93,
+ "items": 10000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.54,
+ "avgMs": 0.54,
+ "p50Ms": 0.54,
+ "p95Ms": 0.54,
+ "maxMs": 0.54,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 26
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 15.74,
+ "avgMs": 15.735,
+ "p50Ms": 15.735,
+ "p95Ms": 15.735,
+ "maxMs": 15.735,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.74,
+ "items": 10000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.055,
+ "p50Ms": 0.055,
+ "p95Ms": 0.055,
+ "maxMs": 0.055,
+ "mainThreadMs": 0.05,
+ "backgroundMs": 0,
+ "items": 26
+ },
+ "annotation.viewFor": {
+ "count": 26,
+ "totalMs": 2.02,
+ "avgMs": 0.078,
+ "p50Ms": 0.059,
+ "p95Ms": 0.17,
+ "maxMs": 0.235,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.002,
+ "maxMs": 0.002,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0034307909999999886,
+ "allocatedBytes": 4444992,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 355,
+ "durationMs": 5965,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.8,
+ "p50": 60,
+ "p95": 59,
+ "p99": 59,
+ "worstWindow": 59,
+ "windows": 6
+ },
+ "frameTimeMs": {
+ "average": 16.71,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 354,
+ 0,
+ 0,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 1,
+ "jankRatio": 0.0028,
+ "droppedFrames": 1,
+ "longFrames": 0,
+ "overBudgetFrames": 1
+ },
+ "js": {
+ "lagMs": {
+ "samples": 358,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.56,
+ "max": 0.94
+ },
+ "frameGapMs": {
+ "p50": 16.66,
+ "p95": 17.18,
+ "max": 17.61
+ },
+ "lateFrames": 0,
+ "busyMs": 47.3,
+ "busyRatio": 0.0079,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 5965.5,
+ "commits": {
+ "count": 0,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p95Ms": 0,
+ "maxMs": 0
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 2061,
+ "mainThreadMs": 76.92,
+ "backgroundMs": 490.71,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 4.34,
+ "avgMs": 0.542,
+ "p50Ms": 0.524,
+ "p95Ms": 0.843,
+ "maxMs": 0.843,
+ "mainThreadMs": 4.34,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 57,
+ "totalMs": 50.15,
+ "avgMs": 0.88,
+ "p50Ms": 0.728,
+ "p95Ms": 1.933,
+ "maxMs": 8.527,
+ "mainThreadMs": 0,
+ "backgroundMs": 50.15,
+ "items": 570000
+ },
+ "markers.cluster": {
+ "count": 57,
+ "totalMs": 180.64,
+ "avgMs": 3.169,
+ "p50Ms": 2.829,
+ "p95Ms": 12.312,
+ "maxMs": 18.428,
+ "mainThreadMs": 0,
+ "backgroundMs": 180.64,
+ "items": 246328
+ },
+ "markers.diff": {
+ "count": 57,
+ "totalMs": 13.89,
+ "avgMs": 0.244,
+ "p50Ms": 0.247,
+ "p95Ms": 0.695,
+ "maxMs": 0.964,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.89,
+ "items": 7310
+ },
+ "markers.viewportCompute": {
+ "count": 57,
+ "totalMs": 246.04,
+ "avgMs": 4.316,
+ "p50Ms": 3.823,
+ "p95Ms": 14.687,
+ "maxMs": 27.69,
+ "mainThreadMs": 0,
+ "backgroundMs": 246.04,
+ "items": 246328
+ },
+ "markers.applyDiff": {
+ "count": 57,
+ "totalMs": 43.11,
+ "avgMs": 0.756,
+ "p50Ms": 0.843,
+ "p95Ms": 1.611,
+ "maxMs": 2.097,
+ "mainThreadMs": 43.11,
+ "backgroundMs": 0,
+ "items": 3784
+ },
+ "annotation.viewFor": {
+ "count": 1723,
+ "totalMs": 29.31,
+ "avgMs": 0.017,
+ "p50Ms": 0.007,
+ "p95Ms": 0.036,
+ "maxMs": 5.92,
+ "mainThreadMs": 29.31,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 45,
+ "totalMs": 0.16,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.009,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.16,
+ "backgroundMs": 0,
+ "items": 1723
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 316.2,
+ "afterLoadMB": 290.3,
+ "afterInteractionMB": 438,
+ "afterCleanupMB": 291.5,
+ "peakMB": 438,
+ "loadDeltaMB": -25.9,
+ "interactionDeltaMB": 147.7,
+ "retainedAfterCleanupMB": -24.7,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 316.2,
+ "residentMB": 420.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256338,
+ "mallocMB": 130.3
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 290.3,
+ "residentMB": 446.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 343856,
+ "mallocMB": 173
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 438,
+ "residentMB": 397.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 565932,
+ "mallocMB": 239.8
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 291.5,
+ "residentMB": 376.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 249687,
+ "mallocMB": 128.1
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 702400,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 222076,
+ "mallocBytesDelta": 69975568
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2301,
+ "wallMs": 5977,
+ "percent": 38.5,
+ "threadsBefore": 22,
+ "threadsAfter": 21,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 905940
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-updates",
+ "name": "10k markers + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "1 % of 10k markers move at 5 Hz for 5 s while the camera pans slowly.",
+ "recordedAt": "2026-09-10T14:13:37.674Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 7482,
+ "load": {
+ "commitMs": 8.28,
+ "readyMs": 74,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 6.9,
+ "backgroundMs": 3.8,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.11,
+ "avgMs": 0.369,
+ "p50Ms": 0.532,
+ "p95Ms": 0.573,
+ "maxMs": 0.573,
+ "mainThreadMs": 1.11,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.273,
+ "p50Ms": 0.002,
+ "p95Ms": 0.544,
+ "maxMs": 0.544,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0,
+ "maxMs": 0,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.008,
+ "p50Ms": 0.008,
+ "p95Ms": 0.008,
+ "maxMs": 0.008,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.7,
+ "avgMs": 1.235,
+ "p50Ms": 1.144,
+ "p95Ms": 1.443,
+ "maxMs": 1.443,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.7,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.02,
+ "p50Ms": 0.02,
+ "p95Ms": 0.02,
+ "maxMs": 0.02,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.012,
+ "p50Ms": 0.012,
+ "p95Ms": 0.012,
+ "maxMs": 0.012,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.051,
+ "p50Ms": 0.051,
+ "p95Ms": 0.051,
+ "maxMs": 0.051,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.084,
+ "p50Ms": 0.084,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.15,
+ "avgMs": 0.084,
+ "p50Ms": 0.009,
+ "p95Ms": 0.015,
+ "maxMs": 4.534,
+ "mainThreadMs": 5.15,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0013843749999999932,
+ "allocatedBytes": 4454280,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 396,
+ "durationMs": 6668.9,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 58.5,
+ "p99": 58.5,
+ "worstWindow": 58.5,
+ "windows": 7
+ },
+ "frameTimeMs": {
+ "average": 16.79,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 33.33,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 393,
+ 0,
+ 0,
+ 3,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 3,
+ "jankRatio": 0.0076,
+ "droppedFrames": 3,
+ "longFrames": 0,
+ "overBudgetFrames": 3
+ },
+ "js": {
+ "lagMs": {
+ "samples": 401,
+ "p50": 0,
+ "p95": 0.47,
+ "p99": 0.58,
+ "max": 2.37
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.14,
+ "max": 19.04
+ },
+ "lateFrames": 0,
+ "busyMs": 54.2,
+ "busyRatio": 0.0081,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 6669.6,
+ "commits": {
+ "count": 25,
+ "totalMs": 326.79,
+ "avgMs": 13.072,
+ "p95Ms": 16.403,
+ "maxMs": 18.025
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 2.125,
+ "maxMs": 5.875
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 2.198,
+ "maxMs": 4.651
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 566,
+ "mainThreadMs": 84.06,
+ "backgroundMs": 42.61,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.88,
+ "avgMs": 0.376,
+ "p50Ms": 0.262,
+ "p95Ms": 0.82,
+ "maxMs": 0.82,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 17.37,
+ "avgMs": 0.695,
+ "p50Ms": 0.686,
+ "p95Ms": 0.893,
+ "maxMs": 0.966,
+ "mainThreadMs": 17.37,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 54.96,
+ "avgMs": 2.198,
+ "p50Ms": 2.027,
+ "p95Ms": 3.834,
+ "maxMs": 4.651,
+ "mainThreadMs": 54.96,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 26,
+ "totalMs": 36.56,
+ "avgMs": 1.406,
+ "p50Ms": 1.438,
+ "p95Ms": 1.865,
+ "maxMs": 2.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 36.56,
+ "items": 260000
+ },
+ "markers.candidates": {
+ "count": 89,
+ "totalMs": 1.04,
+ "avgMs": 0.012,
+ "p50Ms": 0.009,
+ "p95Ms": 0.027,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.04,
+ "items": 890000
+ },
+ "markers.viewportFilter": {
+ "count": 89,
+ "totalMs": 0.56,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.019,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.56,
+ "items": 3932
+ },
+ "markers.diff": {
+ "count": 89,
+ "totalMs": 1.17,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.023,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.17,
+ "items": 1064
+ },
+ "markers.viewportCompute": {
+ "count": 89,
+ "totalMs": 3.28,
+ "avgMs": 0.037,
+ "p50Ms": 0.032,
+ "p95Ms": 0.086,
+ "maxMs": 0.124,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.28,
+ "items": 3932
+ },
+ "markers.applyDiff": {
+ "count": 87,
+ "totalMs": 8.97,
+ "avgMs": 0.103,
+ "p50Ms": 0.022,
+ "p95Ms": 0.39,
+ "maxMs": 0.417,
+ "mainThreadMs": 8.97,
+ "backgroundMs": 0,
+ "items": 98
+ },
+ "annotation.viewFor": {
+ "count": 22,
+ "totalMs": 0.85,
+ "avgMs": 0.039,
+ "p50Ms": 0.035,
+ "p95Ms": 0.069,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.85,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 20,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.001,
+ "p95Ms": 0.003,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 22
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 290.9,
+ "afterLoadMB": 257.4,
+ "afterInteractionMB": 365.3,
+ "afterCleanupMB": 292,
+ "peakMB": 365.3,
+ "loadDeltaMB": -33.5,
+ "interactionDeltaMB": 107.9,
+ "retainedAfterCleanupMB": 1.1,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 290.9,
+ "residentMB": 370.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 239512,
+ "mallocMB": 127.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 257.4,
+ "residentMB": 364.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 313403,
+ "mallocMB": 131.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 365.3,
+ "residentMB": 374.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 402893,
+ "mallocMB": 192.4
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 292,
+ "residentMB": 374.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 241422,
+ "mallocMB": 146.4
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 46231176,
+ "gcCount": 13,
+ "gcTimeMs": 0.014198790999999988,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 89490,
+ "mallocBytesDelta": 64175488
+ }
+ },
+ "cpu": {
+ "processCpuMs": 2169,
+ "wallMs": 6677,
+ "percent": 32.5,
+ "threadsBefore": 21,
+ "threadsAfter": 20,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 26,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 260000,
+ "coordinates": 260000,
+ "estimatedBytes": 18613491
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 716252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 5479.69,
+ "commits": {
+ "count": 25,
+ "totalMs": 326.79,
+ "avgMs": 13.072,
+ "p95Ms": 16.403,
+ "maxMs": 18.025
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 25,
+ "avgMs": 2.125,
+ "maxMs": 5.875
+ },
+ "setterMs": {
+ "samples": 25,
+ "avgMs": 2.198,
+ "maxMs": 4.651
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 490,
+ "mainThreadMs": 82.6,
+ "backgroundMs": 41.62,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 1.88,
+ "avgMs": 0.376,
+ "p50Ms": 0.262,
+ "p95Ms": 0.82,
+ "maxMs": 0.82,
+ "mainThreadMs": 1.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 25,
+ "totalMs": 17.37,
+ "avgMs": 0.695,
+ "p50Ms": 0.686,
+ "p95Ms": 0.893,
+ "maxMs": 0.966,
+ "mainThreadMs": 17.37,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.set": {
+ "count": 25,
+ "totalMs": 54.96,
+ "avgMs": 2.198,
+ "p50Ms": 2.027,
+ "p95Ms": 3.834,
+ "maxMs": 4.651,
+ "mainThreadMs": 54.96,
+ "backgroundMs": 0,
+ "items": 250000
+ },
+ "markers.indexBuild": {
+ "count": 26,
+ "totalMs": 36.56,
+ "avgMs": 1.406,
+ "p50Ms": 1.438,
+ "p95Ms": 1.865,
+ "maxMs": 2.037,
+ "mainThreadMs": 0,
+ "backgroundMs": 36.56,
+ "items": 260000
+ },
+ "markers.candidates": {
+ "count": 77,
+ "totalMs": 0.86,
+ "avgMs": 0.011,
+ "p50Ms": 0.009,
+ "p95Ms": 0.027,
+ "maxMs": 0.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.86,
+ "items": 770000
+ },
+ "markers.viewportFilter": {
+ "count": 77,
+ "totalMs": 0.47,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.019,
+ "maxMs": 0.026,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.47,
+ "items": 3374
+ },
+ "markers.diff": {
+ "count": 77,
+ "totalMs": 1.02,
+ "avgMs": 0.013,
+ "p50Ms": 0.012,
+ "p95Ms": 0.023,
+ "maxMs": 0.039,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.02,
+ "items": 963
+ },
+ "markers.viewportCompute": {
+ "count": 77,
+ "totalMs": 2.72,
+ "avgMs": 0.035,
+ "p50Ms": 0.032,
+ "p95Ms": 0.068,
+ "maxMs": 0.124,
+ "mainThreadMs": 0,
+ "backgroundMs": 2.72,
+ "items": 3374
+ },
+ "markers.applyDiff": {
+ "count": 75,
+ "totalMs": 7.83,
+ "avgMs": 0.104,
+ "p50Ms": 0.001,
+ "p95Ms": 0.392,
+ "maxMs": 0.417,
+ "mainThreadMs": 7.83,
+ "backgroundMs": 0,
+ "items": 82
+ },
+ "annotation.viewFor": {
+ "count": 13,
+ "totalMs": 0.55,
+ "avgMs": 0.042,
+ "p50Ms": 0.039,
+ "p95Ms": 0.084,
+ "maxMs": 0.084,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 13,
+ "totalMs": 0.02,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 13
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 13,
+ "gcTimeMs": 0.014198790999999988,
+ "allocatedBytes": 46111992,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-polyline",
+ "name": "10k markers + 10k-point polyline",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "A 10k-point route over 10k markers: three route updates, then a pan.",
+ "recordedAt": "2026-09-10T14:13:45.975Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5237,
+ "load": {
+ "commitMs": 9.89,
+ "readyMs": 113,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 16.4,
+ "backgroundMs": 3.67,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.31,
+ "avgMs": 0.437,
+ "p50Ms": 0.536,
+ "p95Ms": 0.775,
+ "maxMs": 0.775,
+ "mainThreadMs": 1.31,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.56,
+ "avgMs": 0.279,
+ "p50Ms": 0.003,
+ "p95Ms": 0.556,
+ "maxMs": 0.556,
+ "mainThreadMs": 0.56,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.55,
+ "avgMs": 0.277,
+ "p50Ms": 0.001,
+ "p95Ms": 0.553,
+ "maxMs": 0.553,
+ "mainThreadMs": 0.55,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 3.58,
+ "avgMs": 1.194,
+ "p50Ms": 1.143,
+ "p95Ms": 1.346,
+ "maxMs": 1.346,
+ "mainThreadMs": 0,
+ "backgroundMs": 3.58,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.01,
+ "p50Ms": 0.01,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.01,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.015,
+ "p50Ms": 0.015,
+ "p95Ms": 0.015,
+ "maxMs": 0.015,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.05,
+ "avgMs": 0.046,
+ "p50Ms": 0.046,
+ "p95Ms": 0.046,
+ "maxMs": 0.046,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.05,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.085,
+ "p50Ms": 0.085,
+ "p95Ms": 0.085,
+ "maxMs": 0.085,
+ "mainThreadMs": 0.08,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 13.87,
+ "avgMs": 0.227,
+ "p50Ms": 0.01,
+ "p95Ms": 0.013,
+ "maxMs": 13.234,
+ "mainThreadMs": 13.87,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.004,
+ "p50Ms": 0.004,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.00166220899999997,
+ "allocatedBytes": 7260472,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 260,
+ "durationMs": 4423.5,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.9,
+ "p50": 59,
+ "p95": 57,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 16.99,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 33.33,
+ "worst": 45.71,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 255,
+ 1,
+ 0,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0154,
+ "droppedFrames": 5,
+ "longFrames": 0,
+ "overBudgetFrames": 5
+ },
+ "js": {
+ "lagMs": {
+ "samples": 266,
+ "p50": 0,
+ "p95": 0.53,
+ "p99": 0.73,
+ "max": 0.92
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.2,
+ "max": 17.59
+ },
+ "lateFrames": 0,
+ "busyMs": 36.9,
+ "busyRatio": 0.0083,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4424,
+ "commits": {
+ "count": 3,
+ "totalMs": 4.66,
+ "avgMs": 1.554,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.193,
+ "maxMs": 0.3
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 2.135,
+ "maxMs": 2.934
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 206,
+ "mainThreadMs": 15.55,
+ "backgroundMs": 3.21,
+ "byName": {
+ "polylines.set": {
+ "count": 3,
+ "totalMs": 6.4,
+ "avgMs": 2.135,
+ "p50Ms": 1.853,
+ "p95Ms": 2.934,
+ "maxMs": 2.934,
+ "mainThreadMs": 6.4,
+ "backgroundMs": 0,
+ "items": 30000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.19,
+ "avgMs": 0.438,
+ "p50Ms": 0.384,
+ "p95Ms": 0.761,
+ "maxMs": 0.761,
+ "mainThreadMs": 2.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 0.78,
+ "avgMs": 0.026,
+ "p50Ms": 0.011,
+ "p95Ms": 0.118,
+ "maxMs": 0.155,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.78,
+ "items": 300000
+ },
+ "markers.viewportFilter": {
+ "count": 30,
+ "totalMs": 0.26,
+ "avgMs": 0.009,
+ "p50Ms": 0.005,
+ "p95Ms": 0.026,
+ "maxMs": 0.084,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.26,
+ "items": 1196
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.43,
+ "avgMs": 0.014,
+ "p50Ms": 0.014,
+ "p95Ms": 0.02,
+ "maxMs": 0.042,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.43,
+ "items": 306
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 1.74,
+ "avgMs": 0.058,
+ "p50Ms": 0.039,
+ "p95Ms": 0.183,
+ "maxMs": 0.258,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.74,
+ "items": 1196
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 6.2,
+ "avgMs": 0.207,
+ "p50Ms": 0.221,
+ "p95Ms": 0.593,
+ "maxMs": 0.843,
+ "mainThreadMs": 6.2,
+ "backgroundMs": 0,
+ "items": 119
+ },
+ "annotation.viewFor": {
+ "count": 34,
+ "totalMs": 0.73,
+ "avgMs": 0.021,
+ "p50Ms": 0.013,
+ "p95Ms": 0.071,
+ "maxMs": 0.104,
+ "mainThreadMs": 0.73,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.03,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.03,
+ "backgroundMs": 0,
+ "items": 34
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 238.3,
+ "afterLoadMB": 288.6,
+ "afterInteractionMB": 387.4,
+ "afterCleanupMB": 307.1,
+ "peakMB": 387.4,
+ "loadDeltaMB": 50.3,
+ "interactionDeltaMB": 98.8,
+ "retainedAfterCleanupMB": 68.8,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 238.3,
+ "residentMB": 374.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 132008,
+ "mallocMB": 129.8
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 288.6,
+ "residentMB": 345.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 293859,
+ "mallocMB": 171.3
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 387.4,
+ "residentMB": 394,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 396546,
+ "mallocMB": 204.2
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 307.1,
+ "residentMB": 395.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 222969,
+ "mallocMB": 154.7
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 7121448,
+ "gcCount": 2,
+ "gcTimeMs": 0.0011925830000000248,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 102687,
+ "mallocBytesDelta": 34496784
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1179,
+ "wallMs": 4429,
+ "percent": 26.6,
+ "threadsBefore": 21,
+ "threadsAfter": 30,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polylines": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 4,
+ "coordinates": 40000,
+ "estimatedBytes": 1791427
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 10000,
+ "estimatedBytes": 447862
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 410.36,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.34,
+ "avgMs": 1.337,
+ "p95Ms": 1.337,
+ "maxMs": 1.337
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.156,
+ "maxMs": 0.156
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.853,
+ "maxMs": 1.853
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.85,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.85,
+ "avgMs": 1.853,
+ "p50Ms": 1.853,
+ "p95Ms": 1.853,
+ "maxMs": 1.853,
+ "mainThreadMs": 1.85,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0008592080000000002,
+ "allocatedBytes": 1944320,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 1,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 415.44,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.78,
+ "avgMs": 1.783,
+ "p95Ms": 1.783,
+ "maxMs": 1.783
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.3,
+ "maxMs": 0.3
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 2.934,
+ "maxMs": 2.934
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 2.93,
+ "avgMs": 2.934,
+ "p50Ms": 2.934,
+ "p95Ms": 2.934,
+ "maxMs": 2.934,
+ "mainThreadMs": 2.93,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0003333750000000246,
+ "allocatedBytes": 1943376,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 2,
+ "label": "route-update",
+ "meta": {},
+ "wallMs": 416.9,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.54,
+ "avgMs": 1.542,
+ "p95Ms": 1.542,
+ "maxMs": 1.542
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.123,
+ "maxMs": 0.123
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 1.617,
+ "maxMs": 1.617
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "byName": {
+ "polylines.set": {
+ "count": 1,
+ "totalMs": 1.62,
+ "avgMs": 1.617,
+ "p50Ms": 1.617,
+ "p95Ms": 1.617,
+ "maxMs": 1.617,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 10000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 1944240,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-10k-polygon",
+ "name": "10k markers + 200 polygons",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "200 polygons over 10k markers: three restyles, then a pan.",
+ "recordedAt": "2026-09-10T14:13:54.275Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 5240,
+ "load": {
+ "commitMs": 13.21,
+ "readyMs": 99,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 82,
+ "mainThreadMs": 24.93,
+ "backgroundMs": 5.51,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.21,
+ "avgMs": 0.405,
+ "p50Ms": 0.592,
+ "p95Ms": 0.622,
+ "maxMs": 0.622,
+ "mainThreadMs": 1.21,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.64,
+ "avgMs": 0.319,
+ "p50Ms": 0.003,
+ "p95Ms": 0.635,
+ "maxMs": 0.635,
+ "mainThreadMs": 0.64,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 17.63,
+ "avgMs": 8.816,
+ "p50Ms": 0,
+ "p95Ms": 17.631,
+ "maxMs": 17.631,
+ "mainThreadMs": 17.63,
+ "backgroundMs": 0,
+ "items": 4000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.005,
+ "p50Ms": 0.001,
+ "p95Ms": 0.01,
+ "maxMs": 0.01,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 3,
+ "totalMs": 5.37,
+ "avgMs": 1.789,
+ "p50Ms": 1.936,
+ "p95Ms": 1.975,
+ "maxMs": 1.975,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.37,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.viewportFilter": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.016,
+ "p50Ms": 0.016,
+ "p95Ms": 0.016,
+ "maxMs": 0.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.021,
+ "p50Ms": 0.021,
+ "p95Ms": 0.021,
+ "maxMs": 0.021,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 61
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.08,
+ "avgMs": 0.079,
+ "p50Ms": 0.079,
+ "p95Ms": 0.079,
+ "maxMs": 0.079,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.08,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.11,
+ "avgMs": 0.109,
+ "p50Ms": 0.109,
+ "p95Ms": 0.109,
+ "maxMs": 0.109,
+ "mainThreadMs": 0.11,
+ "backgroundMs": 0,
+ "items": 61
+ },
+ "annotation.viewFor": {
+ "count": 61,
+ "totalMs": 5.31,
+ "avgMs": 0.087,
+ "p50Ms": 0.01,
+ "p95Ms": 0.014,
+ "maxMs": 4.664,
+ "mainThreadMs": 5.31,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.005,
+ "p50Ms": 0.005,
+ "p95Ms": 0.005,
+ "maxMs": 0.005,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 61
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.0036939590000000244,
+ "allocatedBytes": 5389904,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 256,
+ "durationMs": 4427.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58,
+ "p50": 60,
+ "p95": 53,
+ "p99": 53,
+ "worstWindow": 53,
+ "windows": 5
+ },
+ "frameTimeMs": {
+ "average": 17.25,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 42.76,
+ "worst": 61.24,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 248,
+ 4,
+ 0,
+ 3,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 4,
+ "jankRatio": 0.0156,
+ "droppedFrames": 9,
+ "longFrames": 1,
+ "overBudgetFrames": 8
+ },
+ "js": {
+ "lagMs": {
+ "samples": 266,
+ "p50": 0,
+ "p95": 0.56,
+ "p99": 0.7,
+ "max": 0.9
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.23,
+ "max": 17.57
+ },
+ "lateFrames": 0,
+ "busyMs": 37.8,
+ "busyRatio": 0.0085,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 4427.9,
+ "commits": {
+ "count": 3,
+ "totalMs": 8.82,
+ "avgMs": 2.94,
+ "p95Ms": 4.246,
+ "maxMs": 4.246
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 3,
+ "avgMs": 0.687,
+ "maxMs": 1.215
+ },
+ "setterMs": {
+ "samples": 3,
+ "avgMs": 43.293,
+ "maxMs": 55.24
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 206,
+ "mainThreadMs": 137.57,
+ "backgroundMs": 2.49,
+ "byName": {
+ "polygons.set": {
+ "count": 3,
+ "totalMs": 129.88,
+ "avgMs": 43.293,
+ "p50Ms": 37.883,
+ "p95Ms": 55.24,
+ "maxMs": 55.24,
+ "mainThreadMs": 129.88,
+ "backgroundMs": 0,
+ "items": 12000
+ },
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.02,
+ "avgMs": 0.403,
+ "p50Ms": 0.276,
+ "p95Ms": 0.808,
+ "maxMs": 0.808,
+ "mainThreadMs": 2.02,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 30,
+ "totalMs": 0.52,
+ "avgMs": 0.017,
+ "p50Ms": 0.009,
+ "p95Ms": 0.097,
+ "maxMs": 0.114,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.52,
+ "items": 300000
+ },
+ "markers.viewportFilter": {
+ "count": 30,
+ "totalMs": 0.17,
+ "avgMs": 0.006,
+ "p50Ms": 0.005,
+ "p95Ms": 0.017,
+ "maxMs": 0.023,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.17,
+ "items": 1196
+ },
+ "markers.diff": {
+ "count": 30,
+ "totalMs": 0.41,
+ "avgMs": 0.014,
+ "p50Ms": 0.013,
+ "p95Ms": 0.025,
+ "maxMs": 0.029,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.41,
+ "items": 312
+ },
+ "markers.viewportCompute": {
+ "count": 30,
+ "totalMs": 1.38,
+ "avgMs": 0.046,
+ "p50Ms": 0.032,
+ "p95Ms": 0.112,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.38,
+ "items": 1196
+ },
+ "markers.applyDiff": {
+ "count": 30,
+ "totalMs": 4.96,
+ "avgMs": 0.165,
+ "p50Ms": 0.198,
+ "p95Ms": 0.371,
+ "maxMs": 0.505,
+ "mainThreadMs": 4.96,
+ "backgroundMs": 0,
+ "items": 119
+ },
+ "annotation.viewFor": {
+ "count": 34,
+ "totalMs": 0.68,
+ "avgMs": 0.02,
+ "p50Ms": 0.014,
+ "p95Ms": 0.05,
+ "maxMs": 0.075,
+ "mainThreadMs": 0.68,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 14,
+ "totalMs": 0.02,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.004,
+ "mainThreadMs": 0.02,
+ "backgroundMs": 0,
+ "items": 34
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 307.5,
+ "afterLoadMB": 323.2,
+ "afterInteractionMB": 452.2,
+ "afterCleanupMB": 366.7,
+ "peakMB": 452.2,
+ "loadDeltaMB": 15.7,
+ "interactionDeltaMB": 129,
+ "retainedAfterCleanupMB": 59.2,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 307.5,
+ "residentMB": 397.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 220911,
+ "mallocMB": 154.7
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 323.2,
+ "residentMB": 387.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 322963,
+ "mallocMB": 179.1
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 452.2,
+ "residentMB": 408.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 428387,
+ "mallocMB": 218.3
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 366.7,
+ "residentMB": 412,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 225027,
+ "mallocMB": 164.3
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 1948088,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 105424,
+ "mallocBytesDelta": 41158848
+ }
+ },
+ "cpu": {
+ "processCpuMs": 1296,
+ "wallMs": 4443,
+ "percent": 29.2,
+ "threadsBefore": 26,
+ "threadsAfter": 23,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 1,
+ "polygons": 4,
+ "region": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 800,
+ "coordinates": 16000,
+ "estimatedBytes": 787972
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 715940
+ },
+ "polygons": {
+ "items": 200,
+ "coordinates": 4000,
+ "estimatedBytes": 196993
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 418.81,
+ "commits": {
+ "count": 1,
+ "totalMs": 4.25,
+ "avgMs": 4.246,
+ "p95Ms": 4.246,
+ "maxMs": 4.246
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 1.215,
+ "maxMs": 1.215
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 55.24,
+ "maxMs": 55.24
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 55.24,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 55.24,
+ "avgMs": 55.24,
+ "p50Ms": 55.24,
+ "p95Ms": 55.24,
+ "maxMs": 55.24,
+ "mainThreadMs": 55.24,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 365256,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 1,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 415.35,
+ "commits": {
+ "count": 1,
+ "totalMs": 2.79,
+ "avgMs": 2.789,
+ "p95Ms": 2.789,
+ "maxMs": 2.789
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.563,
+ "maxMs": 0.563
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 36.756,
+ "maxMs": 36.756
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 36.76,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 36.76,
+ "avgMs": 36.756,
+ "p50Ms": 36.756,
+ "p95Ms": 36.756,
+ "maxMs": 36.756,
+ "mainThreadMs": 36.76,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 363656,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ {
+ "index": 2,
+ "label": "restyle-all",
+ "meta": {},
+ "wallMs": 416.31,
+ "commits": {
+ "count": 1,
+ "totalMs": 1.79,
+ "avgMs": 1.786,
+ "p95Ms": 1.786,
+ "maxMs": 1.786
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 1,
+ "avgMs": 0.281,
+ "maxMs": 0.281
+ },
+ "setterMs": {
+ "samples": 1,
+ "avgMs": 37.883,
+ "maxMs": 37.883
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1,
+ "mainThreadMs": 37.88,
+ "backgroundMs": 0,
+ "byName": {
+ "polygons.set": {
+ "count": 1,
+ "totalMs": 37.88,
+ "avgMs": 37.883,
+ "p50Ms": 37.883,
+ "p95Ms": 37.883,
+ "maxMs": 37.883,
+ "mainThreadMs": 37.88,
+ "backgroundMs": 0,
+ "items": 4000
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 0,
+ "gcTimeMs": 0,
+ "allocatedBytes": 364464,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "combined-all",
+ "name": "Markers + clustering + geometry + camera + updates",
+ "group": "combined",
+ "tags": [
+ "baseline"
+ ],
+ "description": "10k clustered markers, a 5k-point route and 100 polygons; zoom sweep, pan, and 100 moving markers at 5 Hz.",
+ "recordedAt": "2026-09-10T14:14:06.642Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 8776,
+ "load": {
+ "commitMs": 10.59,
+ "readyMs": 143,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 48,
+ "mainThreadMs": 13.5,
+ "backgroundMs": 101.47,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.29,
+ "avgMs": 0.431,
+ "p50Ms": 0.622,
+ "p95Ms": 0.671,
+ "maxMs": 0.671,
+ "mainThreadMs": 1.29,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.65,
+ "avgMs": 0.324,
+ "p50Ms": 0.003,
+ "p95Ms": 0.644,
+ "maxMs": 0.644,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0.6,
+ "avgMs": 0.3,
+ "p50Ms": 0.001,
+ "p95Ms": 0.599,
+ "maxMs": 0.599,
+ "mainThreadMs": 0.6,
+ "backgroundMs": 0,
+ "items": 5000
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 7.32,
+ "avgMs": 3.658,
+ "p50Ms": 0,
+ "p95Ms": 7.316,
+ "maxMs": 7.316,
+ "mainThreadMs": 7.32,
+ "backgroundMs": 0,
+ "items": 2000
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0.01,
+ "avgMs": 0.003,
+ "p50Ms": 0.001,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.011,
+ "p50Ms": 0.011,
+ "p95Ms": 0.011,
+ "maxMs": 0.011,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 6.81,
+ "avgMs": 1.702,
+ "p50Ms": 2.007,
+ "p95Ms": 2.49,
+ "maxMs": 2.49,
+ "mainThreadMs": 0,
+ "backgroundMs": 6.81,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 4.86,
+ "avgMs": 4.861,
+ "p50Ms": 4.861,
+ "p95Ms": 4.861,
+ "maxMs": 4.861,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.86,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 41.44,
+ "avgMs": 41.44,
+ "p50Ms": 41.44,
+ "p95Ms": 41.44,
+ "maxMs": 41.44,
+ "mainThreadMs": 0,
+ "backgroundMs": 41.44,
+ "items": 10000
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 1.02,
+ "avgMs": 1.016,
+ "p50Ms": 1.016,
+ "p95Ms": 1.016,
+ "maxMs": 1.016,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.02,
+ "items": 26
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 47.34,
+ "avgMs": 47.343,
+ "p50Ms": 47.343,
+ "p95Ms": 47.343,
+ "maxMs": 47.343,
+ "mainThreadMs": 0,
+ "backgroundMs": 47.34,
+ "items": 10000
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.13,
+ "avgMs": 0.128,
+ "p50Ms": 0.128,
+ "p95Ms": 0.128,
+ "maxMs": 0.128,
+ "mainThreadMs": 0.13,
+ "backgroundMs": 0,
+ "items": 26
+ },
+ "annotation.viewFor": {
+ "count": 26,
+ "totalMs": 3.5,
+ "avgMs": 0.135,
+ "p50Ms": 0.049,
+ "p95Ms": 0.361,
+ "maxMs": 1.534,
+ "mainThreadMs": 3.5,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0,
+ "avgMs": 0.003,
+ "p50Ms": 0.003,
+ "p95Ms": 0.003,
+ "maxMs": 0.003,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 26
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 2,
+ "gcTimeMs": 0.005501666000000016,
+ "allocatedBytes": 6471704,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 468,
+ "durationMs": 7962.5,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 58.9,
+ "p50": 60,
+ "p95": 54,
+ "p99": 54,
+ "worstWindow": 54,
+ "windows": 8
+ },
+ "frameTimeMs": {
+ "average": 16.99,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 35.09,
+ "worst": 39.75,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 459,
+ 0,
+ 2,
+ 7,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 9,
+ "jankRatio": 0.0192,
+ "droppedFrames": 9,
+ "longFrames": 0,
+ "overBudgetFrames": 9
+ },
+ "js": {
+ "lagMs": {
+ "samples": 478,
+ "p50": 0.01,
+ "p95": 0.53,
+ "p99": 0.65,
+ "max": 5.49
+ },
+ "frameGapMs": {
+ "p50": 16.68,
+ "p95": 17.19,
+ "max": 22.16
+ },
+ "lateFrames": 0,
+ "busyMs": 79.5,
+ "busyRatio": 0.01,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 7963,
+ "commits": {
+ "count": 20,
+ "totalMs": 265.28,
+ "avgMs": 13.264,
+ "p95Ms": 16.406,
+ "maxMs": 16.856
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 2.039,
+ "maxMs": 5.841
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 2.105,
+ "maxMs": 3.132
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 1719,
+ "mainThreadMs": 102.75,
+ "backgroundMs": 212.57,
+ "byName": {
+ "camera.apply": {
+ "count": 8,
+ "totalMs": 3.46,
+ "avgMs": 0.433,
+ "p50Ms": 0.395,
+ "p95Ms": 0.583,
+ "maxMs": 0.583,
+ "mainThreadMs": 3.46,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 97,
+ "totalMs": 12.06,
+ "avgMs": 0.124,
+ "p50Ms": 0.01,
+ "p95Ms": 0.995,
+ "maxMs": 2.718,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.06,
+ "items": 970000
+ },
+ "markers.cluster": {
+ "count": 97,
+ "totalMs": 73.51,
+ "avgMs": 0.758,
+ "p50Ms": 0.1,
+ "p95Ms": 5.304,
+ "maxMs": 19.245,
+ "mainThreadMs": 0,
+ "backgroundMs": 73.51,
+ "items": 64564
+ },
+ "markers.diff": {
+ "count": 97,
+ "totalMs": 5.37,
+ "avgMs": 0.055,
+ "p50Ms": 0.018,
+ "p95Ms": 0.466,
+ "maxMs": 0.746,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.37,
+ "items": 4047
+ },
+ "markers.viewportCompute": {
+ "count": 97,
+ "totalMs": 91.83,
+ "avgMs": 0.947,
+ "p50Ms": 0.136,
+ "p95Ms": 6.569,
+ "maxMs": 21.594,
+ "mainThreadMs": 0,
+ "backgroundMs": 91.83,
+ "items": 64564
+ },
+ "markers.applyDiff": {
+ "count": 97,
+ "totalMs": 20.6,
+ "avgMs": 0.212,
+ "p50Ms": 0.001,
+ "p95Ms": 1.267,
+ "maxMs": 1.821,
+ "mainThreadMs": 20.6,
+ "backgroundMs": 0,
+ "items": 2362
+ },
+ "annotation.viewFor": {
+ "count": 1106,
+ "totalMs": 21.86,
+ "avgMs": 0.02,
+ "p50Ms": 0.011,
+ "p95Ms": 0.044,
+ "maxMs": 4.629,
+ "mainThreadMs": 21.86,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 60,
+ "totalMs": 0.15,
+ "avgMs": 0.003,
+ "p50Ms": 0.002,
+ "p95Ms": 0.007,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.15,
+ "backgroundMs": 0,
+ "items": 1106
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 14.58,
+ "avgMs": 0.729,
+ "p50Ms": 0.718,
+ "p95Ms": 0.906,
+ "maxMs": 0.921,
+ "mainThreadMs": 14.58,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 42.1,
+ "avgMs": 2.105,
+ "p50Ms": 1.978,
+ "p95Ms": 3.078,
+ "maxMs": 3.132,
+ "mainThreadMs": 42.1,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 29.8,
+ "avgMs": 1.49,
+ "p50Ms": 1.476,
+ "p95Ms": 1.901,
+ "maxMs": 1.964,
+ "mainThreadMs": 0,
+ "backgroundMs": 29.8,
+ "items": 200000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 367.4,
+ "afterLoadMB": 338,
+ "afterInteractionMB": 496.9,
+ "afterCleanupMB": 347.8,
+ "peakMB": 496.9,
+ "loadDeltaMB": -29.4,
+ "interactionDeltaMB": 158.9,
+ "retainedAfterCleanupMB": -19.6,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 367.4,
+ "residentMB": 412.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 225619,
+ "mallocMB": 164.4
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 338,
+ "residentMB": 403.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 365362,
+ "mallocMB": 205.2
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 496.9,
+ "residentMB": 507.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 657311,
+ "mallocMB": 266.5
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 347.8,
+ "residentMB": 509.5,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 256691,
+ "mallocMB": 135.9
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 37461656,
+ "gcCount": 10,
+ "gcTimeMs": 0.015770167999999973,
+ "heapSizeAfterMB": 44
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 291949,
+ "mallocBytesDelta": 64286896
+ }
+ },
+ "cpu": {
+ "processCpuMs": 3276,
+ "wallMs": 7967,
+ "percent": 41.1,
+ "threadsBefore": 23,
+ "threadsAfter": 23,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 21,
+ "polylines": 1,
+ "polygons": 1,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 210000,
+ "coordinates": 210000,
+ "estimatedBytes": 19031295
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 907033
+ },
+ "polylines": {
+ "items": 1,
+ "coordinates": 5000,
+ "estimatedBytes": 223992
+ },
+ "polygons": {
+ "items": 100,
+ "coordinates": 2000,
+ "estimatedBytes": 98424
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [
+ {
+ "index": 0,
+ "label": "updates-while-panning",
+ "meta": {},
+ "wallMs": 4377.79,
+ "commits": {
+ "count": 20,
+ "totalMs": 265.28,
+ "avgMs": 13.264,
+ "p95Ms": 16.406,
+ "maxMs": 16.856
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 20,
+ "avgMs": 2.039,
+ "maxMs": 5.841
+ },
+ "setterMs": {
+ "samples": 20,
+ "avgMs": 2.105,
+ "maxMs": 3.132
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 584,
+ "mainThreadMs": 64.21,
+ "backgroundMs": 44.32,
+ "byName": {
+ "camera.apply": {
+ "count": 5,
+ "totalMs": 2.13,
+ "avgMs": 0.427,
+ "p50Ms": 0.395,
+ "p95Ms": 0.583,
+ "maxMs": 0.583,
+ "mainThreadMs": 2.13,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.fingerprint": {
+ "count": 20,
+ "totalMs": 14.58,
+ "avgMs": 0.729,
+ "p50Ms": 0.718,
+ "p95Ms": 0.906,
+ "maxMs": 0.921,
+ "mainThreadMs": 14.58,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.set": {
+ "count": 20,
+ "totalMs": 42.1,
+ "avgMs": 2.105,
+ "p50Ms": 1.978,
+ "p95Ms": 3.078,
+ "maxMs": 3.132,
+ "mainThreadMs": 42.1,
+ "backgroundMs": 0,
+ "items": 200000
+ },
+ "markers.indexBuild": {
+ "count": 20,
+ "totalMs": 29.8,
+ "avgMs": 1.49,
+ "p50Ms": 1.476,
+ "p95Ms": 1.901,
+ "maxMs": 1.964,
+ "mainThreadMs": 0,
+ "backgroundMs": 29.8,
+ "items": 200000
+ },
+ "markers.candidates": {
+ "count": 62,
+ "totalMs": 0.54,
+ "avgMs": 0.009,
+ "p50Ms": 0.008,
+ "p95Ms": 0.017,
+ "maxMs": 0.025,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.54,
+ "items": 620000
+ },
+ "markers.cluster": {
+ "count": 62,
+ "totalMs": 5.44,
+ "avgMs": 0.088,
+ "p50Ms": 0.086,
+ "p95Ms": 0.153,
+ "maxMs": 0.21,
+ "mainThreadMs": 0,
+ "backgroundMs": 5.44,
+ "items": 2016
+ },
+ "markers.diff": {
+ "count": 62,
+ "totalMs": 1.09,
+ "avgMs": 0.018,
+ "p50Ms": 0.016,
+ "p95Ms": 0.038,
+ "maxMs": 0.048,
+ "mainThreadMs": 0,
+ "backgroundMs": 1.09,
+ "items": 1906
+ },
+ "markers.viewportCompute": {
+ "count": 62,
+ "totalMs": 7.45,
+ "avgMs": 0.12,
+ "p50Ms": 0.116,
+ "p95Ms": 0.186,
+ "maxMs": 0.285,
+ "mainThreadMs": 0,
+ "backgroundMs": 7.45,
+ "items": 2016
+ },
+ "markers.applyDiff": {
+ "count": 62,
+ "totalMs": 2.67,
+ "avgMs": 0.043,
+ "p50Ms": 0.001,
+ "p95Ms": 0.239,
+ "maxMs": 0.48,
+ "mainThreadMs": 2.67,
+ "backgroundMs": 0,
+ "items": 425
+ },
+ "annotation.viewFor": {
+ "count": 175,
+ "totalMs": 2.66,
+ "avgMs": 0.015,
+ "p50Ms": 0.009,
+ "p95Ms": 0.049,
+ "maxMs": 0.103,
+ "mainThreadMs": 2.66,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 34,
+ "totalMs": 0.07,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.005,
+ "mainThreadMs": 0.07,
+ "backgroundMs": 0,
+ "items": 175
+ }
+ }
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 10,
+ "gcTimeMs": 0.015770167999999973,
+ "allocatedBytes": 37034872,
+ "heapSizeAfterBytes": 46137344
+ }
+ }
+ ],
+ "timeline": [],
+ "metrics": {},
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ },
+ {
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "stability-5m",
+ "name": "Stability, 5 minutes",
+ "group": "stability",
+ "tags": [
+ "long",
+ "baseline"
+ ],
+ "description": "5 minutes of pan legs, zoom sweeps and 1 % marker updates over 10k clustered markers, with a timeline checkpoint (frames, memory, CPU, GC) every minute. The question: does performance degrade over time?",
+ "recordedAt": "2026-09-10T14:19:12.541Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 302376,
+ "load": {
+ "commitMs": 9.96,
+ "readyMs": 83,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 84,
+ "mainThreadMs": 8.67,
+ "backgroundMs": 4.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.62,
+ "avgMs": 0.54,
+ "p50Ms": 0.634,
+ "p95Ms": 0.985,
+ "maxMs": 0.985,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.65,
+ "avgMs": 0.326,
+ "p50Ms": 0.002,
+ "p95Ms": 0.649,
+ "maxMs": 0.649,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 4.23,
+ "avgMs": 1.058,
+ "p50Ms": 1.384,
+ "p95Ms": 1.415,
+ "maxMs": 1.415,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.23,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.148,
+ "p50Ms": 0.148,
+ "p95Ms": 0.148,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 62
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.204,
+ "p50Ms": 0.204,
+ "p95Ms": 0.204,
+ "maxMs": 0.204,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.166,
+ "p50Ms": 0.166,
+ "p95Ms": 0.166,
+ "maxMs": 0.166,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 62
+ },
+ "annotation.viewFor": {
+ "count": 62,
+ "totalMs": 6.22,
+ "avgMs": 0.1,
+ "p50Ms": 0.013,
+ "p95Ms": 0.05,
+ "maxMs": 4.791,
+ "mainThreadMs": 6.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 62
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0010725409999999824,
+ "allocatedBytes": 4458672,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 17929,
+ "durationMs": 301356.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 57,
+ "p99": 56,
+ "worstWindow": 55,
+ "windows": 301
+ },
+ "frameTimeMs": {
+ "average": 16.81,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 60.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 17781,
+ 4,
+ 23,
+ 119,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 144,
+ "jankRatio": 0.008,
+ "droppedFrames": 150,
+ "longFrames": 2,
+ "overBudgetFrames": 148
+ },
+ "js": {
+ "lagMs": {
+ "samples": 18090,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.6,
+ "max": 11.58
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 28.25
+ },
+ "lateFrames": 1,
+ "busyMs": 2514.3,
+ "busyRatio": 0.0083,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 301494.9,
+ "commits": {
+ "count": 53,
+ "totalMs": 700.24,
+ "avgMs": 13.212,
+ "p95Ms": 17.212,
+ "maxMs": 17.478
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 53,
+ "avgMs": 1.588,
+ "maxMs": 5.695
+ },
+ "setterMs": {
+ "samples": 53,
+ "avgMs": 3.086,
+ "maxMs": 7.878
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 35259,
+ "mainThreadMs": 1139.86,
+ "backgroundMs": 1100.83,
+ "byName": {
+ "camera.apply": {
+ "count": 424,
+ "totalMs": 206.69,
+ "avgMs": 0.487,
+ "p50Ms": 0.473,
+ "p95Ms": 0.843,
+ "maxMs": 1.208,
+ "mainThreadMs": 206.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2756,
+ "totalMs": 55.77,
+ "avgMs": 0.02,
+ "p50Ms": 0.011,
+ "p95Ms": 0.052,
+ "maxMs": 1.589,
+ "mainThreadMs": 0,
+ "backgroundMs": 55.77,
+ "items": 27560000
+ },
+ "markers.cluster": {
+ "count": 2756,
+ "totalMs": 377.36,
+ "avgMs": 0.137,
+ "p50Ms": 0.101,
+ "p95Ms": 0.306,
+ "maxMs": 4.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 377.36,
+ "items": 162172
+ },
+ "markers.diff": {
+ "count": 2756,
+ "totalMs": 65.91,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.049,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 65.91,
+ "items": 135282
+ },
+ "markers.viewportCompute": {
+ "count": 2756,
+ "totalMs": 528.89,
+ "avgMs": 0.192,
+ "p50Ms": 0.143,
+ "p95Ms": 0.432,
+ "maxMs": 4.86,
+ "mainThreadMs": 0,
+ "backgroundMs": 528.89,
+ "items": 162172
+ },
+ "markers.applyDiff": {
+ "count": 2756,
+ "totalMs": 498.27,
+ "avgMs": 0.181,
+ "p50Ms": 0.001,
+ "p95Ms": 0.724,
+ "maxMs": 3.087,
+ "mainThreadMs": 498.27,
+ "backgroundMs": 0,
+ "items": 35062
+ },
+ "annotation.viewFor": {
+ "count": 18411,
+ "totalMs": 229.96,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.047,
+ "maxMs": 0.216,
+ "mainThreadMs": 229.96,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 2485,
+ "totalMs": 5.59,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.026,
+ "mainThreadMs": 5.59,
+ "backgroundMs": 0,
+ "items": 18411
+ },
+ "markers.fingerprint": {
+ "count": 53,
+ "totalMs": 35.8,
+ "avgMs": 0.675,
+ "p50Ms": 0.631,
+ "p95Ms": 0.93,
+ "maxMs": 1.096,
+ "mainThreadMs": 35.8,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.set": {
+ "count": 53,
+ "totalMs": 163.56,
+ "avgMs": 3.086,
+ "p50Ms": 2.636,
+ "p95Ms": 5.593,
+ "maxMs": 7.878,
+ "mainThreadMs": 163.56,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.indexBuild": {
+ "count": 53,
+ "totalMs": 72.91,
+ "avgMs": 1.376,
+ "p50Ms": 1.313,
+ "p95Ms": 1.853,
+ "maxMs": 2.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 72.91,
+ "items": 530000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 347.8,
+ "afterLoadMB": 278,
+ "afterInteractionMB": 389.5,
+ "afterCleanupMB": 212.9,
+ "peakMB": 481.4,
+ "loadDeltaMB": -69.8,
+ "interactionDeltaMB": 111.5,
+ "retainedAfterCleanupMB": -134.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 347.8,
+ "residentMB": 510.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 257251,
+ "mallocMB": 136.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 278,
+ "residentMB": 495.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 328385,
+ "mallocMB": 162.9
+ },
+ {
+ "label": "checkpoint:minute-1",
+ "footprintMB": 420.4,
+ "residentMB": 433.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544486,
+ "mallocMB": 229.5
+ },
+ {
+ "label": "checkpoint:minute-2",
+ "footprintMB": 440.8,
+ "residentMB": 432.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544773,
+ "mallocMB": 249
+ },
+ {
+ "label": "checkpoint:minute-3",
+ "footprintMB": 459.8,
+ "residentMB": 434.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 539189,
+ "mallocMB": 268
+ },
+ {
+ "label": "checkpoint:minute-4",
+ "footprintMB": 481.4,
+ "residentMB": 427.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 541098,
+ "mallocMB": 288.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 389.5,
+ "residentMB": 412.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 537554,
+ "mallocMB": 199.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 212.9,
+ "residentMB": 399.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 127282,
+ "mallocMB": 108
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 117721392,
+ "gcCount": 31,
+ "gcTimeMs": 0.05741245900000003,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 209169,
+ "mallocBytesDelta": 38600816
+ }
+ },
+ "cpu": {
+ "processCpuMs": 84145,
+ "wallMs": 301531,
+ "percent": 27.9,
+ "threadsBefore": 23,
+ "threadsAfter": 16,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 54,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 540000,
+ "coordinates": 540000,
+ "estimatedBytes": 48912139
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 906252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [
+ {
+ "index": 0,
+ "label": "minute-1",
+ "atMs": 62600,
+ "frames": {
+ "frames": 3707,
+ "durationMs": 62575.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 60,
+ "p95": 56,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.88,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 28.92,
+ "worst": 52.06,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3661,
+ 2,
+ 7,
+ 36,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 44,
+ "jankRatio": 0.0119,
+ "droppedFrames": 47,
+ "longFrames": 1,
+ "overBudgetFrames": 46
+ },
+ "memory": {
+ "label": "minute-1",
+ "footprintMB": 420.4,
+ "residentMB": 433.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544486,
+ "mallocMB": 229.5
+ },
+ "cpuPercent": 28.4,
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.007919792000000037,
+ "allocatedBytes": 23189528,
+ "heapSizeAfterBytes": 46137344
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7432,
+ "mainThreadMs": 244.67,
+ "backgroundMs": 231.6,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 42.3,
+ "avgMs": 0.481,
+ "p50Ms": 0.463,
+ "p95Ms": 0.853,
+ "maxMs": 1.028,
+ "mainThreadMs": 42.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 10.54,
+ "avgMs": 0.018,
+ "p50Ms": 0.011,
+ "p95Ms": 0.047,
+ "maxMs": 0.507,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.54,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 80.64,
+ "avgMs": 0.141,
+ "p50Ms": 0.104,
+ "p95Ms": 0.309,
+ "maxMs": 4.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 80.64,
+ "items": 33706
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.38,
+ "avgMs": 0.023,
+ "p50Ms": 0.02,
+ "p95Ms": 0.048,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.38,
+ "items": 28092
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 110.77,
+ "avgMs": 0.194,
+ "p50Ms": 0.146,
+ "p95Ms": 0.421,
+ "maxMs": 4.86,
+ "mainThreadMs": 0,
+ "backgroundMs": 110.77,
+ "items": 33706
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 110.15,
+ "avgMs": 0.193,
+ "p50Ms": 0.001,
+ "p95Ms": 0.77,
+ "maxMs": 1.778,
+ "mainThreadMs": 110.15,
+ "backgroundMs": 0,
+ "items": 7492
+ },
+ "annotation.viewFor": {
+ "count": 3910,
+ "totalMs": 50.3,
+ "avgMs": 0.013,
+ "p50Ms": 0.006,
+ "p95Ms": 0.048,
+ "maxMs": 0.216,
+ "mainThreadMs": 50.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 541,
+ "totalMs": 1.24,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.015,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0,
+ "items": 3910
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 8.2,
+ "avgMs": 0.746,
+ "p50Ms": 0.769,
+ "p95Ms": 1.096,
+ "maxMs": 1.096,
+ "mainThreadMs": 8.2,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 32.47,
+ "avgMs": 2.952,
+ "p50Ms": 2.542,
+ "p95Ms": 5.614,
+ "maxMs": 5.614,
+ "mainThreadMs": 32.47,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 16.26,
+ "avgMs": 1.479,
+ "p50Ms": 1.41,
+ "p95Ms": 2.16,
+ "maxMs": 2.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.26,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 1,
+ "label": "minute-2",
+ "atMs": 125163,
+ "frames": {
+ "frames": 3727,
+ "durationMs": 62534,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.6,
+ "p50": 60,
+ "p95": 58,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.78,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 39.59,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3702,
+ 0,
+ 3,
+ 22,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 25,
+ "jankRatio": 0.0067,
+ "droppedFrames": 25,
+ "longFrames": 0,
+ "overBudgetFrames": 25
+ },
+ "memory": {
+ "label": "minute-2",
+ "footprintMB": 440.8,
+ "residentMB": 432.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544773,
+ "mallocMB": 249
+ },
+ "cpuPercent": 27.8,
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.009615457999999966,
+ "allocatedBytes": 24225880,
+ "heapSizeAfterBytes": 46137344
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7371,
+ "mainThreadMs": 242.82,
+ "backgroundMs": 229.63,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 44.22,
+ "avgMs": 0.503,
+ "p50Ms": 0.507,
+ "p95Ms": 0.748,
+ "maxMs": 0.902,
+ "mainThreadMs": 44.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 13.23,
+ "avgMs": 0.023,
+ "p50Ms": 0.01,
+ "p95Ms": 0.063,
+ "maxMs": 1.589,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.23,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 77.08,
+ "avgMs": 0.135,
+ "p50Ms": 0.102,
+ "p95Ms": 0.291,
+ "maxMs": 1.249,
+ "mainThreadMs": 0,
+ "backgroundMs": 77.08,
+ "items": 33638
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.69,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.048,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.69,
+ "items": 28015
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 110.75,
+ "avgMs": 0.194,
+ "p50Ms": 0.144,
+ "p95Ms": 0.439,
+ "maxMs": 1.994,
+ "mainThreadMs": 0,
+ "backgroundMs": 110.75,
+ "items": 33638
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 105.29,
+ "avgMs": 0.184,
+ "p50Ms": 0.001,
+ "p95Ms": 0.714,
+ "maxMs": 1.656,
+ "mainThreadMs": 105.29,
+ "backgroundMs": 0,
+ "items": 7374
+ },
+ "annotation.viewFor": {
+ "count": 3855,
+ "totalMs": 47.99,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.046,
+ "maxMs": 0.18,
+ "mainThreadMs": 47.99,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 535,
+ "totalMs": 1.17,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.01,
+ "mainThreadMs": 1.17,
+ "backgroundMs": 0,
+ "items": 3855
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 6.73,
+ "avgMs": 0.612,
+ "p50Ms": 0.59,
+ "p95Ms": 0.787,
+ "maxMs": 0.787,
+ "mainThreadMs": 6.73,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 37.42,
+ "avgMs": 3.402,
+ "p50Ms": 2.267,
+ "p95Ms": 7.878,
+ "maxMs": 7.878,
+ "mainThreadMs": 37.42,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 14.87,
+ "avgMs": 1.352,
+ "p50Ms": 1.313,
+ "p95Ms": 1.853,
+ "maxMs": 1.853,
+ "mainThreadMs": 0,
+ "backgroundMs": 14.87,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 2,
+ "label": "minute-3",
+ "atMs": 187719,
+ "frames": {
+ "frames": 3729,
+ "durationMs": 62524.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.6,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.76,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 38.17,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3707,
+ 0,
+ 4,
+ 18,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 22,
+ "jankRatio": 0.0059,
+ "droppedFrames": 22,
+ "longFrames": 0,
+ "overBudgetFrames": 22
+ },
+ "memory": {
+ "label": "minute-3",
+ "footprintMB": 459.8,
+ "residentMB": 434.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 539189,
+ "mallocMB": 268
+ },
+ "cpuPercent": 27.9,
+ "hermes": {
+ "available": true,
+ "gcCount": 7,
+ "gcTimeMs": 0.010685791999999972,
+ "allocatedBytes": 24469552,
+ "heapSizeAfterBytes": 46137344
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7324,
+ "mainThreadMs": 234.75,
+ "backgroundMs": 228.11,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 43.18,
+ "avgMs": 0.491,
+ "p50Ms": 0.451,
+ "p95Ms": 0.876,
+ "maxMs": 1.007,
+ "mainThreadMs": 43.18,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 12.41,
+ "avgMs": 0.022,
+ "p50Ms": 0.01,
+ "p95Ms": 0.062,
+ "maxMs": 1.371,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.41,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 78.1,
+ "avgMs": 0.137,
+ "p50Ms": 0.099,
+ "p95Ms": 0.303,
+ "maxMs": 1.265,
+ "mainThreadMs": 0,
+ "backgroundMs": 78.1,
+ "items": 33652
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.84,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.047,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.84,
+ "items": 27969
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 110.08,
+ "avgMs": 0.192,
+ "p50Ms": 0.141,
+ "p95Ms": 0.471,
+ "maxMs": 1.695,
+ "mainThreadMs": 0,
+ "backgroundMs": 110.08,
+ "items": 33652
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 103.24,
+ "avgMs": 0.18,
+ "p50Ms": 0.001,
+ "p95Ms": 0.716,
+ "maxMs": 1.804,
+ "mainThreadMs": 103.24,
+ "backgroundMs": 0,
+ "items": 7269
+ },
+ "annotation.viewFor": {
+ "count": 3818,
+ "totalMs": 46.88,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.047,
+ "maxMs": 0.135,
+ "mainThreadMs": 46.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 525,
+ "totalMs": 1.18,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.011,
+ "mainThreadMs": 1.18,
+ "backgroundMs": 0,
+ "items": 3818
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 7.09,
+ "avgMs": 0.645,
+ "p50Ms": 0.622,
+ "p95Ms": 0.854,
+ "maxMs": 0.854,
+ "mainThreadMs": 7.09,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 33.16,
+ "avgMs": 3.015,
+ "p50Ms": 3.433,
+ "p95Ms": 5.163,
+ "maxMs": 5.163,
+ "mainThreadMs": 33.16,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 13.68,
+ "avgMs": 1.244,
+ "p50Ms": 1.259,
+ "p95Ms": 1.35,
+ "maxMs": 1.35,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.68,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 3,
+ "label": "minute-4",
+ "atMs": 250309,
+ "frames": {
+ "frames": 3721,
+ "durationMs": 62549.3,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 57,
+ "p99": 56,
+ "worstWindow": 56,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.81,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 60.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3691,
+ 1,
+ 4,
+ 24,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 29,
+ "jankRatio": 0.0078,
+ "droppedFrames": 31,
+ "longFrames": 1,
+ "overBudgetFrames": 30
+ },
+ "memory": {
+ "label": "minute-4",
+ "footprintMB": 481.4,
+ "residentMB": 427.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 541098,
+ "mallocMB": 288.8
+ },
+ "cpuPercent": 27.8,
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.01584133200000004,
+ "allocatedBytes": 23958512,
+ "heapSizeAfterBytes": 41943040
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7252,
+ "mainThreadMs": 235.97,
+ "backgroundMs": 221.6,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 44.19,
+ "avgMs": 0.502,
+ "p50Ms": 0.478,
+ "p95Ms": 0.913,
+ "maxMs": 1.208,
+ "mainThreadMs": 44.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 10.28,
+ "avgMs": 0.018,
+ "p50Ms": 0.011,
+ "p95Ms": 0.045,
+ "maxMs": 0.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.28,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 76.06,
+ "avgMs": 0.133,
+ "p50Ms": 0.098,
+ "p95Ms": 0.298,
+ "maxMs": 0.975,
+ "mainThreadMs": 0,
+ "backgroundMs": 76.06,
+ "items": 33638
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.78,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.049,
+ "maxMs": 0.158,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.78,
+ "items": 28149
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 106.28,
+ "avgMs": 0.186,
+ "p50Ms": 0.143,
+ "p95Ms": 0.404,
+ "maxMs": 1.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 106.28,
+ "items": 33638
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 100.78,
+ "avgMs": 0.176,
+ "p50Ms": 0.001,
+ "p95Ms": 0.728,
+ "maxMs": 3.087,
+ "mainThreadMs": 100.78,
+ "backgroundMs": 0,
+ "items": 7163
+ },
+ "annotation.viewFor": {
+ "count": 3782,
+ "totalMs": 46.54,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.046,
+ "maxMs": 0.161,
+ "mainThreadMs": 46.54,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 489,
+ "totalMs": 1.1,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.011,
+ "mainThreadMs": 1.1,
+ "backgroundMs": 0,
+ "items": 3782
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 7.56,
+ "avgMs": 0.688,
+ "p50Ms": 0.63,
+ "p95Ms": 0.94,
+ "maxMs": 0.94,
+ "mainThreadMs": 7.56,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 35.8,
+ "avgMs": 3.255,
+ "p50Ms": 2.759,
+ "p95Ms": 5.593,
+ "maxMs": 5.593,
+ "mainThreadMs": 35.8,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 15.2,
+ "avgMs": 1.382,
+ "p50Ms": 1.395,
+ "p95Ms": 1.779,
+ "maxMs": 1.779,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.2,
+ "items": 110000
+ }
+ }
+ }
+ }
+ ],
+ "metrics": {
+ "cycles": 53
+ },
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+ }
+ ],
+ "failures": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/stability-5m.json b/performance/results/baseline/ios/apple-iphone18-1-release-probes/stability-5m.json
new file mode 100644
index 0000000..1787a61
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/stability-5m.json
@@ -0,0 +1,1428 @@
+{
+ "schemaVersion": 1,
+ "runId": "20260910-160744-llt0",
+ "label": "baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run",
+ "scenario": "stability-5m",
+ "name": "Stability, 5 minutes",
+ "group": "stability",
+ "tags": [
+ "long",
+ "baseline"
+ ],
+ "description": "5 minutes of pan legs, zoom sweeps and 1 % marker updates over 10k clustered markers, with a timeline checkpoint (frames, memory, CPU, GC) every minute. The question: does performance degrade over time?",
+ "recordedAt": "2026-09-10T14:19:12.541Z",
+ "platform": "ios",
+ "provider": "apple",
+ "os": "ios 26.5",
+ "device": {
+ "platform": "ios",
+ "appVersion": "1.0.0 (1)",
+ "isSimulator": true,
+ "deviceName": "iPhone 17 Pro",
+ "model": "iPhone18,1",
+ "totalMemoryBytes": 25769803776,
+ "osVersion": "26.5",
+ "screenWidthPx": 1206,
+ "isDebugBuild": false,
+ "screenScale": 3,
+ "cpuCores": 15,
+ "manufacturer": "Apple",
+ "screenHeightPx": 2622,
+ "refreshRateHz": 60
+ },
+ "build": {
+ "type": "release",
+ "jsDev": false,
+ "hermes": true,
+ "perfProbes": true,
+ "representative": false,
+ "caveats": [
+ "simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement"
+ ]
+ },
+ "refreshRateHz": 60,
+ "frameBudgetMs": 16.667,
+ "durationMs": 302376,
+ "load": {
+ "commitMs": 9.96,
+ "readyMs": 83,
+ "timedOut": false,
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 84,
+ "mainThreadMs": 8.67,
+ "backgroundMs": 4.63,
+ "byName": {
+ "markers.fingerprint": {
+ "count": 3,
+ "totalMs": 1.62,
+ "avgMs": 0.54,
+ "p50Ms": 0.634,
+ "p95Ms": 0.985,
+ "maxMs": 0.985,
+ "mainThreadMs": 1.62,
+ "backgroundMs": 0,
+ "items": 20000
+ },
+ "markers.set": {
+ "count": 2,
+ "totalMs": 0.65,
+ "avgMs": 0.326,
+ "p50Ms": 0.002,
+ "p95Ms": 0.649,
+ "maxMs": 0.649,
+ "mainThreadMs": 0.65,
+ "backgroundMs": 0,
+ "items": 10000
+ },
+ "polylines.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "polygons.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0.001,
+ "p50Ms": 0.001,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "circles.set": {
+ "count": 2,
+ "totalMs": 0,
+ "avgMs": 0,
+ "p50Ms": 0,
+ "p95Ms": 0.001,
+ "maxMs": 0.001,
+ "mainThreadMs": 0,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "region.apply": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.009,
+ "p50Ms": 0.009,
+ "p95Ms": 0.009,
+ "maxMs": 0.009,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.indexBuild": {
+ "count": 4,
+ "totalMs": 4.23,
+ "avgMs": 1.058,
+ "p50Ms": 1.384,
+ "p95Ms": 1.415,
+ "maxMs": 1.415,
+ "mainThreadMs": 0,
+ "backgroundMs": 4.23,
+ "items": 30000
+ },
+ "markers.candidates": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 10000
+ },
+ "markers.cluster": {
+ "count": 1,
+ "totalMs": 0.15,
+ "avgMs": 0.148,
+ "p50Ms": 0.148,
+ "p95Ms": 0.148,
+ "maxMs": 0.148,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.15,
+ "items": 81
+ },
+ "markers.diff": {
+ "count": 1,
+ "totalMs": 0.02,
+ "avgMs": 0.024,
+ "p50Ms": 0.024,
+ "p95Ms": 0.024,
+ "maxMs": 0.024,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.02,
+ "items": 62
+ },
+ "markers.viewportCompute": {
+ "count": 1,
+ "totalMs": 0.2,
+ "avgMs": 0.204,
+ "p50Ms": 0.204,
+ "p95Ms": 0.204,
+ "maxMs": 0.204,
+ "mainThreadMs": 0,
+ "backgroundMs": 0.2,
+ "items": 81
+ },
+ "markers.applyDiff": {
+ "count": 1,
+ "totalMs": 0.17,
+ "avgMs": 0.166,
+ "p50Ms": 0.166,
+ "p95Ms": 0.166,
+ "maxMs": 0.166,
+ "mainThreadMs": 0.17,
+ "backgroundMs": 0,
+ "items": 62
+ },
+ "annotation.viewFor": {
+ "count": 62,
+ "totalMs": 6.22,
+ "avgMs": 0.1,
+ "p50Ms": 0.013,
+ "p95Ms": 0.05,
+ "maxMs": 4.791,
+ "mainThreadMs": 6.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 1,
+ "totalMs": 0.01,
+ "avgMs": 0.006,
+ "p50Ms": 0.006,
+ "p95Ms": 0.006,
+ "maxMs": 0.006,
+ "mainThreadMs": 0.01,
+ "backgroundMs": 0,
+ "items": 62
+ }
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": null,
+ "setterMs": null
+ },
+ "hermes": {
+ "available": true,
+ "gcCount": 1,
+ "gcTimeMs": 0.0010725409999999824,
+ "allocatedBytes": 4458672,
+ "heapSizeAfterBytes": 46137344
+ }
+ },
+ "frames": {
+ "frames": 17929,
+ "durationMs": 301356.6,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 57,
+ "p99": 56,
+ "worstWindow": 55,
+ "windows": 301
+ },
+ "frameTimeMs": {
+ "average": 16.81,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 60.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 17781,
+ 4,
+ 23,
+ 119,
+ 2,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 144,
+ "jankRatio": 0.008,
+ "droppedFrames": 150,
+ "longFrames": 2,
+ "overBudgetFrames": 148
+ },
+ "js": {
+ "lagMs": {
+ "samples": 18090,
+ "p50": 0,
+ "p95": 0.51,
+ "p99": 0.6,
+ "max": 11.58
+ },
+ "frameGapMs": {
+ "p50": 16.67,
+ "p95": 17.17,
+ "max": 28.25
+ },
+ "lateFrames": 1,
+ "busyMs": 2514.3,
+ "busyRatio": 0.0083,
+ "longTasks": {
+ "count": 0,
+ "totalMs": 0,
+ "maxMs": 0,
+ "source": "performance-observer"
+ },
+ "durationMs": 301494.9,
+ "commits": {
+ "count": 53,
+ "totalMs": 700.24,
+ "avgMs": 13.212,
+ "p95Ms": 17.212,
+ "maxMs": 17.478
+ }
+ },
+ "bridge": {
+ "commitToNativeMs": {
+ "samples": 53,
+ "avgMs": 1.588,
+ "maxMs": 5.695
+ },
+ "setterMs": {
+ "samples": 53,
+ "avgMs": 3.086,
+ "maxMs": 7.878
+ }
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 35259,
+ "mainThreadMs": 1139.86,
+ "backgroundMs": 1100.83,
+ "byName": {
+ "camera.apply": {
+ "count": 424,
+ "totalMs": 206.69,
+ "avgMs": 0.487,
+ "p50Ms": 0.473,
+ "p95Ms": 0.843,
+ "maxMs": 1.208,
+ "mainThreadMs": 206.69,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 2756,
+ "totalMs": 55.77,
+ "avgMs": 0.02,
+ "p50Ms": 0.011,
+ "p95Ms": 0.052,
+ "maxMs": 1.589,
+ "mainThreadMs": 0,
+ "backgroundMs": 55.77,
+ "items": 27560000
+ },
+ "markers.cluster": {
+ "count": 2756,
+ "totalMs": 377.36,
+ "avgMs": 0.137,
+ "p50Ms": 0.101,
+ "p95Ms": 0.306,
+ "maxMs": 4.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 377.36,
+ "items": 162172
+ },
+ "markers.diff": {
+ "count": 2756,
+ "totalMs": 65.91,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.049,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 65.91,
+ "items": 135282
+ },
+ "markers.viewportCompute": {
+ "count": 2756,
+ "totalMs": 528.89,
+ "avgMs": 0.192,
+ "p50Ms": 0.143,
+ "p95Ms": 0.432,
+ "maxMs": 4.86,
+ "mainThreadMs": 0,
+ "backgroundMs": 528.89,
+ "items": 162172
+ },
+ "markers.applyDiff": {
+ "count": 2756,
+ "totalMs": 498.27,
+ "avgMs": 0.181,
+ "p50Ms": 0.001,
+ "p95Ms": 0.724,
+ "maxMs": 3.087,
+ "mainThreadMs": 498.27,
+ "backgroundMs": 0,
+ "items": 35062
+ },
+ "annotation.viewFor": {
+ "count": 18411,
+ "totalMs": 229.96,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.047,
+ "maxMs": 0.216,
+ "mainThreadMs": 229.96,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 2485,
+ "totalMs": 5.59,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.026,
+ "mainThreadMs": 5.59,
+ "backgroundMs": 0,
+ "items": 18411
+ },
+ "markers.fingerprint": {
+ "count": 53,
+ "totalMs": 35.8,
+ "avgMs": 0.675,
+ "p50Ms": 0.631,
+ "p95Ms": 0.93,
+ "maxMs": 1.096,
+ "mainThreadMs": 35.8,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.set": {
+ "count": 53,
+ "totalMs": 163.56,
+ "avgMs": 3.086,
+ "p50Ms": 2.636,
+ "p95Ms": 5.593,
+ "maxMs": 7.878,
+ "mainThreadMs": 163.56,
+ "backgroundMs": 0,
+ "items": 530000
+ },
+ "markers.indexBuild": {
+ "count": 53,
+ "totalMs": 72.91,
+ "avgMs": 1.376,
+ "p50Ms": 1.313,
+ "p95Ms": 1.853,
+ "maxMs": 2.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 72.91,
+ "items": 530000
+ }
+ }
+ },
+ "memory": {
+ "beforeMB": 347.8,
+ "afterLoadMB": 278,
+ "afterInteractionMB": 389.5,
+ "afterCleanupMB": 212.9,
+ "peakMB": 481.4,
+ "loadDeltaMB": -69.8,
+ "interactionDeltaMB": 111.5,
+ "retainedAfterCleanupMB": -134.9,
+ "points": [
+ {
+ "label": "before",
+ "footprintMB": 347.8,
+ "residentMB": 510.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 257251,
+ "mallocMB": 136.1
+ },
+ {
+ "label": "afterLoad",
+ "footprintMB": 278,
+ "residentMB": 495.4,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 328385,
+ "mallocMB": 162.9
+ },
+ {
+ "label": "checkpoint:minute-1",
+ "footprintMB": 420.4,
+ "residentMB": 433.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544486,
+ "mallocMB": 229.5
+ },
+ {
+ "label": "checkpoint:minute-2",
+ "footprintMB": 440.8,
+ "residentMB": 432.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544773,
+ "mallocMB": 249
+ },
+ {
+ "label": "checkpoint:minute-3",
+ "footprintMB": 459.8,
+ "residentMB": 434.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 539189,
+ "mallocMB": 268
+ },
+ {
+ "label": "checkpoint:minute-4",
+ "footprintMB": 481.4,
+ "residentMB": 427.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 541098,
+ "mallocMB": 288.8
+ },
+ {
+ "label": "afterInteraction",
+ "footprintMB": 389.5,
+ "residentMB": 412.3,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 537554,
+ "mallocMB": 199.7
+ },
+ {
+ "label": "afterCleanup",
+ "footprintMB": 212.9,
+ "residentMB": 399.6,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 127282,
+ "mallocMB": 108
+ }
+ ]
+ },
+ "allocations": {
+ "hermes": {
+ "available": true,
+ "allocatedBytes": 117721392,
+ "gcCount": 31,
+ "gcTimeMs": 0.05741245900000003,
+ "heapSizeAfterMB": 40
+ },
+ "android": null,
+ "ios": {
+ "mallocBlocksDelta": 209169,
+ "mallocBytesDelta": 38600816
+ }
+ },
+ "cpu": {
+ "processCpuMs": 84145,
+ "wallMs": 301531,
+ "percent": 27.9,
+ "threadsBefore": 23,
+ "threadsAfter": 16,
+ "thermalBefore": "nominal",
+ "thermalAfter": "nominal",
+ "batteryLevel": -1,
+ "batteryState": "unknown",
+ "lowPowerMode": false
+ },
+ "transfer": {
+ "updates": {
+ "markers": 54,
+ "region": 1,
+ "clusteringEnabled": 1
+ },
+ "payload": {
+ "markers": {
+ "items": 540000,
+ "coordinates": 540000,
+ "estimatedBytes": 48912139
+ }
+ },
+ "largestUpdate": {
+ "markers": {
+ "items": 10000,
+ "coordinates": 10000,
+ "estimatedBytes": 906252
+ }
+ },
+ "eventsToJs": {}
+ },
+ "steps": [],
+ "timeline": [
+ {
+ "index": 0,
+ "label": "minute-1",
+ "atMs": 62600,
+ "frames": {
+ "frames": 3707,
+ "durationMs": 62575.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.2,
+ "p50": 60,
+ "p95": 56,
+ "p99": 55,
+ "worstWindow": 55,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.88,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 28.92,
+ "worst": 52.06,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3661,
+ 2,
+ 7,
+ 36,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 44,
+ "jankRatio": 0.0119,
+ "droppedFrames": 47,
+ "longFrames": 1,
+ "overBudgetFrames": 46
+ },
+ "memory": {
+ "label": "minute-1",
+ "footprintMB": 420.4,
+ "residentMB": 433.9,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544486,
+ "mallocMB": 229.5
+ },
+ "cpuPercent": 28.4,
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.007919792000000037,
+ "allocatedBytes": 23189528,
+ "heapSizeAfterBytes": 46137344
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7432,
+ "mainThreadMs": 244.67,
+ "backgroundMs": 231.6,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 42.3,
+ "avgMs": 0.481,
+ "p50Ms": 0.463,
+ "p95Ms": 0.853,
+ "maxMs": 1.028,
+ "mainThreadMs": 42.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 10.54,
+ "avgMs": 0.018,
+ "p50Ms": 0.011,
+ "p95Ms": 0.047,
+ "maxMs": 0.507,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.54,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 80.64,
+ "avgMs": 0.141,
+ "p50Ms": 0.104,
+ "p95Ms": 0.309,
+ "maxMs": 4.054,
+ "mainThreadMs": 0,
+ "backgroundMs": 80.64,
+ "items": 33706
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.38,
+ "avgMs": 0.023,
+ "p50Ms": 0.02,
+ "p95Ms": 0.048,
+ "maxMs": 0.164,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.38,
+ "items": 28092
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 110.77,
+ "avgMs": 0.194,
+ "p50Ms": 0.146,
+ "p95Ms": 0.421,
+ "maxMs": 4.86,
+ "mainThreadMs": 0,
+ "backgroundMs": 110.77,
+ "items": 33706
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 110.15,
+ "avgMs": 0.193,
+ "p50Ms": 0.001,
+ "p95Ms": 0.77,
+ "maxMs": 1.778,
+ "mainThreadMs": 110.15,
+ "backgroundMs": 0,
+ "items": 7492
+ },
+ "annotation.viewFor": {
+ "count": 3910,
+ "totalMs": 50.3,
+ "avgMs": 0.013,
+ "p50Ms": 0.006,
+ "p95Ms": 0.048,
+ "maxMs": 0.216,
+ "mainThreadMs": 50.3,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 541,
+ "totalMs": 1.24,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.015,
+ "mainThreadMs": 1.24,
+ "backgroundMs": 0,
+ "items": 3910
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 8.2,
+ "avgMs": 0.746,
+ "p50Ms": 0.769,
+ "p95Ms": 1.096,
+ "maxMs": 1.096,
+ "mainThreadMs": 8.2,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 32.47,
+ "avgMs": 2.952,
+ "p50Ms": 2.542,
+ "p95Ms": 5.614,
+ "maxMs": 5.614,
+ "mainThreadMs": 32.47,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 16.26,
+ "avgMs": 1.479,
+ "p50Ms": 1.41,
+ "p95Ms": 2.16,
+ "maxMs": 2.16,
+ "mainThreadMs": 0,
+ "backgroundMs": 16.26,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 1,
+ "label": "minute-2",
+ "atMs": 125163,
+ "frames": {
+ "frames": 3727,
+ "durationMs": 62534,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.6,
+ "p50": 60,
+ "p95": 58,
+ "p99": 57,
+ "worstWindow": 57,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.78,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 39.59,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3702,
+ 0,
+ 3,
+ 22,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 25,
+ "jankRatio": 0.0067,
+ "droppedFrames": 25,
+ "longFrames": 0,
+ "overBudgetFrames": 25
+ },
+ "memory": {
+ "label": "minute-2",
+ "footprintMB": 440.8,
+ "residentMB": 432.8,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 544773,
+ "mallocMB": 249
+ },
+ "cpuPercent": 27.8,
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.009615457999999966,
+ "allocatedBytes": 24225880,
+ "heapSizeAfterBytes": 46137344
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7371,
+ "mainThreadMs": 242.82,
+ "backgroundMs": 229.63,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 44.22,
+ "avgMs": 0.503,
+ "p50Ms": 0.507,
+ "p95Ms": 0.748,
+ "maxMs": 0.902,
+ "mainThreadMs": 44.22,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 13.23,
+ "avgMs": 0.023,
+ "p50Ms": 0.01,
+ "p95Ms": 0.063,
+ "maxMs": 1.589,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.23,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 77.08,
+ "avgMs": 0.135,
+ "p50Ms": 0.102,
+ "p95Ms": 0.291,
+ "maxMs": 1.249,
+ "mainThreadMs": 0,
+ "backgroundMs": 77.08,
+ "items": 33638
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.69,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.048,
+ "maxMs": 0.172,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.69,
+ "items": 28015
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 110.75,
+ "avgMs": 0.194,
+ "p50Ms": 0.144,
+ "p95Ms": 0.439,
+ "maxMs": 1.994,
+ "mainThreadMs": 0,
+ "backgroundMs": 110.75,
+ "items": 33638
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 105.29,
+ "avgMs": 0.184,
+ "p50Ms": 0.001,
+ "p95Ms": 0.714,
+ "maxMs": 1.656,
+ "mainThreadMs": 105.29,
+ "backgroundMs": 0,
+ "items": 7374
+ },
+ "annotation.viewFor": {
+ "count": 3855,
+ "totalMs": 47.99,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.046,
+ "maxMs": 0.18,
+ "mainThreadMs": 47.99,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 535,
+ "totalMs": 1.17,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.01,
+ "mainThreadMs": 1.17,
+ "backgroundMs": 0,
+ "items": 3855
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 6.73,
+ "avgMs": 0.612,
+ "p50Ms": 0.59,
+ "p95Ms": 0.787,
+ "maxMs": 0.787,
+ "mainThreadMs": 6.73,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 37.42,
+ "avgMs": 3.402,
+ "p50Ms": 2.267,
+ "p95Ms": 7.878,
+ "maxMs": 7.878,
+ "mainThreadMs": 37.42,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 14.87,
+ "avgMs": 1.352,
+ "p50Ms": 1.313,
+ "p95Ms": 1.853,
+ "maxMs": 1.853,
+ "mainThreadMs": 0,
+ "backgroundMs": 14.87,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 2,
+ "label": "minute-3",
+ "atMs": 187719,
+ "frames": {
+ "frames": 3729,
+ "durationMs": 62524.2,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.6,
+ "p50": 60,
+ "p95": 58,
+ "p99": 58,
+ "worstWindow": 58,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.76,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 38.17,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3707,
+ 0,
+ 4,
+ 18,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 22,
+ "jankRatio": 0.0059,
+ "droppedFrames": 22,
+ "longFrames": 0,
+ "overBudgetFrames": 22
+ },
+ "memory": {
+ "label": "minute-3",
+ "footprintMB": 459.8,
+ "residentMB": 434.1,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 539189,
+ "mallocMB": 268
+ },
+ "cpuPercent": 27.9,
+ "hermes": {
+ "available": true,
+ "gcCount": 7,
+ "gcTimeMs": 0.010685791999999972,
+ "allocatedBytes": 24469552,
+ "heapSizeAfterBytes": 46137344
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7324,
+ "mainThreadMs": 234.75,
+ "backgroundMs": 228.11,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 43.18,
+ "avgMs": 0.491,
+ "p50Ms": 0.451,
+ "p95Ms": 0.876,
+ "maxMs": 1.007,
+ "mainThreadMs": 43.18,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 12.41,
+ "avgMs": 0.022,
+ "p50Ms": 0.01,
+ "p95Ms": 0.062,
+ "maxMs": 1.371,
+ "mainThreadMs": 0,
+ "backgroundMs": 12.41,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 78.1,
+ "avgMs": 0.137,
+ "p50Ms": 0.099,
+ "p95Ms": 0.303,
+ "maxMs": 1.265,
+ "mainThreadMs": 0,
+ "backgroundMs": 78.1,
+ "items": 33652
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.84,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.047,
+ "maxMs": 0.163,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.84,
+ "items": 27969
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 110.08,
+ "avgMs": 0.192,
+ "p50Ms": 0.141,
+ "p95Ms": 0.471,
+ "maxMs": 1.695,
+ "mainThreadMs": 0,
+ "backgroundMs": 110.08,
+ "items": 33652
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 103.24,
+ "avgMs": 0.18,
+ "p50Ms": 0.001,
+ "p95Ms": 0.716,
+ "maxMs": 1.804,
+ "mainThreadMs": 103.24,
+ "backgroundMs": 0,
+ "items": 7269
+ },
+ "annotation.viewFor": {
+ "count": 3818,
+ "totalMs": 46.88,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.047,
+ "maxMs": 0.135,
+ "mainThreadMs": 46.88,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 525,
+ "totalMs": 1.18,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.011,
+ "mainThreadMs": 1.18,
+ "backgroundMs": 0,
+ "items": 3818
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 7.09,
+ "avgMs": 0.645,
+ "p50Ms": 0.622,
+ "p95Ms": 0.854,
+ "maxMs": 0.854,
+ "mainThreadMs": 7.09,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 33.16,
+ "avgMs": 3.015,
+ "p50Ms": 3.433,
+ "p95Ms": 5.163,
+ "maxMs": 5.163,
+ "mainThreadMs": 33.16,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 13.68,
+ "avgMs": 1.244,
+ "p50Ms": 1.259,
+ "p95Ms": 1.35,
+ "maxMs": 1.35,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.68,
+ "items": 110000
+ }
+ }
+ }
+ },
+ {
+ "index": 3,
+ "label": "minute-4",
+ "atMs": 250309,
+ "frames": {
+ "frames": 3721,
+ "durationMs": 62549.3,
+ "refreshRateHz": 60,
+ "budgetMs": 16.667,
+ "fps": {
+ "average": 59.5,
+ "p50": 60,
+ "p95": 57,
+ "p99": 56,
+ "worstWindow": 56,
+ "windows": 63
+ },
+ "frameTimeMs": {
+ "average": 16.81,
+ "p50": 16.67,
+ "p90": 16.67,
+ "p95": 16.67,
+ "p99": 16.67,
+ "worst": 60.12,
+ "histogram": {
+ "edgesMs": [
+ 4,
+ 8.33,
+ 12,
+ 16.67,
+ 25,
+ 33.33,
+ 50,
+ 100,
+ 250,
+ 500,
+ 1000
+ ],
+ "counts": [
+ 0,
+ 0,
+ 0,
+ 3691,
+ 1,
+ 4,
+ 24,
+ 1,
+ 0,
+ 0,
+ 0,
+ 0
+ ]
+ }
+ },
+ "jankFrames": 29,
+ "jankRatio": 0.0078,
+ "droppedFrames": 31,
+ "longFrames": 1,
+ "overBudgetFrames": 30
+ },
+ "memory": {
+ "label": "minute-4",
+ "footprintMB": 481.4,
+ "residentMB": 427.2,
+ "javaHeapMB": null,
+ "nativeHeapMB": null,
+ "mallocBlocks": 541098,
+ "mallocMB": 288.8
+ },
+ "cpuPercent": 27.8,
+ "hermes": {
+ "available": true,
+ "gcCount": 6,
+ "gcTimeMs": 0.01584133200000004,
+ "allocatedBytes": 23958512,
+ "heapSizeAfterBytes": 41943040
+ },
+ "native": {
+ "available": true,
+ "dropped": 0,
+ "spans": 7252,
+ "mainThreadMs": 235.97,
+ "backgroundMs": 221.6,
+ "byName": {
+ "camera.apply": {
+ "count": 88,
+ "totalMs": 44.19,
+ "avgMs": 0.502,
+ "p50Ms": 0.478,
+ "p95Ms": 0.913,
+ "maxMs": 1.208,
+ "mainThreadMs": 44.19,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "markers.candidates": {
+ "count": 572,
+ "totalMs": 10.28,
+ "avgMs": 0.018,
+ "p50Ms": 0.011,
+ "p95Ms": 0.045,
+ "maxMs": 0.2,
+ "mainThreadMs": 0,
+ "backgroundMs": 10.28,
+ "items": 5720000
+ },
+ "markers.cluster": {
+ "count": 572,
+ "totalMs": 76.06,
+ "avgMs": 0.133,
+ "p50Ms": 0.098,
+ "p95Ms": 0.298,
+ "maxMs": 0.975,
+ "mainThreadMs": 0,
+ "backgroundMs": 76.06,
+ "items": 33638
+ },
+ "markers.diff": {
+ "count": 572,
+ "totalMs": 13.78,
+ "avgMs": 0.024,
+ "p50Ms": 0.019,
+ "p95Ms": 0.049,
+ "maxMs": 0.158,
+ "mainThreadMs": 0,
+ "backgroundMs": 13.78,
+ "items": 28149
+ },
+ "markers.viewportCompute": {
+ "count": 572,
+ "totalMs": 106.28,
+ "avgMs": 0.186,
+ "p50Ms": 0.143,
+ "p95Ms": 0.404,
+ "maxMs": 1.104,
+ "mainThreadMs": 0,
+ "backgroundMs": 106.28,
+ "items": 33638
+ },
+ "markers.applyDiff": {
+ "count": 572,
+ "totalMs": 100.78,
+ "avgMs": 0.176,
+ "p50Ms": 0.001,
+ "p95Ms": 0.728,
+ "maxMs": 3.087,
+ "mainThreadMs": 100.78,
+ "backgroundMs": 0,
+ "items": 7163
+ },
+ "annotation.viewFor": {
+ "count": 3782,
+ "totalMs": 46.54,
+ "avgMs": 0.012,
+ "p50Ms": 0.006,
+ "p95Ms": 0.046,
+ "maxMs": 0.161,
+ "mainThreadMs": 46.54,
+ "backgroundMs": 0,
+ "items": 0
+ },
+ "annotation.didAdd": {
+ "count": 489,
+ "totalMs": 1.1,
+ "avgMs": 0.002,
+ "p50Ms": 0.002,
+ "p95Ms": 0.004,
+ "maxMs": 0.011,
+ "mainThreadMs": 1.1,
+ "backgroundMs": 0,
+ "items": 3782
+ },
+ "markers.fingerprint": {
+ "count": 11,
+ "totalMs": 7.56,
+ "avgMs": 0.688,
+ "p50Ms": 0.63,
+ "p95Ms": 0.94,
+ "maxMs": 0.94,
+ "mainThreadMs": 7.56,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.set": {
+ "count": 11,
+ "totalMs": 35.8,
+ "avgMs": 3.255,
+ "p50Ms": 2.759,
+ "p95Ms": 5.593,
+ "maxMs": 5.593,
+ "mainThreadMs": 35.8,
+ "backgroundMs": 0,
+ "items": 110000
+ },
+ "markers.indexBuild": {
+ "count": 11,
+ "totalMs": 15.2,
+ "avgMs": 1.382,
+ "p50Ms": 1.395,
+ "p95Ms": 1.779,
+ "maxMs": 1.779,
+ "mainThreadMs": 0,
+ "backgroundMs": 15.2,
+ "items": 110000
+ }
+ }
+ }
+ }
+ ],
+ "metrics": {
+ "cycles": 53
+ },
+ "notes": [
+ "clock alignment round trip 0.001 ms"
+ ],
+ "errors": []
+}
diff --git a/performance/results/baseline/ios/apple-iphone18-1-release-probes/summary.md b/performance/results/baseline/ios/apple-iphone18-1-release-probes/summary.md
new file mode 100644
index 0000000..061e1de
--- /dev/null
+++ b/performance/results/baseline/ios/apple-iphone18-1-release-probes/summary.md
@@ -0,0 +1,207 @@
+Run 20260910-160744-llt0 (baseline run 2 (JS frame sampler), iPhone 17 Pro simulator, concurrent with Android emulator run) · ios 26.5 · Apple iPhone18,1 · 60 Hz · provider apple
+Build: release, Hermes, probes · NOT production-representative (simulator/emulator: desktop CPU and GPU, 60 Hz; not a device measurement)
+Recorded 2026-09-10T14:07:50.382Z → 2026-09-10T14:19:12.571Z
+
+| Scenario | FPS avg | Frame p95 | Frame p99 | Worst frame | Jank ratio | JS lag p95 | JS commit avg | Native main-thread | RAM after | RAM Δ interaction | JS allocated | CPU |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| markers-100 | 59.3 | 16.7 ms | 21.3 ms | 45.4 ms | 0.6 % | 0.48 ms | N/A | 1.82 ms | 260 MB | 75 MB | 109 KB | 31 % |
+| markers-1k | 58.6 | 16.7 ms | 33.3 ms | 50.0 ms | 1.8 % | 0.57 ms | N/A | 3.15 ms | 264 MB | 84 MB | 168 KB | 32 % |
+| markers-10k | 57.9 | 16.7 ms | 36.6 ms | 43.8 ms | 3.0 % | 0.45 ms | N/A | 8.03 ms | 253 MB | 61 MB | 157 KB | 32 % |
+| markers-50k | 56.6 | 16.7 ms | 52.1 ms | 101.4 ms | 2.4 % | 0.47 ms | N/A | 13.8 ms | 355 MB | 95 MB | 167 KB | 29 % |
+| markers-children-1k | 59.0 | 16.7 ms | 33.3 ms | 46.9 ms | 1.2 % | 0.53 ms | N/A | 3.35 ms | 313 MB | 79 MB | 146 KB | 32 % |
+| markers-10k-rich | 58.3 | 16.7 ms | 34.0 ms | 41.7 ms | 2.4 % | 0.53 ms | N/A | 7.10 ms | 298 MB | 80 MB | 148 KB | 33 % |
+| camera-fast-pan-0 | 59.5 | 16.7 ms | 16.7 ms | 48.0 ms | 0.4 % | 0.51 ms | N/A | 2.37 ms | 321 MB | 109 MB | 119 KB | 34 % |
+| camera-fast-pan-1k | 59.5 | 16.7 ms | 16.7 ms | 51.0 ms | 0.4 % | 0.51 ms | N/A | 4.73 ms | 322 MB | 133 MB | 179 KB | 31 % |
+| camera-idle-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.48 ms | N/A | 0.00 ms | 233 MB | 7 MB | 119 KB | 2 % |
+| camera-slow-pan-10k | 59.2 | 16.7 ms | 33.3 ms | 45.8 ms | 1.0 % | 0.47 ms | N/A | 11.6 ms | 308 MB | 86 MB | 293 KB | 28 % |
+| camera-fast-pan-10k | 59.2 | 16.7 ms | 24.6 ms | 42.1 ms | 0.9 % | 0.41 ms | N/A | 10.6 ms | 339 MB | 126 MB | 215 KB | 30 % |
+| camera-continuous-pan-10k | 59.2 | 16.7 ms | 33.3 ms | 41.7 ms | 1.1 % | 0.48 ms | N/A | 24.0 ms | 306 MB | 76 MB | 354 KB | 27 % |
+| camera-zoom-in-10k | 57.4 | 16.7 ms | 41.3 ms | 46.0 ms | 3.8 % | 0.52 ms | N/A | 45.9 ms | 418 MB | 196 MB | 689 KB | 47 % |
+| camera-zoom-out-10k | 57.8 | 16.7 ms | 35.5 ms | 40.9 ms | 3.7 % | 0.46 ms | N/A | 28.1 ms | 412 MB | 186 MB | 465 KB | 47 % |
+| camera-rapid-zoom-10k | 58.4 | 16.7 ms | 33.3 ms | 37.6 ms | 2.8 % | 0.54 ms | N/A | 14.9 ms | 345 MB | 108 MB | 283 KB | 41 % |
+| camera-rotate-10k | 58.2 | 16.7 ms | 47.9 ms | 71.2 ms | 1.6 % | 0.46 ms | N/A | 8.35 ms | 306 MB | 72 MB | 172 KB | 32 % |
+| camera-pitch-10k | 58.0 | 16.7 ms | 34.3 ms | 47.0 ms | 2.8 % | 0.48 ms | N/A | 4.29 ms | 345 MB | 113 MB | 123 KB | 43 % |
+| camera-rapid-10k | 57.3 | 16.7 ms | 33.5 ms | 45.1 ms | 4.3 % | 0.50 ms | N/A | 17.7 ms | 316 MB | 84 MB | 292 KB | 37 % |
+| camera-fast-pan-50k | 58.4 | 16.7 ms | 35.1 ms | 47.5 ms | 2.3 % | 0.52 ms | N/A | 28.9 ms | 402 MB | 134 MB | 295 KB | 37 % |
+| mutations-10k | 59.9 | 16.7 ms | 16.7 ms | 43.5 ms | 0.1 % | 0.53 ms | 13.0 ms | 114.6 ms | 253 MB | 21 MB | 81.7 MB | 7 % |
+| mutations-1k-children | 59.7 | 16.7 ms | 16.7 ms | 84.3 ms | 0.3 % | 0.53 ms | 4.76 ms | 21.9 ms | 223 MB | -9 MB | 47.0 MB | 4 % |
+| mutations-continuous-1k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.49 ms | 2.59 ms | 35.1 ms | 208 MB | -2 MB | 12.2 MB | 13 % |
+| mutations-continuous-10k | 60.0 | 16.7 ms | 16.7 ms | 16.7 ms | 0.0 % | 0.58 ms | 15.4 ms | 162.7 ms | 245 MB | 21 MB | 87.7 MB | 22 % |
+| polyline-100 | 59.6 | 16.7 ms | 16.7 ms | 46.9 ms | 0.3 % | 0.50 ms | 0.36 ms | 16.1 ms | 319 MB | 81 MB | 690 KB | 20 % |
+| polyline-1k | 59.2 | 16.7 ms | 33.3 ms | 35.6 ms | 1.3 % | 0.51 ms | 0.60 ms | 21.7 ms | 312 MB | 92 MB | 2.3 MB | 21 % |
+| polyline-10k | 59.4 | 16.7 ms | 16.7 ms | 46.6 ms | 0.7 % | 0.51 ms | 1.25 ms | 17.2 ms | 318 MB | 85 MB | 15.3 MB | 22 % |
+| polyline-100k | 57.5 | 16.7 ms | 50.4 ms | 69.7 ms | 2.2 % | 0.65 ms | 6.77 ms | 27.9 ms | 321 MB | 107 MB | 147.8 MB | 27 % |
+| polygon-100 | 59.3 | 16.7 ms | 17.6 ms | 49.0 ms | 0.8 % | 0.51 ms | 0.43 ms | 15.4 ms | 307 MB | 72 MB | 459 KB | 25 % |
+| polygon-1k | 59.5 | 16.7 ms | 16.7 ms | 35.3 ms | 0.8 % | 0.52 ms | 0.65 ms | 15.7 ms | 304 MB | 91 MB | 1.5 MB | 25 % |
+| polygon-10k | 59.5 | 16.7 ms | 16.7 ms | 45.6 ms | 0.4 % | 0.45 ms | 0.90 ms | 15.0 ms | 314 MB | 91 MB | 9.7 MB | 21 % |
+| polylines-200x50 | 57.7 | 16.7 ms | 37.7 ms | 50.0 ms | 3.0 % | 0.50 ms | 1.16 ms | 90.1 ms | 346 MB | 98 MB | 3.6 MB | 32 % |
+| polygons-200x20 | 57.4 | 16.7 ms | 44.0 ms | 61.5 ms | 2.5 % | 0.54 ms | 0.84 ms | 123.2 ms | 348 MB | 104 MB | 1.8 MB | 26 % |
+| cluster-1k | 59.4 | 16.7 ms | 33.3 ms | 34.7 ms | 1.0 % | 0.51 ms | 5.01 ms | 68.0 ms | 408 MB | 156 MB | 1.1 MB | 30 % |
+| cluster-10k | 58.9 | 16.7 ms | 33.3 ms | 37.1 ms | 1.9 % | 0.52 ms | 11.3 ms | 118.8 ms | 427 MB | 133 MB | 3.0 MB | 34 % |
+| cluster-50k | 58.4 | 16.7 ms | 34.1 ms | 87.8 ms | 1.7 % | 0.53 ms | 49.3 ms | 128.4 ms | 467 MB | 131 MB | 9.8 MB | 65 % |
+| combined-10k-camera | 58.7 | 16.7 ms | 33.4 ms | 48.9 ms | 1.9 % | 0.50 ms | N/A | 16.9 ms | 446 MB | 181 MB | 367 KB | 38 % |
+| combined-10k-cluster-camera | 59.8 | 16.7 ms | 16.7 ms | 33.3 ms | 0.3 % | 0.51 ms | N/A | 76.9 ms | 438 MB | 148 MB | 686 KB | 39 % |
+| combined-10k-updates | 59.5 | 16.7 ms | 16.7 ms | 33.3 ms | 0.8 % | 0.47 ms | 13.1 ms | 84.1 ms | 365 MB | 108 MB | 44.1 MB | 33 % |
+| combined-10k-polyline | 58.9 | 16.7 ms | 33.3 ms | 45.7 ms | 1.5 % | 0.53 ms | 1.55 ms | 15.6 ms | 387 MB | 99 MB | 6.8 MB | 27 % |
+| combined-10k-polygon | 58.0 | 16.7 ms | 42.8 ms | 61.2 ms | 1.6 % | 0.56 ms | 2.94 ms | 137.6 ms | 452 MB | 129 MB | 1.9 MB | 29 % |
+| combined-all | 58.9 | 16.7 ms | 35.1 ms | 39.8 ms | 1.9 % | 0.53 ms | 13.3 ms | 102.8 ms | 497 MB | 159 MB | 35.7 MB | 41 % |
+| stability-5m | 59.5 | 16.7 ms | 16.7 ms | 60.1 ms | 0.8 % | 0.51 ms | 13.2 ms | 1139.9 ms | 390 MB | 112 MB | 112.3 MB | 28 % |
+
+#### mutations-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 12.3 ms | 1.13 ms | 1.60 ms | 1.60 ms | 0.66 ms | 1.72 ms | 0.07 ms | 0.00 ms | 1.9 MB |
+| remove-1 | 1 | 12.2 ms | 1.20 ms | 1.64 ms | 1.64 ms | 0.55 ms | 1.46 ms | 0.05 ms | 0.00 ms | 1.8 MB |
+| update-1 | 1 | 12.1 ms | 1.39 ms | 1.71 ms | 1.71 ms | 0.66 ms | 1.78 ms | 0.05 ms | 0.00 ms | 1.8 MB |
+| update-10 | 10 | 13.6 ms | 1.68 ms | 2.12 ms | 2.12 ms | 0.60 ms | 1.45 ms | 0.06 ms | 0.00 ms | 1.8 MB |
+| update-100 | 100 | 12.9 ms | 1.49 ms | 2.35 ms | 2.35 ms | 0.75 ms | 1.75 ms | 0.07 ms | 0.00 ms | 1.8 MB |
+| update-1pct | 100 | 14.1 ms | 1.64 ms | 2.39 ms | 2.39 ms | 0.88 ms | 1.29 ms | 0.06 ms | 0.10 ms | 1.8 MB |
+| update-10pct | 1000 | 10.8 ms | 1.22 ms | 1.83 ms | 1.83 ms | 0.56 ms | 1.05 ms | 0.05 ms | 0.14 ms | 1.9 MB |
+| update-100pct | 10000 | 9.27 ms | 1.11 ms | 1.70 ms | 1.70 ms | 0.61 ms | 1.24 ms | 0.06 ms | 0.49 ms | 3.5 MB |
+
+JS commit cost vs. changed markers: empirical exponent -0.02 (0 = flat, 1 = linear).
+
+#### mutations-1k-children steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | polylines.set | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| add-1 | 1 | 4.64 ms | 0.41 ms | 0.33 ms | 0.33 ms | 0.12 ms | 0.21 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| remove-1 | 1 | 5.16 ms | 0.29 ms | 0.35 ms | 0.35 ms | 0.12 ms | 0.19 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-1 | 1 | 4.11 ms | 0.33 ms | 0.27 ms | 0.27 ms | 0.08 ms | 0.15 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-10 | 10 | 4.64 ms | 0.32 ms | 0.30 ms | 0.30 ms | 0.07 ms | 0.17 ms | 0.02 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-100 | 100 | 4.30 ms | 0.37 ms | 0.25 ms | 0.25 ms | 0.07 ms | 0.11 ms | 0.02 ms | 0.09 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-1pct | 10 | 4.68 ms | 0.34 ms | 0.33 ms | 0.33 ms | 0.12 ms | 0.17 ms | 0.03 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-10pct | 100 | 4.19 ms | 0.35 ms | 0.37 ms | 0.37 ms | 0.10 ms | 0.20 ms | 0.03 ms | 0.00 ms | 0.00 ms | 0.00 ms | 1.1 MB |
+| update-100pct | 1000 | 4.14 ms | 0.40 ms | 0.33 ms | 0.33 ms | 0.11 ms | 0.17 ms | 0.02 ms | 0.20 ms | 0.00 ms | 0.00 ms | 1.3 MB |
+
+JS commit cost vs. changed markers: empirical exponent -0.02 (0 = flat, 1 = linear).
+
+#### mutations-continuous-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 2.59 ms | 0.42 ms | 0.41 ms | 20.4 ms | 6.11 ms | 11.7 ms | 1.47 ms | 8.62 ms | 12.1 MB |
+
+#### mutations-continuous-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| continuous | | 15.4 ms | 1.72 ms | 2.37 ms | 118.3 ms | 43.8 ms | 82.9 ms | 3.29 ms | 0.51 ms | 87.6 MB |
+
+#### polyline-100 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 100 | 0.25 ms | 0.09 ms | 1.30 ms | 1.30 ms | 59 KB |
+| perturb | 100 | 0.55 ms | 0.18 ms | 2.37 ms | 2.36 ms | 59 KB |
+
+#### polyline-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 1000 | 0.63 ms | 0.20 ms | 3.08 ms | 3.08 ms | 251 KB |
+| perturb | 1000 | 0.63 ms | 0.15 ms | 1.76 ms | 1.76 ms | 265 KB |
+
+#### polyline-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 10000 | 0.92 ms | 0.14 ms | 1.40 ms | 1.40 ms | 1.7 MB |
+| perturb | 10000 | 1.40 ms | 0.20 ms | 2.28 ms | 2.28 ms | 1.9 MB |
+
+#### polyline-100k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 100000 | 6.88 ms | 0.46 ms | 3.14 ms | 3.14 ms | 16.7 MB |
+| perturb | 100000 | 6.49 ms | 0.55 ms | 3.47 ms | 3.47 ms | 18.2 MB |
+
+#### polygon-100 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 100 | 0.40 ms | 0.13 ms | 2.77 ms | 2.77 ms | 59 KB |
+
+#### polygon-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 1000 | 0.67 ms | 0.15 ms | 2.78 ms | 2.78 ms | 251 KB |
+
+#### polygon-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle | 10000 | 0.87 ms | 0.14 ms | 2.59 ms | 2.59 ms | 1.7 MB |
+
+#### polylines-200x50 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle-all | | 0.88 ms | 0.20 ms | 29.0 ms | 29.0 ms | 793 KB |
+
+#### polygons-200x20 steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle-all | | 0.87 ms | 0.19 ms | 40.7 ms | 40.7 ms | 354 KB |
+
+#### cluster-1k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| zoom-sweep | | N/A | N/A | N/A | N/A | N/A | N/A | 16.8 ms | 19.9 ms | 439 KB |
+| pan | | N/A | N/A | N/A | N/A | N/A | N/A | 25.5 ms | 19.8 ms | 291 KB |
+| update-1pct | 10 | 5.01 ms | 0.41 ms | 0.37 ms | 0.37 ms | 0.12 ms | 0.24 ms | 0.36 ms | 0.14 ms | 268 KB |
+
+#### cluster-10k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| zoom-sweep | | N/A | N/A | N/A | N/A | N/A | N/A | 195.4 ms | 42.0 ms | 768 KB |
+| pan | | N/A | N/A | N/A | N/A | N/A | N/A | 172.2 ms | 26.7 ms | 408 KB |
+| update-1pct | 100 | 11.3 ms | 1.25 ms | 2.35 ms | 2.35 ms | 0.76 ms | 1.58 ms | 3.55 ms | 0.41 ms | 1.8 MB |
+
+#### cluster-50k steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| zoom-sweep | | N/A | N/A | N/A | N/A | N/A | N/A | 2152.4 ms | 39.8 ms | 872 KB |
+| pan | | N/A | N/A | N/A | N/A | N/A | N/A | 1766.2 ms | 23.9 ms | 328 KB |
+| update-1pct | 500 | 49.3 ms | 8.51 ms | 8.16 ms | 8.16 ms | 3.46 ms | 7.74 ms | 28.6 ms | 0.84 ms | 8.6 MB |
+
+#### combined-10k-updates steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| updates-while-panning | | 13.1 ms | 2.13 ms | 2.20 ms | 55.0 ms | 17.4 ms | 36.6 ms | 2.72 ms | 7.83 ms | 44.0 MB |
+
+#### combined-10k-polyline steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polylines.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| route-update | | 1.54 ms | 0.16 ms | 1.85 ms | 1.85 ms | 1.9 MB |
+
+#### combined-10k-polygon steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | polygons.set | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: |
+| restyle-all | | 2.79 ms | 0.56 ms | 37.9 ms | 37.9 ms | 356 KB |
+
+#### combined-all steps (median over repeats)
+
+| Step | Changed | JS commit | Commit → native | Native setter | markers.set | markers.fingerprint | markers.indexBuild | markers.viewportCompute | markers.applyDiff | JS alloc |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| updates-while-panning | | 13.3 ms | 2.04 ms | 2.10 ms | 42.1 ms | 14.6 ms | 29.8 ms | 7.45 ms | 2.67 ms | 35.3 MB |
+
+#### stability-5m timeline
+
+| Window | At | FPS | p95 | p99 | Worst | Jank | RAM | CPU | JS alloc | Native main |
+| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
+| minute-1 | 63 s | 59.2 | 16.7 ms | 28.9 ms | 52.1 ms | 1.2 % | 420 MB | 28 % | 22.1 MB | 244.7 ms |
+| minute-2 | 125 s | 59.6 | 16.7 ms | 16.7 ms | 39.6 ms | 0.7 % | 441 MB | 28 % | 23.1 MB | 242.8 ms |
+| minute-3 | 188 s | 59.6 | 16.7 ms | 16.7 ms | 38.2 ms | 0.6 % | 460 MB | 28 % | 23.3 MB | 234.8 ms |
+| minute-4 | 250 s | 59.5 | 16.7 ms | 16.7 ms | 60.1 ms | 0.8 % | 481 MB | 28 % | 22.8 MB | 236.0 ms |
+
+Drift first → last window: FPS 0.3, RAM 61 MB.
diff --git a/performance/results/baseline/js-bench/collection.json b/performance/results/baseline/js-bench/collection.json
new file mode 100644
index 0000000..658f939
--- /dev/null
+++ b/performance/results/baseline/js-bench/collection.json
@@ -0,0 +1,133 @@
+{
+ "suite": "collection",
+ "runtime": "bun 1.3.14 on darwin/arm64",
+ "recordedAt": "2026-09-10T13:31:50.833Z",
+ "series": [
+ {
+ "name": "React.createElement for n children (per parent render)",
+ "exponent": 0.9718334896739504,
+ "measurements": [
+ {
+ "name": "createElement × n",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.04487499999993361,
+ "meanMs": 0.047281840000005675,
+ "minMs": 0.032541999999921245,
+ "p95Ms": 0.06937499999992269
+ },
+ {
+ "name": "createElement × n",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.29854100000000017,
+ "meanMs": 0.3127039750000046,
+ "minMs": 0.28216600000007475,
+ "p95Ms": 0.3374579999999696
+ },
+ {
+ "name": "createElement × n",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 3.3688750000001164,
+ "meanMs": 3.4756316299999948,
+ "minMs": 2.7730000000001382,
+ "p95Ms": 4.171290999999883
+ },
+ {
+ "name": "createElement × n",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 34.723417000000154,
+ "meanMs": 35.138837500000044,
+ "minMs": 30.709292000000005,
+ "p95Ms": 41.497041999999965
+ }
+ ]
+ },
+ {
+ "name": "collect descriptors from children (per MapView render)",
+ "exponent": 0.9212990418863362,
+ "measurements": [
+ {
+ "name": "Children.forEach collect",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.007124999999973625,
+ "meanMs": 0.018136659999998982,
+ "minMs": 0.00437499999998181,
+ "p95Ms": 0.024499999999989086
+ },
+ {
+ "name": "Children.forEach collect",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.04066699999998491,
+ "meanMs": 0.04739920999999924,
+ "minMs": 0.033333999999968,
+ "p95Ms": 0.07983300000000781
+ },
+ {
+ "name": "Children.forEach collect",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.3571669999998903,
+ "meanMs": 0.378892515,
+ "minMs": 0.3126669999999194,
+ "p95Ms": 0.577541999999994
+ },
+ {
+ "name": "Children.forEach collect",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 4.066667000000052,
+ "meanMs": 4.221058299999958,
+ "minMs": 3.6274170000001504,
+ "p95Ms": 5.079291000000012
+ }
+ ]
+ },
+ {
+ "name": "both (what one re-render of a children-based map costs before Nitro)",
+ "exponent": 1.0241433871637498,
+ "measurements": [
+ {
+ "name": "elements + collect",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.035667000000103144,
+ "meanMs": 0.03689273500000468,
+ "minMs": 0.032709000000068045,
+ "p95Ms": 0.04158400000005713
+ },
+ {
+ "name": "elements + collect",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.3333339999999225,
+ "meanMs": 0.35790953499999545,
+ "minMs": 0.3066669999999476,
+ "p95Ms": 0.5665830000000369
+ },
+ {
+ "name": "elements + collect",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 4.218667000000096,
+ "meanMs": 4.27625268499999,
+ "minMs": 3.197624999999789,
+ "p95Ms": 5.138915999999881
+ },
+ {
+ "name": "elements + collect",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 39.68679200000042,
+ "meanMs": 40.73133955000001,
+ "minMs": 34.7299579999999,
+ "p95Ms": 48.851584
+ }
+ ]
+ }
+ ]
+}
diff --git a/performance/results/baseline/js-bench/geometry.json b/performance/results/baseline/js-bench/geometry.json
new file mode 100644
index 0000000..520e92b
--- /dev/null
+++ b/performance/results/baseline/js-bench/geometry.json
@@ -0,0 +1,317 @@
+{
+ "suite": "geometry",
+ "runtime": "bun 1.3.14 on darwin/arm64",
+ "recordedAt": "2026-09-10T13:31:46.864Z",
+ "series": [
+ {
+ "name": "polyline fixture generation",
+ "exponent": 0.889508932370853,
+ "measurements": [
+ {
+ "name": "generatePolylineCoordinates",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.014125000000007049,
+ "meanMs": 0.020153730000001674,
+ "minMs": 0.004958000000016227,
+ "p95Ms": 0.04691599999998175
+ },
+ {
+ "name": "generatePolylineCoordinates",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.054666999999994914,
+ "meanMs": 0.05523977500000129,
+ "minMs": 0.050791000000003805,
+ "p95Ms": 0.060624999999987494
+ },
+ {
+ "name": "generatePolylineCoordinates",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.5349170000000072,
+ "meanMs": 0.5406925250000014,
+ "minMs": 0.48554200000000947,
+ "p95Ms": 0.5864170000000399
+ },
+ {
+ "name": "generatePolylineCoordinates",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 6.093000000000075,
+ "meanMs": 6.20879779999999,
+ "minMs": 5.783374999999978,
+ "p95Ms": 6.946332999999981
+ }
+ ]
+ },
+ {
+ "name": "polygon fixture generation",
+ "exponent": 0.913862233568367,
+ "measurements": [
+ {
+ "name": "generatePolygonCoordinates",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.0059169999999824086,
+ "meanMs": 0.011183550000000366,
+ "minMs": 0.003917000000001281,
+ "p95Ms": 0.02045799999999076
+ },
+ {
+ "name": "generatePolygonCoordinates",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.05570800000000986,
+ "meanMs": 0.05108037999999979,
+ "minMs": 0.033582999999993035,
+ "p95Ms": 0.06295800000000895
+ },
+ {
+ "name": "generatePolygonCoordinates",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.4357919999999922,
+ "meanMs": 0.44941980499999945,
+ "minMs": 0.40091599999999517,
+ "p95Ms": 0.5206250000000523
+ },
+ {
+ "name": "generatePolygonCoordinates",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 3.3152919999999995,
+ "meanMs": 3.5288709000000096,
+ "minMs": 3.1888340000000426,
+ "p95Ms": 4.095624999999927
+ }
+ ]
+ },
+ {
+ "name": "Fabric deepDiffer, polyline with 10% points moved",
+ "exponent": -0.12084057746737904,
+ "measurements": [
+ {
+ "name": "deepDiffer polyline (10% points changed)",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.0002090000000123382,
+ "meanMs": 0.0005796200000006025,
+ "minMs": 0.00016600000000721593,
+ "p95Ms": 0.0017499999999870397
+ },
+ {
+ "name": "deepDiffer polyline (10% points changed)",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.00008400000001529406,
+ "meanMs": 0.00028898499999939985,
+ "minMs": 0.00008299999998939711,
+ "p95Ms": 0.00016600000000721593
+ },
+ {
+ "name": "deepDiffer polyline (10% points changed)",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.00008300000001781882,
+ "meanMs": 0.00010209999999943875,
+ "minMs": 0.00004100000001017179,
+ "p95Ms": 0.00012500000002546585
+ },
+ {
+ "name": "deepDiffer polyline (10% points changed)",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.00008300000001781882,
+ "meanMs": 0.00009989999999788779,
+ "minMs": 0.00004100000001017179,
+ "p95Ms": 0.00012500000002546585
+ }
+ ]
+ },
+ {
+ "name": "app-side immutable polyline update",
+ "exponent": 0.6914122109101433,
+ "measurements": [
+ {
+ "name": "perturbPolyline (app-side immutable update)",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.0024999999999977263,
+ "meanMs": 0.0029454150000002245,
+ "minMs": 0.0007080000000030395,
+ "p95Ms": 0.0037090000000148393
+ },
+ {
+ "name": "perturbPolyline (app-side immutable update)",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.0024999999999977263,
+ "meanMs": 0.0026799350000000287,
+ "minMs": 0.0017499999999870397,
+ "p95Ms": 0.004041999999998325
+ },
+ {
+ "name": "perturbPolyline (app-side immutable update)",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.0202499999999759,
+ "meanMs": 0.02046065000000141,
+ "minMs": 0.015625,
+ "p95Ms": 0.027208000000030097
+ },
+ {
+ "name": "perturbPolyline (app-side immutable update)",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.25108399999999165,
+ "meanMs": 0.24218325000000504,
+ "minMs": 0.18574999999998454,
+ "p95Ms": 0.2822079999999687
+ }
+ ]
+ },
+ {
+ "name": "haversine distance over route (utils/geo)",
+ "exponent": 0.9018293995293057,
+ "measurements": [
+ {
+ "name": "distanceBetween along route",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.0037920000000042364,
+ "meanMs": 0.005552119999999689,
+ "minMs": 0.0036249999999995453,
+ "p95Ms": 0.01937500000002501
+ },
+ {
+ "name": "distanceBetween along route",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.021874999999994316,
+ "meanMs": 0.023637054999998953,
+ "minMs": 0.019957999999974163,
+ "p95Ms": 0.024125000000026375
+ },
+ {
+ "name": "distanceBetween along route",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.19220799999999372,
+ "meanMs": 0.19253458499999937,
+ "minMs": 0.16599999999999682,
+ "p95Ms": 0.21854200000001356
+ },
+ {
+ "name": "distanceBetween along route",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 1.8636249999999563,
+ "meanMs": 1.920800149999991,
+ "minMs": 1.8283749999999372,
+ "p95Ms": 2.0402500000000146
+ }
+ ]
+ },
+ {
+ "name": "flatten to Float64Array (reference point, not a proposal)",
+ "exponent": 0.775687204588857,
+ "measurements": [
+ {
+ "name": "copy to Float64Array (reference: packed representation)",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.0009159999999894808,
+ "meanMs": 0.0014054100000008417,
+ "minMs": 0.0008330000000000837,
+ "p95Ms": 0.002458000000018501
+ },
+ {
+ "name": "copy to Float64Array (reference: packed representation)",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.0029170000000249274,
+ "meanMs": 0.00463538499999828,
+ "minMs": 0.0024579999999900792,
+ "p95Ms": 0.009875000000022283
+ },
+ {
+ "name": "copy to Float64Array (reference: packed representation)",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.018625000000042746,
+ "meanMs": 0.02175771999999938,
+ "minMs": 0.008458000000018728,
+ "p95Ms": 0.031833000000005995
+ },
+ {
+ "name": "copy to Float64Array (reference: packed representation)",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.19016599999997652,
+ "meanMs": 0.19759575000001064,
+ "minMs": 0.09820799999999963,
+ "p95Ms": 0.25216599999998834
+ }
+ ]
+ },
+ {
+ "name": "JSON payload size",
+ "exponent": 1.0004498020351926,
+ "measurements": [
+ {
+ "name": "JSON.stringify",
+ "n": 100,
+ "iterations": 3,
+ "medianMs": 0.0047919999999805896,
+ "meanMs": 0.004902999999994033,
+ "minMs": 0.004750000000001364,
+ "p95Ms": 0.005167000000000144,
+ "extra": {
+ "bytes": 4462,
+ "bytesPerPoint": 45
+ }
+ },
+ {
+ "name": "JSON.stringify",
+ "n": 1000,
+ "iterations": 3,
+ "medianMs": 0.058667000000014013,
+ "meanMs": 0.058763999999996486,
+ "minMs": 0.05783299999995961,
+ "p95Ms": 0.05979200000001583,
+ "extra": {
+ "bytes": 44773,
+ "bytesPerPoint": 45
+ }
+ },
+ {
+ "name": "JSON.stringify",
+ "n": 10000,
+ "iterations": 3,
+ "medianMs": 0.5311669999999822,
+ "meanMs": 0.5341943333333271,
+ "minMs": 0.47887500000001637,
+ "p95Ms": 0.5925409999999829,
+ "extra": {
+ "bytes": 447778,
+ "bytesPerPoint": 45
+ }
+ },
+ {
+ "name": "JSON.stringify",
+ "n": 100000,
+ "iterations": 3,
+ "medianMs": 4.970542000000023,
+ "meanMs": 4.969444333333324,
+ "minMs": 4.759415999999987,
+ "p95Ms": 5.17837499999996,
+ "extra": {
+ "bytes": 4477789,
+ "bytesPerPoint": 45
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/performance/results/baseline/js-bench/serialization.json b/performance/results/baseline/js-bench/serialization.json
new file mode 100644
index 0000000..52e0f21
--- /dev/null
+++ b/performance/results/baseline/js-bench/serialization.json
@@ -0,0 +1,443 @@
+{
+ "suite": "serialization",
+ "runtime": "bun 1.3.14 on darwin/arm64",
+ "recordedAt": "2026-09-10T13:33:09.588Z",
+ "series": [
+ {
+ "name": "fixture generation",
+ "exponent": 0.9700192729033909,
+ "measurements": [
+ {
+ "name": "generateMarkers",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.011583000000030097,
+ "meanMs": 0.019426009999996836,
+ "minMs": 0.0065830000000346445,
+ "p95Ms": 0.06037500000002183
+ },
+ {
+ "name": "generateMarkers",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.07900000000000773,
+ "meanMs": 0.08384266000000054,
+ "minMs": 0.024042000000008557,
+ "p95Ms": 0.1451659999999606
+ },
+ {
+ "name": "generateMarkers",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.8899160000000279,
+ "meanMs": 0.9620414250000028,
+ "minMs": 0.6209169999999631,
+ "p95Ms": 1.7679160000000138
+ },
+ {
+ "name": "generateMarkers",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 8.843917000000033,
+ "meanMs": 9.591666799999995,
+ "minMs": 7.125499999999988,
+ "p95Ms": 13.122666999999979
+ }
+ ]
+ },
+ {
+ "name": "normalizeMarkerDescriptors, fresh array of same objects",
+ "exponent": 0.6134932711432446,
+ "measurements": [
+ {
+ "name": "normalize (new array)",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.005249999999989541,
+ "meanMs": 0.00720618999999914,
+ "minMs": 0.002957999999978256,
+ "p95Ms": 0.015249999999980446
+ },
+ {
+ "name": "normalize (new array)",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.01720799999998235,
+ "meanMs": 0.02153646000000009,
+ "minMs": 0.014750000000049113,
+ "p95Ms": 0.028999999999996362
+ },
+ {
+ "name": "normalize (new array)",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.04345899999998437,
+ "meanMs": 0.050008110000001695,
+ "minMs": 0.025250000000028194,
+ "p95Ms": 0.08716600000002472
+ },
+ {
+ "name": "normalize (new array)",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.4275830000000269,
+ "meanMs": 0.5497353999999973,
+ "minMs": 0.39549999999997,
+ "p95Ms": 0.9091250000000173
+ }
+ ]
+ },
+ {
+ "name": "normalizeMarkerDescriptors, unchanged reference",
+ "exponent": 0.6918410713492776,
+ "measurements": [
+ {
+ "name": "normalize (same objects)",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.003917000000001281,
+ "meanMs": 0.004991255000000479,
+ "minMs": 0.0025409999999510546,
+ "p95Ms": 0.010625000000004547
+ },
+ {
+ "name": "normalize (same objects)",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.0022910000000138098,
+ "meanMs": 0.007419785000000729,
+ "minMs": 0.0020419999999603533,
+ "p95Ms": 0.025708000000008724
+ },
+ {
+ "name": "normalize (same objects)",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.029374999999959073,
+ "meanMs": 0.036107650000005834,
+ "minMs": 0.020541999999977634,
+ "p95Ms": 0.08262499999989359
+ },
+ {
+ "name": "normalize (same objects)",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.33866699999998673,
+ "meanMs": 0.4059708500000056,
+ "minMs": 0.3093750000000455,
+ "p95Ms": 0.8418340000000626
+ }
+ ]
+ },
+ {
+ "name": "normalizeMarkerDescriptors, one marker changed",
+ "exponent": 0.7228230301719446,
+ "measurements": [
+ {
+ "name": "normalize (1 changed)",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.003333999999995285,
+ "meanMs": 0.004253485000001547,
+ "minMs": 0.0027910000000019863,
+ "p95Ms": 0.008500000000026375
+ },
+ {
+ "name": "normalize (1 changed)",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.002124999999978172,
+ "meanMs": 0.0022887350000002017,
+ "minMs": 0.0019580000000019027,
+ "p95Ms": 0.003333999999995285
+ },
+ {
+ "name": "normalize (1 changed)",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.027874999999994543,
+ "meanMs": 0.03761836000000016,
+ "minMs": 0.020792000000028565,
+ "p95Ms": 0.07379099999991467
+ },
+ {
+ "name": "normalize (1 changed)",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.3628750000000309,
+ "meanMs": 0.46552100000001817,
+ "minMs": 0.3268750000000864,
+ "p95Ms": 0.7905420000000731
+ }
+ ]
+ },
+ {
+ "name": "Fabric deepDiffer, first marker changed (early exit)",
+ "exponent": -0.2619900956546722,
+ "measurements": [
+ {
+ "name": "deepDiffer first changed",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.0002499999999940883,
+ "meanMs": 0.0009258399999995958,
+ "minMs": 0.00016599999997879422,
+ "p95Ms": 0.002375000000029104
+ },
+ {
+ "name": "deepDiffer first changed",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.00008300000001781882,
+ "meanMs": 0.00010079500000045982,
+ "minMs": 0.00004100000001017179,
+ "p95Ms": 0.00012499999996862243
+ },
+ {
+ "name": "deepDiffer first changed",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.00004200000000764703,
+ "meanMs": 0.00007000000000061845,
+ "minMs": 0.00004099999989648495,
+ "p95Ms": 0.00008400000001529406
+ },
+ {
+ "name": "deepDiffer first changed",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.00004200000000764703,
+ "meanMs": 0.00008135000000493164,
+ "minMs": 0.00004100000001017179,
+ "p95Ms": 0.00008400000001529406
+ }
+ ]
+ },
+ {
+ "name": "Fabric deepDiffer, last marker changed (walks all, then exits)",
+ "exponent": 0.781218040117454,
+ "measurements": [
+ {
+ "name": "deepDiffer last changed",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.001625000000046839,
+ "meanMs": 0.0019666349999985754,
+ "minMs": 0.0013749999999959073,
+ "p95Ms": 0.002207999999995991
+ },
+ {
+ "name": "deepDiffer last changed",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.0047089999999911925,
+ "meanMs": 0.005078954999999894,
+ "minMs": 0.004083000000036918,
+ "p95Ms": 0.006792000000018561
+ },
+ {
+ "name": "deepDiffer last changed",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.03345900000010715,
+ "meanMs": 0.03730500500000176,
+ "minMs": 0.03274999999996453,
+ "p95Ms": 0.05391700000006949
+ },
+ {
+ "name": "deepDiffer last changed",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.3396659999999656,
+ "meanMs": 0.3503124500000183,
+ "minMs": 0.33358400000008714,
+ "p95Ms": 0.39029199999993125
+ }
+ ]
+ },
+ {
+ "name": "Fabric deepDiffer, new array of the same objects (walks all, no exit)",
+ "exponent": 0.8006380646111241,
+ "measurements": [
+ {
+ "name": "deepDiffer new array, same objects",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.001416000000006079,
+ "meanMs": 0.0016716449999989891,
+ "minMs": 0.000624999999956799,
+ "p95Ms": 0.001833999999973912
+ },
+ {
+ "name": "deepDiffer new array, same objects",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.004416999999989457,
+ "meanMs": 0.005655420000000504,
+ "minMs": 0.004000000000019099,
+ "p95Ms": 0.011625000000037744
+ },
+ {
+ "name": "deepDiffer new array, same objects",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.03337499999997817,
+ "meanMs": 0.03568646999999828,
+ "minMs": 0.032500000000027285,
+ "p95Ms": 0.04949999999996635
+ },
+ {
+ "name": "deepDiffer new array, same objects",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.33658299999990504,
+ "meanMs": 0.38268735000000903,
+ "minMs": 0.33074999999996635,
+ "p95Ms": 0.6707910000000084
+ }
+ ]
+ },
+ {
+ "name": "Fabric deepDiffer, same reference (fast path)",
+ "exponent": -0.13533163503416018,
+ "measurements": [
+ {
+ "name": "deepDiffer same ref",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.00012500000002546585,
+ "meanMs": 0.00026436500000045273,
+ "minMs": 0.00004100000001017179,
+ "p95Ms": 0.00020799999998644125
+ },
+ {
+ "name": "deepDiffer same ref",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.00004200000000764703,
+ "meanMs": 0.000055839999999705016,
+ "minMs": 0,
+ "p95Ms": 0.00004200000000764703
+ },
+ {
+ "name": "deepDiffer same ref",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0,
+ "meanMs": 0.000023520000001440168,
+ "minMs": 0,
+ "p95Ms": 0.00004200000000764703
+ },
+ {
+ "name": "deepDiffer same ref",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.00004200000000764703,
+ "meanMs": 0.000047949999998309065,
+ "minMs": 0,
+ "p95Ms": 0.00004200000000764703
+ }
+ ]
+ },
+ {
+ "name": "immutable 1% mutation (app-side cost)",
+ "exponent": 0.8242836383975568,
+ "measurements": [
+ {
+ "name": "moveMarkerFraction 1%",
+ "n": 100,
+ "iterations": 200,
+ "medianMs": 0.001167000000009466,
+ "meanMs": 0.001887964999999383,
+ "minMs": 0.0005830000000059954,
+ "p95Ms": 0.004583000000025095
+ },
+ {
+ "name": "moveMarkerFraction 1%",
+ "n": 1000,
+ "iterations": 200,
+ "medianMs": 0.0034999999999740794,
+ "meanMs": 0.004597530000001768,
+ "minMs": 0.0026659999999765205,
+ "p95Ms": 0.011167000000000371
+ },
+ {
+ "name": "moveMarkerFraction 1%",
+ "n": 10000,
+ "iterations": 200,
+ "medianMs": 0.015833000000043285,
+ "meanMs": 0.01997519499999896,
+ "minMs": 0.012249999999994543,
+ "p95Ms": 0.025040999999987434
+ },
+ {
+ "name": "moveMarkerFraction 1%",
+ "n": 100000,
+ "iterations": 20,
+ "medianMs": 0.3946250000000191,
+ "meanMs": 0.38562084999999796,
+ "minMs": 0.20974999999998545,
+ "p95Ms": 0.5993750000000091
+ }
+ ]
+ },
+ {
+ "name": "JSON payload size (stringify; bytes = wire-equivalent size)",
+ "exponent": 0.9635287310277506,
+ "measurements": [
+ {
+ "name": "JSON.stringify",
+ "n": 100,
+ "iterations": 3,
+ "medianMs": 0.009332999999969616,
+ "meanMs": 0.009069666666675857,
+ "minMs": 0.008209000000022115,
+ "p95Ms": 0.009667000000035841,
+ "extra": {
+ "bytes": 7167,
+ "bytesPerMarker": 72
+ }
+ },
+ {
+ "name": "JSON.stringify",
+ "n": 1000,
+ "iterations": 3,
+ "medianMs": 0.11516699999998536,
+ "meanMs": 0.12011133333332207,
+ "minMs": 0.100166999999999,
+ "p95Ms": 0.1449999999999818,
+ "extra": {
+ "bytes": 72648,
+ "bytesPerMarker": 73
+ }
+ },
+ {
+ "name": "JSON.stringify",
+ "n": 10000,
+ "iterations": 3,
+ "medianMs": 0.7227090000000089,
+ "meanMs": 0.7443750000000288,
+ "minMs": 0.7089580000000524,
+ "p95Ms": 0.8014580000000251,
+ "extra": {
+ "bytes": 736606,
+ "bytesPerMarker": 74
+ }
+ },
+ {
+ "name": "JSON.stringify",
+ "n": 100000,
+ "iterations": 3,
+ "medianMs": 8.239583000000039,
+ "meanMs": 8.312166333333343,
+ "minMs": 7.685000000000059,
+ "p95Ms": 9.011915999999928,
+ "extra": {
+ "bytes": 7466242,
+ "bytesPerMarker": 75
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/performance/results/baseline/native/jvm-pipeline.jsonl b/performance/results/baseline/native/jvm-pipeline.jsonl
new file mode 100644
index 0000000..5038369
--- /dev/null
+++ b/performance/results/baseline/native/jvm-pipeline.jsonl
@@ -0,0 +1,43 @@
+# Android pipeline micro-benchmark on the JVM (package/android/src/test PipelineBenchmarkTest)
+# host: Apple M5 Pro, macOS 26.6, JBR openjdk version "25.0.2" 2026-01-20, recorded 2026-09-10T13:53:13Z
+# desktop JIT numbers: use for algorithmic scaling only, not device cost
+{"platform":"jvm","op":"fingerprint","n":1000,"items":1000,"medianMs":0.106,"minMs":0.092,"maxMs":0.352,"iterations":30}
+{"platform":"jvm","op":"indexBuild","n":1000,"items":1000,"medianMs":0.092,"minMs":0.067,"maxMs":0.362,"iterations":30}
+{"platform":"jvm","op":"candidates(city)","n":1000,"items":1000,"medianMs":0.004,"minMs":0.004,"maxMs":0.013,"iterations":30}
+{"platform":"jvm","op":"candidates(country)","n":1000,"items":1000,"medianMs":0.198,"minMs":0.131,"maxMs":0.631,"iterations":30}
+{"platform":"jvm","op":"viewportFilter(city)","n":1000,"items":18,"medianMs":0.005,"minMs":0.004,"maxMs":0.024,"iterations":30}
+{"platform":"jvm","op":"clusters(country)","n":1000,"items":1000,"medianMs":0.704,"minMs":0.591,"maxMs":1.446,"iterations":30}
+{"platform":"jvm","op":"clusters(city)","n":1000,"items":18,"medianMs":0.031,"minMs":0.030,"maxMs":0.035,"iterations":30}
+{"platform":"jvm","op":"diff(unchanged)","n":1000,"items":23,"medianMs":0.007,"minMs":0.005,"maxMs":0.014,"iterations":30}
+{"platform":"jvm","op":"diff(empty)","n":1000,"items":23,"medianMs":0.004,"minMs":0.003,"maxMs":0.007,"iterations":30}
+{"platform":"jvm","op":"singles(all)","n":1000,"items":1000,"medianMs":0.066,"minMs":0.055,"maxMs":1.038,"iterations":30}
+{"platform":"jvm","op":"fingerprint","n":10000,"items":10000,"medianMs":0.882,"minMs":0.726,"maxMs":1.243,"iterations":30}
+{"platform":"jvm","op":"indexBuild","n":10000,"items":10000,"medianMs":0.171,"minMs":0.156,"maxMs":0.516,"iterations":30}
+{"platform":"jvm","op":"candidates(city)","n":10000,"items":10000,"medianMs":0.001,"minMs":0.001,"maxMs":0.007,"iterations":30}
+{"platform":"jvm","op":"candidates(country)","n":10000,"items":10000,"medianMs":0.176,"minMs":0.149,"maxMs":1.112,"iterations":30}
+{"platform":"jvm","op":"viewportFilter(city)","n":10000,"items":148,"medianMs":0.014,"minMs":0.014,"maxMs":0.016,"iterations":30}
+{"platform":"jvm","op":"clusters(country)","n":10000,"items":10000,"medianMs":2.857,"minMs":2.455,"maxMs":3.570,"iterations":30}
+{"platform":"jvm","op":"clusters(city)","n":10000,"items":148,"medianMs":0.159,"minMs":0.106,"maxMs":0.474,"iterations":30}
+{"platform":"jvm","op":"diff(unchanged)","n":10000,"items":21,"medianMs":0.004,"minMs":0.004,"maxMs":0.007,"iterations":30}
+{"platform":"jvm","op":"diff(empty)","n":10000,"items":21,"medianMs":0.003,"minMs":0.003,"maxMs":0.046,"iterations":30}
+{"platform":"jvm","op":"singles(all)","n":10000,"items":10000,"medianMs":0.612,"minMs":0.514,"maxMs":1.228,"iterations":30}
+{"platform":"jvm","op":"fingerprint","n":50000,"items":50000,"medianMs":3.825,"minMs":3.718,"maxMs":5.350,"iterations":6}
+{"platform":"jvm","op":"indexBuild","n":50000,"items":50000,"medianMs":0.672,"minMs":0.559,"maxMs":0.730,"iterations":6}
+{"platform":"jvm","op":"candidates(city)","n":50000,"items":50000,"medianMs":0.002,"minMs":0.001,"maxMs":0.003,"iterations":6}
+{"platform":"jvm","op":"candidates(country)","n":50000,"items":50000,"medianMs":0.112,"minMs":0.096,"maxMs":0.162,"iterations":6}
+{"platform":"jvm","op":"viewportFilter(city)","n":50000,"items":791,"medianMs":0.099,"minMs":0.078,"maxMs":0.103,"iterations":6}
+{"platform":"jvm","op":"clusters(country)","n":50000,"items":50000,"medianMs":14.487,"minMs":14.236,"maxMs":15.150,"iterations":6}
+{"platform":"jvm","op":"clusters(city)","n":50000,"items":791,"medianMs":0.369,"minMs":0.342,"maxMs":0.413,"iterations":6}
+{"platform":"jvm","op":"diff(unchanged)","n":50000,"items":16,"medianMs":0.004,"minMs":0.003,"maxMs":0.010,"iterations":6}
+{"platform":"jvm","op":"diff(empty)","n":50000,"items":16,"medianMs":0.003,"minMs":0.002,"maxMs":0.004,"iterations":6}
+{"platform":"jvm","op":"singles(all)","n":50000,"items":50000,"medianMs":2.836,"minMs":2.523,"maxMs":2.873,"iterations":6}
+{"platform":"jvm","op":"fingerprint","n":100000,"items":100000,"medianMs":8.529,"minMs":8.302,"maxMs":11.420,"iterations":3}
+{"platform":"jvm","op":"indexBuild","n":100000,"items":100000,"medianMs":1.458,"minMs":1.325,"maxMs":1.463,"iterations":3}
+{"platform":"jvm","op":"candidates(city)","n":100000,"items":100000,"medianMs":0.002,"minMs":0.002,"maxMs":0.002,"iterations":3}
+{"platform":"jvm","op":"candidates(country)","n":100000,"items":100000,"medianMs":0.128,"minMs":0.119,"maxMs":0.152,"iterations":3}
+{"platform":"jvm","op":"viewportFilter(city)","n":100000,"items":2007,"medianMs":0.457,"minMs":0.433,"maxMs":0.457,"iterations":3}
+{"platform":"jvm","op":"clusters(country)","n":100000,"items":100000,"medianMs":40.888,"minMs":34.050,"maxMs":46.127,"iterations":3}
+{"platform":"jvm","op":"clusters(city)","n":100000,"items":2007,"medianMs":0.386,"minMs":0.373,"maxMs":0.393,"iterations":3}
+{"platform":"jvm","op":"diff(unchanged)","n":100000,"items":15,"medianMs":0.003,"minMs":0.002,"maxMs":0.004,"iterations":3}
+{"platform":"jvm","op":"diff(empty)","n":100000,"items":15,"medianMs":0.002,"minMs":0.002,"maxMs":0.002,"iterations":3}
+{"platform":"jvm","op":"singles(all)","n":100000,"items":100000,"medianMs":3.803,"minMs":3.796,"maxMs":4.742,"iterations":3}
diff --git a/performance/results/bench/.gitkeep b/performance/results/bench/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/performance/results/runs/.gitkeep b/performance/results/runs/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/performance/scenarios/camera.ts b/performance/scenarios/camera.ts
new file mode 100644
index 0000000..f2fb049
--- /dev/null
+++ b/performance/scenarios/camera.ts
@@ -0,0 +1,169 @@
+import { WARSAW_CENTER, WARSAW_REGION } from '../fixtures/regions';
+import { markers } from '../fixtures';
+import {
+ continuousPan,
+ countLabel,
+ pan,
+ pitch,
+ rapidMoves,
+ rotate,
+ zoomSweep,
+} from './helpers';
+import type { Scenario, ScenarioContext, ScenarioTag } from './types';
+
+export type CameraKind =
+ | 'idle'
+ | 'slow-pan'
+ | 'fast-pan'
+ | 'continuous-pan'
+ | 'zoom-in'
+ | 'zoom-out'
+ | 'rapid-zoom'
+ | 'rotate'
+ | 'pitch'
+ | 'rapid';
+
+interface CameraKindDefinition {
+ description: string;
+ estimatedDurationMs: number;
+ run(context: ScenarioContext): Promise;
+}
+
+export const CAMERA_KINDS: Record = {
+ idle: {
+ description:
+ 'No camera movement for 5 s; measures the resting cost of the scene.',
+ estimatedDurationMs: 5000,
+ run: (context) => context.sleep(5000),
+ },
+ 'slow-pan': {
+ description: 'Four slow animated pan legs (1.2 s each, small steps).',
+ estimatedDurationMs: 7000,
+ run: (context) =>
+ pan(context, WARSAW_CENTER, { legs: 4, legMs: 1200, stepDegrees: 0.02 }),
+ },
+ 'fast-pan': {
+ description: 'Six fast animated pan legs (400 ms each, larger steps).',
+ estimatedDurationMs: 5000,
+ run: (context) =>
+ pan(context, WARSAW_CENTER, { legs: 6, legMs: 400, stepDegrees: 0.04 }),
+ },
+ 'continuous-pan': {
+ description:
+ 'Six seconds of back-to-back pan legs with no settle between them.',
+ estimatedDurationMs: 7000,
+ run: (context) =>
+ continuousPan(context, WARSAW_CENTER, { durationMs: 6000 }),
+ },
+ 'zoom-in': {
+ description: 'Zoom from country scale into street scale in four steps.',
+ estimatedDurationMs: 5000,
+ run: (context) =>
+ zoomSweep(context, WARSAW_CENTER, [8, 10, 12, 14, 16], 800),
+ },
+ 'zoom-out': {
+ description: 'Zoom from street scale out to country scale in four steps.',
+ estimatedDurationMs: 5000,
+ run: (context) =>
+ zoomSweep(context, WARSAW_CENTER, [16, 14, 12, 10, 8], 800),
+ },
+ 'rapid-zoom': {
+ description:
+ 'Ten alternating zoom jumps of 300 ms each across three octaves.',
+ estimatedDurationMs: 5000,
+ run: (context) =>
+ zoomSweep(
+ context,
+ WARSAW_CENTER,
+ [10, 13, 10, 13, 11, 14, 10, 13, 12, 12],
+ 300,
+ 60,
+ ),
+ },
+ rotate: {
+ description: 'Four heading changes of 90° at city zoom.',
+ estimatedDurationMs: 4000,
+ run: (context) => rotate(context, WARSAW_CENTER, [90, 180, 270, 0], 700),
+ },
+ pitch: {
+ description: 'Pitch to 45°, 60°, back to 0° at street zoom.',
+ estimatedDurationMs: 4000,
+ run: (context) => pitch(context, WARSAW_CENTER, [45, 60, 0], 700),
+ },
+ rapid: {
+ description: 'Twenty 150 ms flicks mixing small pans and half-zoom steps.',
+ estimatedDurationMs: 5000,
+ run: (context) => rapidMoves(context, WARSAW_CENTER, 20, 150),
+ },
+};
+
+export const CAMERA_MARKER_COUNTS = [0, 1000, 10_000, 50_000] as const;
+
+function tagsFor(kind: CameraKind, count: number): ScenarioTag[] {
+ const tags: ScenarioTag[] = [];
+ if (count === 10_000 || (kind === 'fast-pan' && count !== 10_000)) {
+ tags.push('baseline');
+ }
+ if (kind === 'fast-pan' && count === 10_000) {
+ tags.push('quick');
+ }
+ if (count === 50_000) {
+ tags.push('heavy');
+ }
+ return tags;
+}
+
+export function cameraScenario(
+ kind: CameraKind,
+ markerCount: number,
+): Scenario {
+ const definition = CAMERA_KINDS[kind];
+ const label = countLabel(markerCount);
+ return {
+ id: `camera-${kind}-${label}`,
+ name: `Camera ${kind}, ${label} markers`,
+ group: 'camera',
+ description: `${definition.description} Scene: ${markerCount} markers.`,
+ tags: tagsFor(kind, markerCount),
+ props: () => ({
+ region: WARSAW_REGION,
+ markers: markerCount > 0 ? markers(markerCount) : undefined,
+ }),
+ settleMs:
+ markerCount >= 50_000 ? 4000 : markerCount >= 10_000 ? 2500 : 1200,
+ estimatedDurationMs: definition.estimatedDurationMs + 3000,
+ run: definition.run,
+ };
+}
+
+export const CAMERA_SCENARIOS: Scenario[] = [
+ ...CAMERA_MARKER_COUNTS.flatMap((count) =>
+ (Object.keys(CAMERA_KINDS) as CameraKind[]).map((kind) =>
+ cameraScenario(kind, count),
+ ),
+ ),
+ {
+ id: 'camera-gesture-pan-10k',
+ name: 'Real gesture pan, 10k markers',
+ group: 'camera',
+ description:
+ 'Records for 8 s while an external driver performs touch swipes (the CLI does this on Android with adb; on iOS use Maestro or a finger).',
+ tags: ['gesture'],
+ props: () => ({ region: WARSAW_REGION, markers: markers(10_000) }),
+ settleMs: 2500,
+ estimatedDurationMs: 11_000,
+ run: (context) => context.gestureWindow('pan', 8000),
+ },
+ {
+ id: 'camera-gesture-zoom-10k',
+ name: 'Real gesture zoom, 10k markers',
+ group: 'camera',
+ description:
+ 'Records for 8 s while an external driver performs pinch gestures (Android: adb multi-touch swipes).',
+ tags: ['gesture'],
+ props: () => ({ region: WARSAW_REGION, markers: markers(10_000) }),
+ settleMs: 2500,
+ estimatedDurationMs: 11_000,
+ run: (context) => context.gestureWindow('zoom', 8000),
+ },
+];
diff --git a/performance/scenarios/clustering.ts b/performance/scenarios/clustering.ts
new file mode 100644
index 0000000..4d99dae
--- /dev/null
+++ b/performance/scenarios/clustering.ts
@@ -0,0 +1,54 @@
+import { POLAND_CENTER, POLAND_REGION } from '../fixtures/regions';
+import { markers, moveMarkerFraction } from '../fixtures';
+import { countLabel, pan, zoomSweep } from './helpers';
+import type { Scenario, ScenarioContext, ScenarioTag } from './types';
+
+function clusterScenario(count: number, tags: ScenarioTag[]): Scenario {
+ const label = countLabel(count);
+ return {
+ id: `cluster-${label}`,
+ name: `Clustering, ${label} markers`,
+ group: 'clustering',
+ description: `${count} clusterable markers at country scale: zoom sweep across octaves, a wide pan, then a 1 % marker update. Native spans separate cluster compute from apply.`,
+ tags,
+ props: () => ({
+ region: POLAND_REGION,
+ markers: markers(count, { clusterable: true }),
+ clusteringEnabled: true,
+ }),
+ settleMs: count >= 50_000 ? 4000 : 2500,
+ estimatedDurationMs: 16_000,
+ async run(context: ScenarioContext) {
+ await context.step('zoom-sweep', () =>
+ zoomSweep(context, POLAND_CENTER, [7, 9, 12, 8, 5], 900),
+ );
+ await context.step('pan', () =>
+ pan(context, POLAND_CENTER, { legs: 4, stepDegrees: 0.4, zoom: 6 }),
+ );
+ await context.step(
+ 'update-1pct',
+ async () => {
+ await context.setProps(
+ {
+ markers: moveMarkerFraction(
+ markers(count, { clusterable: true }),
+ 0.01,
+ 1,
+ ),
+ },
+ 'update-1pct',
+ );
+ await context.sleep(1200);
+ },
+ { changed: Math.round(count * 0.01), total: count },
+ );
+ },
+ };
+}
+
+export const CLUSTERING_SCENARIOS: Scenario[] = [
+ clusterScenario(1000, ['baseline', 'quick']),
+ clusterScenario(10_000, ['baseline', 'quick']),
+ clusterScenario(50_000, ['baseline']),
+ clusterScenario(100_000, ['heavy']),
+];
diff --git a/performance/scenarios/combined.ts b/performance/scenarios/combined.ts
new file mode 100644
index 0000000..0ccc769
--- /dev/null
+++ b/performance/scenarios/combined.ts
@@ -0,0 +1,182 @@
+import {
+ POLAND_CENTER,
+ POLAND_REGION,
+ WARSAW_CENTER,
+ WARSAW_REGION,
+} from '../fixtures/regions';
+import {
+ generatePolygons,
+ generatePolyline,
+ markers,
+ moveFirstMarkers,
+ moveMarkerFraction,
+ perturbPolyline,
+} from '../fixtures';
+import { pan, zoomSweep } from './helpers';
+import type { Scenario } from './types';
+
+export const COMBINED_SCENARIOS: Scenario[] = [
+ {
+ id: 'combined-10k-camera',
+ name: '10k markers + camera',
+ group: 'combined',
+ description:
+ 'Six fast pan legs and a zoom sweep with 10k markers (no clustering).',
+ tags: ['baseline', 'quick'],
+ props: () => ({ region: WARSAW_REGION, markers: markers(10_000) }),
+ settleMs: 2500,
+ estimatedDurationMs: 12_000,
+ async run(context) {
+ await pan(context, WARSAW_CENTER, {
+ legs: 6,
+ legMs: 400,
+ stepDegrees: 0.04,
+ });
+ await zoomSweep(context, WARSAW_CENTER, [10, 14, 12], 700);
+ },
+ },
+ {
+ id: 'combined-10k-cluster-camera',
+ name: '10k markers + clustering + camera',
+ group: 'combined',
+ description:
+ 'Zoom sweep and pan with 10k clustered markers at country scale.',
+ tags: ['baseline'],
+ props: () => ({
+ region: POLAND_REGION,
+ markers: markers(10_000, { clusterable: true }),
+ clusteringEnabled: true,
+ }),
+ settleMs: 2500,
+ estimatedDurationMs: 12_000,
+ async run(context) {
+ await zoomSweep(context, POLAND_CENTER, [7, 10, 6], 800);
+ await pan(context, POLAND_CENTER, {
+ legs: 4,
+ stepDegrees: 0.4,
+ zoom: 6,
+ legMs: 500,
+ });
+ },
+ },
+ {
+ id: 'combined-10k-updates',
+ name: '10k markers + updates',
+ group: 'combined',
+ description:
+ '1 % of 10k markers move at 5 Hz for 5 s while the camera pans slowly.',
+ tags: ['baseline'],
+ props: () => ({ region: WARSAW_REGION, markers: markers(10_000) }),
+ settleMs: 2500,
+ estimatedDurationMs: 9000,
+ async run(context) {
+ let current = markers(10_000);
+ const panning = pan(context, WARSAW_CENTER, {
+ legs: 4,
+ legMs: 1200,
+ stepDegrees: 0.02,
+ });
+ await context.step('updates-while-panning', async () => {
+ for (let tick = 1; tick <= 25; tick += 1) {
+ current = moveMarkerFraction(current, 0.01, tick);
+ await context.setProps({ markers: current }, `tick-${tick}`);
+ await context.sleep(200);
+ }
+ });
+ await panning;
+ },
+ },
+ {
+ id: 'combined-10k-polyline',
+ name: '10k markers + 10k-point polyline',
+ group: 'combined',
+ description:
+ 'A 10k-point route over 10k markers: three route updates, then a pan.',
+ tags: ['baseline'],
+ props: () => ({
+ region: WARSAW_REGION,
+ markers: markers(10_000),
+ polylines: [generatePolyline(10_000)],
+ }),
+ settleMs: 2500,
+ estimatedDurationMs: 10_000,
+ async run(context) {
+ let route = generatePolyline(10_000);
+ for (let tick = 0; tick < 3; tick += 1) {
+ await context.step('route-update', async () => {
+ route = perturbPolyline(route, tick);
+ await context.setProps({ polylines: [route] }, 'route-update');
+ await context.sleep(400);
+ });
+ }
+ await pan(context, WARSAW_CENTER, { legs: 4, legMs: 500 });
+ },
+ },
+ {
+ id: 'combined-10k-polygon',
+ name: '10k markers + 200 polygons',
+ group: 'combined',
+ description: '200 polygons over 10k markers: three restyles, then a pan.',
+ tags: ['baseline'],
+ props: () => ({
+ region: WARSAW_REGION,
+ markers: markers(10_000),
+ polygons: generatePolygons(200, 20),
+ }),
+ settleMs: 2500,
+ estimatedDurationMs: 10_000,
+ async run(context) {
+ const areas = generatePolygons(200, 20);
+ const fills = ['#34C75944', '#FF950044', '#AF52DE44'];
+ for (let tick = 0; tick < fills.length; tick += 1) {
+ await context.step('restyle-all', async () => {
+ await context.setProps(
+ {
+ polygons: areas.map((area) => ({
+ ...area,
+ fillColor: fills[tick],
+ })),
+ },
+ 'restyle-all',
+ );
+ await context.sleep(400);
+ });
+ }
+ await pan(context, WARSAW_CENTER, { legs: 4, legMs: 500 });
+ },
+ },
+ {
+ id: 'combined-all',
+ name: 'Markers + clustering + geometry + camera + updates',
+ group: 'combined',
+ description:
+ '10k clustered markers, a 5k-point route and 100 polygons; zoom sweep, pan, and 100 moving markers at 5 Hz.',
+ tags: ['baseline'],
+ props: () => ({
+ region: POLAND_REGION,
+ markers: markers(10_000, { clusterable: true }),
+ clusteringEnabled: true,
+ polylines: [generatePolyline(5000)],
+ polygons: generatePolygons(100, 20),
+ }),
+ settleMs: 3000,
+ estimatedDurationMs: 16_000,
+ async run(context) {
+ let current = markers(10_000, { clusterable: true });
+ await zoomSweep(context, POLAND_CENTER, [7, 11, 13], 800);
+ const panning = pan(context, WARSAW_CENTER, {
+ legs: 4,
+ legMs: 900,
+ stepDegrees: 0.02,
+ });
+ await context.step('updates-while-panning', async () => {
+ for (let tick = 1; tick <= 20; tick += 1) {
+ current = moveFirstMarkers(current, 100, tick);
+ await context.setProps({ markers: current }, `tick-${tick}`);
+ await context.sleep(200);
+ }
+ });
+ await panning;
+ },
+ },
+];
diff --git a/performance/scenarios/geometry.ts b/performance/scenarios/geometry.ts
new file mode 100644
index 0000000..9d9f353
--- /dev/null
+++ b/performance/scenarios/geometry.ts
@@ -0,0 +1,179 @@
+import { WARSAW_CENTER, WARSAW_REGION } from '../fixtures/regions';
+import {
+ generatePolygon,
+ generatePolygons,
+ generatePolyline,
+ generatePolylines,
+ perturbPolyline,
+ restylePolyline,
+} from '../fixtures';
+import { countLabel, pan } from './helpers';
+import type { Scenario, ScenarioContext, ScenarioTag } from './types';
+
+function polylineScenario(points: number, tags: ScenarioTag[]): Scenario {
+ const label = countLabel(points);
+ return {
+ id: `polyline-${label}`,
+ name: `Polyline, ${label} points`,
+ group: 'geometry',
+ description: `One ${points}-point polyline: mount, five style-only updates, three geometry updates, then a short pan.`,
+ tags,
+ props: () => ({
+ region: WARSAW_REGION,
+ polylines: [generatePolyline(points)],
+ }),
+ settleMs: 1500,
+ estimatedDurationMs: 12_000,
+ async run(context: ScenarioContext) {
+ let route = generatePolyline(points);
+ for (let tick = 0; tick < 5; tick += 1) {
+ await context.step(
+ 'restyle',
+ async () => {
+ route = restylePolyline(route, tick);
+ await context.setProps({ polylines: [route] }, 'restyle');
+ await context.sleep(300);
+ },
+ { points, tick },
+ );
+ }
+ for (let tick = 0; tick < 3; tick += 1) {
+ await context.step(
+ 'perturb',
+ async () => {
+ route = perturbPolyline(route, tick);
+ await context.setProps({ polylines: [route] }, 'perturb');
+ await context.sleep(300);
+ },
+ { points, tick },
+ );
+ }
+ await pan(context, WARSAW_CENTER, { legs: 3, legMs: 500 });
+ },
+ };
+}
+
+function polygonScenario(points: number, tags: ScenarioTag[]): Scenario {
+ const label = countLabel(points);
+ return {
+ id: `polygon-${label}`,
+ name: `Polygon, ${label} vertices`,
+ group: 'geometry',
+ description: `One ${points}-vertex polygon: mount, five fill/stroke updates, then a short pan.`,
+ tags,
+ props: () => ({
+ region: WARSAW_REGION,
+ polygons: [generatePolygon(points)],
+ }),
+ settleMs: 1500,
+ estimatedDurationMs: 9000,
+ async run(context: ScenarioContext) {
+ const area = generatePolygon(points);
+ const fills = [
+ '#34C75944',
+ '#FF950044',
+ '#AF52DE44',
+ '#FF2D5544',
+ '#007AFF44',
+ ];
+ for (let tick = 0; tick < fills.length; tick += 1) {
+ await context.step(
+ 'restyle',
+ async () => {
+ await context.setProps(
+ {
+ polygons: [
+ { ...area, fillColor: fills[tick], strokeWidth: 2 + tick },
+ ],
+ },
+ 'restyle',
+ );
+ await context.sleep(300);
+ },
+ { points, tick },
+ );
+ }
+ await pan(context, WARSAW_CENTER, { legs: 3, legMs: 500 });
+ },
+ };
+}
+
+export const GEOMETRY_SCENARIOS: Scenario[] = [
+ polylineScenario(100, ['baseline']),
+ polylineScenario(1000, ['baseline', 'quick']),
+ polylineScenario(10_000, ['baseline']),
+ polylineScenario(100_000, ['baseline', 'heavy']),
+ polygonScenario(100, ['baseline']),
+ polygonScenario(1000, ['baseline', 'quick']),
+ polygonScenario(10_000, ['baseline']),
+ {
+ id: 'polylines-200x50',
+ name: '200 polylines of 50 points',
+ group: 'geometry',
+ description:
+ 'Many small polylines: mount, three whole-set restyles, then a pan.',
+ tags: ['baseline'],
+ props: () => ({
+ region: WARSAW_REGION,
+ polylines: generatePolylines(200, 50),
+ }),
+ settleMs: 1500,
+ estimatedDurationMs: 9000,
+ async run(context) {
+ const routes = generatePolylines(200, 50);
+ for (let tick = 0; tick < 3; tick += 1) {
+ await context.step(
+ 'restyle-all',
+ async () => {
+ await context.setProps(
+ {
+ polylines: routes.map((route) => restylePolyline(route, tick)),
+ },
+ 'restyle-all',
+ );
+ await context.sleep(300);
+ },
+ { polylines: routes.length, tick },
+ );
+ }
+ await pan(context, WARSAW_CENTER, { legs: 3, legMs: 500 });
+ },
+ },
+ {
+ id: 'polygons-200x20',
+ name: '200 polygons of 20 vertices',
+ group: 'geometry',
+ description:
+ 'Many small polygons: mount, three whole-set restyles, then a pan.',
+ tags: ['baseline'],
+ props: () => ({
+ region: WARSAW_REGION,
+ polygons: generatePolygons(200, 20),
+ }),
+ settleMs: 1500,
+ estimatedDurationMs: 9000,
+ async run(context) {
+ const areas = generatePolygons(200, 20);
+ const fills = ['#34C75944', '#FF950044', '#AF52DE44'];
+ for (let tick = 0; tick < fills.length; tick += 1) {
+ await context.step(
+ 'restyle-all',
+ async () => {
+ await context.setProps(
+ {
+ polygons: areas.map((area) => ({
+ ...area,
+ fillColor: fills[tick],
+ })),
+ },
+ 'restyle-all',
+ );
+ await context.sleep(300);
+ },
+ { polygons: areas.length, tick },
+ );
+ }
+ await pan(context, WARSAW_CENTER, { legs: 3, legMs: 500 });
+ },
+ },
+];
diff --git a/performance/scenarios/helpers.ts b/performance/scenarios/helpers.ts
new file mode 100644
index 0000000..b6ad636
--- /dev/null
+++ b/performance/scenarios/helpers.ts
@@ -0,0 +1,157 @@
+import type { Camera, Coordinate } from 'react-native-better-maps';
+import { cameraAt } from '../fixtures/regions';
+import type { ScenarioContext } from './types';
+
+export interface PanOptions {
+ legs?: number;
+ stepDegrees?: number;
+ legMs?: number;
+ zoom?: number;
+ settleMs?: number;
+}
+
+const SQUARE_OFFSETS = [
+ [1, 0],
+ [1, 1],
+ [0, 1],
+ [-1, 1],
+ [-1, 0],
+ [-1, -1],
+ [0, -1],
+ [1, -1],
+];
+
+/** Pans the camera in a square around `center`, one animated leg at a time. */
+export async function pan(
+ context: ScenarioContext,
+ center: Coordinate,
+ options: PanOptions = {},
+): Promise {
+ const {
+ legs = 6,
+ stepDegrees = 0.03,
+ legMs = 600,
+ zoom = 12,
+ settleMs,
+ } = options;
+ for (let leg = 0; leg < legs; leg += 1) {
+ const [dy, dx] = SQUARE_OFFSETS[leg % SQUARE_OFFSETS.length];
+ await context.animateCamera(
+ cameraAt(
+ {
+ latitude: center.latitude + dy * stepDegrees * (1 + leg * 0.3),
+ longitude: center.longitude + dx * stepDegrees * (1 + leg * 0.3),
+ },
+ { zoom },
+ ),
+ legMs,
+ settleMs,
+ );
+ }
+ await context.animateCamera(cameraAt(center, { zoom }), legMs, settleMs);
+}
+
+/** Back-to-back short legs with no settle, so the map never comes to rest. */
+export async function continuousPan(
+ context: ScenarioContext,
+ center: Coordinate,
+ options: {
+ durationMs?: number;
+ legMs?: number;
+ stepDegrees?: number;
+ zoom?: number;
+ } = {},
+): Promise {
+ const {
+ durationMs = 6000,
+ legMs = 400,
+ stepDegrees = 0.015,
+ zoom = 12,
+ } = options;
+ const started = Date.now();
+ let leg = 0;
+ while (Date.now() - started < durationMs) {
+ const angle = leg * 0.9;
+ await context.animateCamera(
+ cameraAt(
+ {
+ latitude: center.latitude + Math.sin(angle) * stepDegrees * 2,
+ longitude: center.longitude + Math.cos(angle) * stepDegrees * 3,
+ },
+ { zoom },
+ ),
+ legMs,
+ 0,
+ );
+ leg += 1;
+ }
+}
+
+/** Zooms through several levels so clustering and LOD re-form at each. */
+export async function zoomSweep(
+ context: ScenarioContext,
+ center: Coordinate,
+ zooms: number[],
+ legMs = 900,
+ settleMs?: number,
+): Promise {
+ for (const zoom of zooms) {
+ await context.animateCamera(cameraAt(center, { zoom }), legMs, settleMs);
+ }
+}
+
+export async function rotate(
+ context: ScenarioContext,
+ center: Coordinate,
+ headings: number[],
+ legMs = 700,
+ zoom = 12,
+): Promise {
+ for (const heading of headings) {
+ await context.animateCamera(cameraAt(center, { zoom, heading }), legMs);
+ }
+}
+
+export async function pitch(
+ context: ScenarioContext,
+ center: Coordinate,
+ pitches: number[],
+ legMs = 700,
+ zoom = 14,
+): Promise {
+ for (const value of pitches) {
+ await context.animateCamera(
+ cameraAt(center, { zoom, pitch: value }),
+ legMs,
+ );
+ }
+}
+
+/** Many very short moves in quick succession (a user flicking the map). */
+export async function rapidMoves(
+ context: ScenarioContext,
+ center: Coordinate,
+ count = 20,
+ legMs = 150,
+ zoom = 12,
+): Promise {
+ for (let index = 0; index < count; index += 1) {
+ const angle = index * 2.4;
+ const camera: Camera = cameraAt(
+ {
+ latitude: center.latitude + Math.sin(angle) * 0.01,
+ longitude: center.longitude + Math.cos(angle) * 0.015,
+ },
+ { zoom: zoom + (index % 3) * 0.5 },
+ );
+ await context.animateCamera(camera, legMs, 20);
+ }
+ await context.animateCamera(cameraAt(center, { zoom }), 300);
+}
+
+export function countLabel(count: number): string {
+ if (count >= 1000) {
+ return `${count / 1000}k`;
+ }
+ return String(count);
+}
diff --git a/performance/scenarios/index.ts b/performance/scenarios/index.ts
new file mode 100644
index 0000000..bc8b8eb
--- /dev/null
+++ b/performance/scenarios/index.ts
@@ -0,0 +1,95 @@
+import { CAMERA_SCENARIOS } from './camera';
+import { CLUSTERING_SCENARIOS } from './clustering';
+import { COMBINED_SCENARIOS } from './combined';
+import { GEOMETRY_SCENARIOS } from './geometry';
+import { MARKER_SCENARIOS } from './markers';
+import { MUTATION_SCENARIOS } from './mutations';
+import { STABILITY_SCENARIOS } from './stability';
+import type { Scenario, ScenarioGroup, ScenarioTag } from './types';
+
+export type {
+ CommitSample,
+ PerfMapProps,
+ Scenario,
+ ScenarioContext,
+ ScenarioGroup,
+ ScenarioTag,
+ StepMeta,
+} from './types';
+
+export const SCENARIOS: Scenario[] = [
+ ...MARKER_SCENARIOS,
+ ...CAMERA_SCENARIOS,
+ ...MUTATION_SCENARIOS,
+ ...GEOMETRY_SCENARIOS,
+ ...CLUSTERING_SCENARIOS,
+ ...COMBINED_SCENARIOS,
+ ...STABILITY_SCENARIOS,
+];
+
+const byId = new Map(SCENARIOS.map((scenario) => [scenario.id, scenario]));
+
+export function findScenario(id: string): Scenario | undefined {
+ return byId.get(id);
+}
+
+/**
+ * Resolves a selector list to scenarios: an exact id, a group name
+ * (`markers`, `camera`, …), a `tag:` prefix (`tag:baseline`) or a glob-ish
+ * prefix ending in `*` (`camera-fast-pan-*`).
+ */
+export function resolveScenarios(selectors: string[]): Scenario[] {
+ const picked: Scenario[] = [];
+ const seen = new Set();
+ const push = (scenario: Scenario) => {
+ if (!seen.has(scenario.id)) {
+ seen.add(scenario.id);
+ picked.push(scenario);
+ }
+ };
+
+ for (const raw of selectors) {
+ const selector = raw.trim();
+ if (selector.length === 0) {
+ continue;
+ }
+ const exact = byId.get(selector);
+ if (exact) {
+ push(exact);
+ continue;
+ }
+ if (selector.startsWith('tag:')) {
+ const tag = selector.slice(4) as ScenarioTag;
+ SCENARIOS.filter((scenario) => scenario.tags.includes(tag)).forEach(push);
+ continue;
+ }
+ if (selector.endsWith('*')) {
+ const prefix = selector.slice(0, -1);
+ SCENARIOS.filter((scenario) => scenario.id.startsWith(prefix)).forEach(
+ push,
+ );
+ continue;
+ }
+ const group = selector as ScenarioGroup;
+ const inGroup = SCENARIOS.filter((scenario) => scenario.group === group);
+ if (inGroup.length > 0) {
+ inGroup.forEach(push);
+ continue;
+ }
+ throw new Error(`Unknown scenario selector "${selector}"`);
+ }
+
+ return picked;
+}
+
+/** Pure-data view of the catalog for CLIs and docs (no runtime code). */
+export function catalog() {
+ return SCENARIOS.map((scenario) => ({
+ id: scenario.id,
+ name: scenario.name,
+ group: scenario.group,
+ tags: scenario.tags,
+ description: scenario.description,
+ estimatedDurationMs: scenario.estimatedDurationMs,
+ }));
+}
diff --git a/performance/scenarios/markers.ts b/performance/scenarios/markers.ts
new file mode 100644
index 0000000..e54219a
--- /dev/null
+++ b/performance/scenarios/markers.ts
@@ -0,0 +1,59 @@
+import { WARSAW_CENTER, WARSAW_REGION } from '../fixtures/regions';
+import { markers } from '../fixtures';
+import { countLabel, pan } from './helpers';
+import type { Scenario } from './types';
+
+function markerScenario(count: number, tags: Scenario['tags']): Scenario {
+ const label = countLabel(count);
+ return {
+ id: `markers-${label}`,
+ name: `${label} markers`,
+ group: 'markers',
+ description: `Mount ${count} markers through the bulk prop, settle, then a short 3-leg pan.`,
+ tags,
+ props: () => ({ region: WARSAW_REGION, markers: markers(count) }),
+ settleMs: count >= 50_000 ? 4000 : count >= 10_000 ? 2500 : 1500,
+ estimatedDurationMs: 9000,
+ run: (context) => pan(context, WARSAW_CENTER, { legs: 3 }),
+ };
+}
+
+function childrenScenario(count: number, tags: Scenario['tags']): Scenario {
+ const label = countLabel(count);
+ return {
+ id: `markers-children-${label}`,
+ name: `${label} children`,
+ group: 'markers',
+ description: `Mount ${count} markers as children (collected from React children on every render), then a short pan.`,
+ tags,
+ props: () => ({ region: WARSAW_REGION, markerChildren: markers(count) }),
+ settleMs: 2000,
+ estimatedDurationMs: 9000,
+ run: (context) => pan(context, WARSAW_CENTER, { legs: 3 }),
+ };
+}
+
+export const MARKER_SCENARIOS: Scenario[] = [
+ markerScenario(100, ['baseline', 'quick']),
+ markerScenario(1000, ['baseline', 'quick']),
+ markerScenario(10_000, ['baseline', 'quick']),
+ markerScenario(50_000, ['baseline']),
+ markerScenario(100_000, ['heavy']),
+ childrenScenario(1000, ['baseline']),
+ childrenScenario(10_000, ['heavy']),
+ {
+ id: 'markers-10k-rich',
+ name: '10k markers with titles and visual props',
+ group: 'markers',
+ description:
+ 'Same as markers-10k but every descriptor carries title, subtitle, rotation, opacity, anchor and flat, to measure optional-field conversion cost.',
+ tags: ['baseline'],
+ props: () => ({
+ region: WARSAW_REGION,
+ markers: markers(10_000, { withTitles: true, rich: true }),
+ }),
+ settleMs: 2500,
+ estimatedDurationMs: 9000,
+ run: (context) => pan(context, WARSAW_CENTER, { legs: 3 }),
+ },
+];
diff --git a/performance/scenarios/mutations.ts b/performance/scenarios/mutations.ts
new file mode 100644
index 0000000..63e1d44
--- /dev/null
+++ b/performance/scenarios/mutations.ts
@@ -0,0 +1,145 @@
+import type { MarkerDescriptor } from 'react-native-better-maps';
+import { WARSAW_REGION } from '../fixtures/regions';
+import {
+ appendMarker,
+ markers,
+ moveFirstMarkers,
+ moveMarkerFraction,
+ removeLastMarker,
+} from '../fixtures';
+import type { Scenario, ScenarioContext } from './types';
+
+interface MutationCase {
+ label: string;
+ changed: number;
+ apply(current: MarkerDescriptor[], tick: number): MarkerDescriptor[];
+}
+
+const REPEATS = 5;
+
+function mutationCases(total: number): MutationCase[] {
+ return [
+ {
+ label: 'add-1',
+ changed: 1,
+ apply: (current, tick) => appendMarker(current, tick),
+ },
+ {
+ label: 'remove-1',
+ changed: 1,
+ apply: (current) => removeLastMarker(current),
+ },
+ {
+ label: 'update-1',
+ changed: 1,
+ apply: (current, tick) => moveFirstMarkers(current, 1, tick),
+ },
+ {
+ label: 'update-10',
+ changed: 10,
+ apply: (current, tick) => moveFirstMarkers(current, 10, tick),
+ },
+ {
+ label: 'update-100',
+ changed: 100,
+ apply: (current, tick) => moveFirstMarkers(current, 100, tick),
+ },
+ {
+ label: 'update-1pct',
+ changed: Math.round(total * 0.01),
+ apply: (current, tick) => moveMarkerFraction(current, 0.01, tick),
+ },
+ {
+ label: 'update-10pct',
+ changed: Math.round(total * 0.1),
+ apply: (current, tick) => moveMarkerFraction(current, 0.1, tick),
+ },
+ {
+ label: 'update-100pct',
+ changed: total,
+ apply: (current, tick) => moveMarkerFraction(current, 1, tick),
+ },
+ ];
+}
+
+/**
+ * The marker update benchmark: with `total` markers mounted, how expensive
+ * is changing 1, 10, 100, 1 %, 10 % and 100 % of them? Each case repeats
+ * `REPEATS` times as its own step, so the result carries the JS commit time,
+ * the native setter and pipeline spans, and the JS allocation delta per
+ * step; the CLI report fits the scaling exponent across cases.
+ */
+function mutationBenchmark(
+ total: number,
+ key: 'markers' | 'markerChildren',
+): Scenario {
+ const suffix = key === 'markerChildren' ? '-children' : '';
+ return {
+ id: `mutations-${total / 1000}k${suffix}`,
+ name: `Marker update cost at ${total / 1000}k${key === 'markerChildren' ? ' (children)' : ''}`,
+ group: 'mutations',
+ description: `With ${total} markers mounted, apply add/remove/update of 1, 10, 100, 1 %, 10 % and 100 % of the markers, ${REPEATS} repeats each.`,
+ tags: key === 'markers' ? ['baseline', 'quick'] : ['baseline'],
+ props: () => ({ region: WARSAW_REGION, [key]: markers(total) }),
+ settleMs: 2500,
+ estimatedDurationMs: 8 * REPEATS * 700 + 3000,
+ async run(context: ScenarioContext) {
+ let current = markers(total);
+ let tick = 0;
+ for (const mutation of mutationCases(total)) {
+ for (let repeat = 0; repeat < REPEATS; repeat += 1) {
+ tick += 1;
+ await context.step(
+ mutation.label,
+ async () => {
+ current = mutation.apply(current, tick);
+ await context.setProps({ [key]: current }, mutation.label);
+ // Let the native pipeline (fingerprint, index rebuild, viewport
+ // refresh) finish so its spans land inside this step.
+ await context.sleep(450);
+ },
+ { changed: mutation.changed, total: current.length, repeat },
+ );
+ }
+ }
+ },
+ };
+}
+
+function continuousUpdates(
+ total: number,
+ moving: number,
+ ticks: number,
+ hz: number,
+): Scenario {
+ return {
+ id: `mutations-continuous-${total / 1000}k`,
+ name: `Continuous updates: ${moving} of ${total / 1000}k markers at ${hz} Hz`,
+ group: 'mutations',
+ description: `${moving} markers move every ${1000 / hz} ms for ${ticks / hz} s through prop updates while the camera is still.`,
+ tags: ['baseline', 'quick'],
+ props: () => ({ region: WARSAW_REGION, markers: markers(total) }),
+ settleMs: 2000,
+ estimatedDurationMs: (ticks * 1000) / hz + 2500,
+ async run(context: ScenarioContext) {
+ let current = markers(total);
+ const interval = 1000 / hz;
+ await context.step('continuous', async () => {
+ for (let tick = 1; tick <= ticks; tick += 1) {
+ const started = performance.now();
+ current = moveFirstMarkers(current, moving, tick);
+ await context.setProps({ markers: current }, `tick-${tick}`);
+ const elapsed = performance.now() - started;
+ await context.sleep(Math.max(0, interval - elapsed));
+ }
+ });
+ },
+ };
+}
+
+export const MUTATION_SCENARIOS: Scenario[] = [
+ mutationBenchmark(10_000, 'markers'),
+ mutationBenchmark(1000, 'markerChildren'),
+ continuousUpdates(1000, 100, 50, 10),
+ continuousUpdates(10_000, 100, 50, 10),
+];
diff --git a/performance/scenarios/stability.ts b/performance/scenarios/stability.ts
new file mode 100644
index 0000000..8b1af5a
--- /dev/null
+++ b/performance/scenarios/stability.ts
@@ -0,0 +1,51 @@
+import { WARSAW_CENTER, WARSAW_REGION } from '../fixtures/regions';
+import { markers, moveMarkerFraction } from '../fixtures';
+import { pan, zoomSweep } from './helpers';
+import type { Scenario } from './types';
+
+function stabilityScenario(minutes: number): Scenario {
+ return {
+ id: `stability-${minutes}m`,
+ name: `Stability, ${minutes} minutes`,
+ group: 'stability',
+ description: `${minutes} minutes of pan legs, zoom sweeps and 1 % marker updates over 10k clustered markers, with a timeline checkpoint (frames, memory, CPU, GC) every minute. The question: does performance degrade over time?`,
+ tags: minutes <= 5 ? ['long', 'baseline'] : ['long'],
+ props: () => ({
+ region: WARSAW_REGION,
+ markers: markers(10_000, { clusterable: true }),
+ clusteringEnabled: true,
+ }),
+ settleMs: 3000,
+ estimatedDurationMs: minutes * 60_000 + 5000,
+ async run(context) {
+ let current = markers(10_000, { clusterable: true });
+ const end = Date.now() + minutes * 60_000;
+ let cycle = 0;
+ let nextCheckpoint = Date.now() + 60_000;
+ while (Date.now() < end) {
+ cycle += 1;
+ await pan(context, WARSAW_CENTER, {
+ legs: 4,
+ legMs: 500,
+ stepDegrees: 0.03,
+ });
+ await zoomSweep(context, WARSAW_CENTER, [10, 13, 12], 600);
+ current = moveMarkerFraction(current, 0.01, cycle);
+ await context.setProps({ markers: current }, `update-${cycle}`);
+ await context.sleep(300);
+ if (Date.now() >= nextCheckpoint) {
+ await context.checkpoint(
+ `minute-${Math.round((Date.now() - (end - minutes * 60_000)) / 60_000)}`,
+ );
+ nextCheckpoint = Date.now() + 60_000;
+ }
+ }
+ context.metric('cycles', cycle);
+ },
+ };
+}
+
+export const STABILITY_SCENARIOS: Scenario[] = [
+ stabilityScenario(5),
+ stabilityScenario(15),
+];
diff --git a/performance/scenarios/types.ts b/performance/scenarios/types.ts
new file mode 100644
index 0000000..6b03b70
--- /dev/null
+++ b/performance/scenarios/types.ts
@@ -0,0 +1,105 @@
+import type {
+ Camera,
+ MapViewProps,
+ MapViewRef,
+ MarkerDescriptor,
+ Region,
+} from 'react-native-better-maps';
+
+export type PolylineDescriptor = NonNullable[number];
+export type PolygonDescriptor = NonNullable[number];
+export type CircleDescriptor = NonNullable[number];
+
+/** The subset of `MapView` props a scenario controls. */
+export interface PerfMapProps {
+ region: Region;
+ /** Bulk `markers` prop (the recommended path for large sets). */
+ markers?: MarkerDescriptor[];
+ /** Rendered as `` children instead of the bulk prop. */
+ markerChildren?: MarkerDescriptor[];
+ polylines?: PolylineDescriptor[];
+ polygons?: PolygonDescriptor[];
+ circles?: CircleDescriptor[];
+ clusteringEnabled?: boolean;
+ markerEnteringAnimation?: MapViewProps['markerEnteringAnimation'];
+}
+
+export type ScenarioGroup =
+ | 'markers'
+ | 'camera'
+ | 'mutations'
+ | 'geometry'
+ | 'clustering'
+ | 'combined'
+ | 'stability';
+
+/**
+ * `baseline`: part of `bun perf baseline`. `quick`: the short smoke suite.
+ * `gesture`: needs an external driver for real touch input (the CLI does it
+ * on Android with adb). `heavy`: very large datasets, opt in. `long`: runs
+ * for minutes.
+ */
+export type ScenarioTag = 'baseline' | 'quick' | 'gesture' | 'heavy' | 'long';
+
+export interface CommitSample {
+ label: string;
+ /**
+ * JS-thread time from the state update to the layout effect after commit:
+ * React render, Fabric shadow-tree commit and Nitro prop parsing (the JSI
+ * object → C++ struct conversion runs on the JS thread inside this window).
+ */
+ commitMs: number;
+ /** `performance.now()` when the layout effect ran. */
+ committedAt: number;
+}
+
+export type StepMeta = Record;
+
+/** What a scenario script can do while the recorders are running. */
+export interface ScenarioContext {
+ readonly platform: 'ios' | 'android';
+ readonly refreshRateHz: number;
+ map(): MapViewRef | null;
+ /** Applies new props to the mounted map and resolves after the React commit. */
+ setProps(patch: Partial, label?: string): Promise;
+ sleep(ms: number): Promise;
+ /** Animates the camera and waits for the animation plus a short settle. */
+ animateCamera(
+ camera: Camera,
+ durationMs: number,
+ settleMs?: number,
+ ): Promise;
+ setCamera(camera: Camera): Promise;
+ /**
+ * Groups work under a named step. Commits, native spans and JS allocations
+ * that happen inside are attributed to the step in the result.
+ */
+ step(label: string, run: () => Promise, meta?: StepMeta): Promise;
+ /**
+ * Closes the current timeline window (frame stats, memory, CPU) and opens a
+ * new one; long-running scenarios call this periodically.
+ */
+ checkpoint(label: string): Promise;
+ /**
+ * Announces a window during which an external driver performs real
+ * gestures (the CLI drives `adb shell input swipe`), then waits for it.
+ */
+ gestureWindow(name: string, durationMs: number): Promise;
+ /** Records a custom scalar metric on the result. */
+ metric(name: string, value: number): void;
+ note(text: string): void;
+}
+
+export interface Scenario {
+ id: string;
+ name: string;
+ group: ScenarioGroup;
+ description: string;
+ tags: ScenarioTag[];
+ /** Initial map props; lazy so fixtures are generated only when the scenario runs. */
+ props(): PerfMapProps;
+ /** Extra settle time after `onMapReady` before recording starts. */
+ settleMs?: number;
+ estimatedDurationMs: number;
+ run(context: ScenarioContext): Promise;
+}
diff --git a/performance/scripts/__tests__/compare.test.ts b/performance/scripts/__tests__/compare.test.ts
new file mode 100644
index 0000000..e44a153
--- /dev/null
+++ b/performance/scripts/__tests__/compare.test.ts
@@ -0,0 +1,131 @@
+import { describe, expect, test } from 'bun:test';
+import {
+ checkRegressions,
+ compareRuns,
+ fitExponent,
+ formatOverview,
+ stepsTable,
+} from '../lib/compare.mjs';
+import { improvementPct, metric } from '../lib/metrics.mjs';
+import { REGRESSION_THRESHOLDS } from '../../perf.config';
+
+function result(overrides: Record) {
+ return {
+ scenario: 'markers-10k',
+ frames: {
+ fps: { average: 58, p95: 40 },
+ frameTimeMs: { p50: 16.7, p95: 33, p99: 50, worst: 120 },
+ jankRatio: 0.04,
+ longFrames: 2,
+ },
+ js: {
+ lagMs: { p95: 2 },
+ busyRatio: 0.02,
+ commits: { count: 1, avgMs: 40, maxMs: 40 },
+ },
+ load: { commitMs: 60, readyMs: 1500 },
+ native: { available: true, mainThreadMs: 300, backgroundMs: 50 },
+ bridge: { setterMs: { avgMs: 5 }, commitToNativeMs: { avgMs: 8 } },
+ memory: {
+ afterInteractionMB: 200,
+ interactionDeltaMB: 10,
+ retainedAfterCleanupMB: 5,
+ },
+ allocations: {
+ hermes: { allocatedBytes: 1000, gcCount: 1 },
+ android: null,
+ ios: null,
+ },
+ cpu: { percent: 50 },
+ steps: [],
+ timeline: [],
+ ...overrides,
+ };
+}
+
+function run(results: ReturnType[]) {
+ return {
+ run: {},
+ results: new Map(results.map((entry) => [entry.scenario, entry])),
+ };
+}
+
+describe('compare', () => {
+ test('improvement percentage is oriented so positive is better', () => {
+ expect(improvementPct(metric('fps'), 50, 55)).toBeCloseTo(10, 5);
+ expect(improvementPct(metric('p95'), 20, 22)).toBeCloseTo(-10, 5);
+ expect(improvementPct(metric('p95'), 20, 20.2, 0.5)).toBe(0);
+ expect(improvementPct(metric('p95'), null, 20)).toBeNull();
+ });
+
+ test('regressions beyond thresholds are reported, N/A is skipped', () => {
+ const baseline = run([result({})]);
+ const current = run([
+ result({
+ frames: {
+ fps: { average: 50, p95: 40 },
+ frameTimeMs: { p50: 16.7, p95: 40, p99: 50, worst: 120 },
+ jankRatio: 0.06,
+ longFrames: 2,
+ },
+ native: { available: false },
+ bridge: { setterMs: null, commitToNativeMs: null },
+ }),
+ ]);
+ const comparison = compareRuns(baseline, current, { minAbsoluteMs: 0.5 });
+ const verdict = checkRegressions(comparison, REGRESSION_THRESHOLDS);
+ const keys = verdict.regressions.map((entry) => entry.metric).sort();
+ expect(keys).toEqual(['fps', 'jank', 'p95']);
+ expect(verdict.skipped.map((entry) => entry.metric)).toContain('setter');
+ expect(formatOverview(comparison)).toContain('markers-10k');
+ expect(formatOverview(comparison)).toContain('N/A');
+ });
+
+ test('scenarios missing from the baseline are listed', () => {
+ const comparison = compareRuns(run([]), run([result({})]), {});
+ expect(comparison.missing).toEqual(['markers-10k']);
+ });
+});
+
+describe('scaling fit', () => {
+ test('linear and quadratic series', () => {
+ expect(
+ fitExponent([
+ { n: 100, ms: 1 },
+ { n: 1000, ms: 10 },
+ { n: 10000, ms: 100 },
+ ]),
+ ).toBeCloseTo(1, 5);
+ expect(
+ fitExponent([
+ { n: 100, ms: 1 },
+ { n: 1000, ms: 100 },
+ { n: 10000, ms: 10000 },
+ ]),
+ ).toBeCloseTo(2, 5);
+ expect(fitExponent([{ n: 100, ms: 1 }])).toBeNull();
+ });
+
+ test('steps table aggregates repeats by label', () => {
+ const step = (label: string, changed: number, avgMs: number) => ({
+ label,
+ meta: { changed },
+ commits: { count: 1, avgMs },
+ bridge: { setterMs: { avgMs: 1 }, commitToNativeMs: { avgMs: 2 } },
+ native: { byName: { 'markers.set': { totalMs: 3 } } },
+ hermes: { allocatedBytes: 10 },
+ });
+ const table = stepsTable(
+ result({
+ steps: [
+ step('update-1', 1, 40),
+ step('update-1', 1, 42),
+ step('update-100', 100, 41),
+ ],
+ }),
+ );
+ expect(table.table).toContain('update-1');
+ expect(table.table).toContain('update-100');
+ expect(table.exponent).toBeCloseTo(0, 1);
+ });
+});
diff --git a/performance/scripts/build-android.sh b/performance/scripts/build-android.sh
new file mode 100755
index 0000000..0f06a35
--- /dev/null
+++ b/performance/scripts/build-android.sh
@@ -0,0 +1,46 @@
+#!/usr/bin/env bash
+# Builds the performance-lab variant of the example app for Android.
+#
+# bash performance/scripts/build-android.sh [release|debug] [probes 1|0] [abi]
+#
+# The lab is selected at bundle time with EXPO_PUBLIC_PERF_LAB=1, and the
+# library's PerfProbe recording is compiled in with -PNitroMaps_perfProbes=true
+# (a "profile" build: release optimizations plus timing spans). Set JAVA_HOME
+# to a JDK 17 when the default JDK fails on the prefab step.
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
+VARIANT="${1:-release}"
+PROBES="${2:-1}"
+ABI="${3:-arm64-v8a}"
+
+export EXPO_PUBLIC_PERF_LAB=1
+export LANG="${LANG:-en_US.UTF-8}"
+export LC_ALL="${LC_ALL:-en_US.UTF-8}"
+export ANDROID_HOME="${ANDROID_HOME:-$HOME/Library/Android/sdk}"
+if [ -z "${JAVA_HOME:-}" ] && [ -d /opt/homebrew/opt/openjdk@17 ]; then
+ export JAVA_HOME=/opt/homebrew/opt/openjdk@17
+fi
+
+# EXPO_PUBLIC_* values are inlined by Babel; a stale Metro cache would keep the demo bundle.
+rm -rf "${TMPDIR:-/tmp}/metro-cache"
+
+(cd "$ROOT/package" && bun run build:plugin && bun run nitrogen)
+if [ ! -d "$ROOT/example/android" ]; then
+ (cd "$ROOT/example" && bun run prebuild -p android --no-install)
+fi
+
+case "$VARIANT" in
+ release) TASK=":app:assembleRelease" ;;
+ debug) TASK=":app:assembleDebug" ;;
+ *) echo "unknown variant $VARIANT" >&2; exit 1 ;;
+esac
+PROBES_FLAG=false
+if [ "$PROBES" = "1" ]; then PROBES_FLAG=true; fi
+
+(cd "$ROOT/example/android" && ./gradlew "$TASK" \
+ -PreactNativeArchitectures="$ABI" \
+ -PNitroMaps_perfProbes="$PROBES_FLAG" \
+ --console=plain)
+
+echo "APK: $ROOT/example/android/app/build/outputs/apk/$VARIANT/app-$VARIANT.apk"
diff --git a/performance/scripts/build-ios.sh b/performance/scripts/build-ios.sh
new file mode 100755
index 0000000..fb77265
--- /dev/null
+++ b/performance/scripts/build-ios.sh
@@ -0,0 +1,54 @@
+#!/usr/bin/env bash
+# Builds the performance-lab variant of the example app for the iOS simulator.
+#
+# bash performance/scripts/build-ios.sh [release|debug] [probes 1|0]
+#
+# For a physical iPhone open example/ios/NitroMapsExample.xcworkspace in Xcode
+# with EXPO_PUBLIC_PERF_LAB=1 exported in the environment Xcode was launched
+# from, select the Release scheme configuration and run on the device.
+set -euo pipefail
+
+ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
+VARIANT="${1:-release}"
+PROBES="${2:-1}"
+
+export EXPO_PUBLIC_PERF_LAB=1
+export LANG="${LANG:-en_US.UTF-8}"
+export LC_ALL="${LC_ALL:-en_US.UTF-8}"
+export RUBYOPT="${RUBYOPT:--E utf-8}"
+
+rm -rf "${TMPDIR:-/tmp}/metro-cache"
+
+(cd "$ROOT/package" && bun run build:plugin && bun run nitrogen)
+if [ ! -d "$ROOT/example/ios" ]; then
+ (cd "$ROOT/example" && bun run prebuild -p ios --no-install)
+fi
+
+PROPS="$ROOT/example/ios/Podfile.properties.json"
+node -e '
+const fs = require("fs");
+const file = process.argv[1];
+const enabled = process.argv[2] === "1";
+const props = fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, "utf8")) : {};
+if (enabled) props["betterMaps.perfProbes"] = "true"; else delete props["betterMaps.perfProbes"];
+fs.writeFileSync(file, JSON.stringify(props, null, 2) + "\n");
+' "$PROPS" "$PROBES"
+
+(cd "$ROOT/example/ios" && pod install)
+
+case "$VARIANT" in
+ release) CONFIG=Release ;;
+ debug) CONFIG=Debug ;;
+ *) echo "unknown variant $VARIANT" >&2; exit 1 ;;
+esac
+
+xcodebuild \
+ -workspace "$ROOT/example/ios/NitroMapsExample.xcworkspace" \
+ -scheme NitroMapsExample \
+ -configuration "$CONFIG" \
+ -sdk iphonesimulator \
+ -destination 'generic/platform=iOS Simulator' \
+ -derivedDataPath "$ROOT/example/ios/build/perf-lab" \
+ build | grep -E 'error:|warning: .*PerfLab|BUILD (SUCCEEDED|FAILED)' || true
+
+echo "APP: $ROOT/example/ios/build/perf-lab/Build/Products/$CONFIG-iphonesimulator/NitroMapsExample.app"
diff --git a/performance/scripts/lib/compare.mjs b/performance/scripts/lib/compare.mjs
new file mode 100644
index 0000000..3b078fe
--- /dev/null
+++ b/performance/scripts/lib/compare.mjs
@@ -0,0 +1,254 @@
+import { METRICS, SCORECARD_METRICS, formatValue, improvementPct, metric } from './metrics.mjs';
+import { markdownTable } from './util.mjs';
+
+/**
+ * Compares two loaded runs scenario by scenario. Every metric row carries
+ * both values and the improvement percentage oriented so positive is better;
+ * `null` means one side did not measure it (rendered as N/A, never guessed).
+ */
+export function compareRuns(baseline, current, options = {}) {
+ const minAbsoluteMs = options.minAbsoluteMs ?? 0;
+ const scenarios = [];
+ const missing = [];
+ for (const [id, currentResult] of current.results) {
+ const baselineResult = baseline.results.get(id);
+ if (baselineResult == null) {
+ missing.push(id);
+ continue;
+ }
+ const rows = METRICS.map((definition) => {
+ const before = definition.get(baselineResult) ?? null;
+ const after = definition.get(currentResult) ?? null;
+ const minAbsolute = definition.kind === 'ms' ? minAbsoluteMs : 0;
+ return {
+ key: definition.key,
+ label: definition.label,
+ kind: definition.kind,
+ better: definition.better,
+ baseline: before,
+ current: after,
+ improvementPct: improvementPct(definition, before, after, minAbsolute),
+ };
+ });
+ scenarios.push({ scenario: id, rows });
+ }
+ return { scenarios, missing };
+}
+
+function signed(value) {
+ if (value == null) {
+ return 'N/A';
+ }
+ const rounded = Math.round(value * 10) / 10;
+ return `${rounded > 0 ? '+' : ''}${rounded.toFixed(1)} %`;
+}
+
+/** Compact overview: one row per scenario, one column per key metric ("current (±change)"). */
+export function formatOverview(comparison, keys = SCORECARD_METRICS) {
+ const headers = ['Scenario', ...keys.map((key) => metric(key)?.label ?? key)];
+ const rows = comparison.scenarios.map(({ scenario, rows: metricRows }) => [
+ scenario,
+ ...keys.map((key) => {
+ const row = metricRows.find((entry) => entry.key === key);
+ if (row == null || row.current == null) {
+ return 'N/A';
+ }
+ return `${formatValue(row.kind, row.current)} (${signed(row.improvementPct)})`;
+ }),
+ ]);
+ return markdownTable(headers, rows, ['left', ...keys.map(() => 'right')]);
+}
+
+/** One table per scenario with every metric: | Metric | Baseline | Current | Change |. */
+export function formatDetail(comparison) {
+ const sections = [];
+ for (const { scenario, rows } of comparison.scenarios) {
+ const table = markdownTable(
+ ['Metric', 'Baseline', 'Current', 'Change (+ is better)'],
+ rows.map((row) => [
+ row.label,
+ formatValue(row.kind, row.baseline),
+ formatValue(row.kind, row.current),
+ signed(row.improvementPct),
+ ]),
+ ['left', 'right', 'right', 'right'],
+ );
+ sections.push(`### ${scenario}\n\n${table}`);
+ }
+ return sections.join('\n\n');
+}
+
+const THRESHOLD_BY_METRIC = {
+ fps: (thresholds) => ({ pct: thresholds.fpsDropPct }),
+ p95: (thresholds) => ({ pct: thresholds.p95FrameTimeIncreasePct }),
+ p99: (thresholds) => ({ pct: thresholds.p99FrameTimeIncreasePct }),
+ memAfter: (thresholds) => ({ pct: thresholds.memoryIncreasePct }),
+ jsCommit: (thresholds) => ({ pct: thresholds.jsCommitIncreasePct }),
+ setter: (thresholds) => ({ pct: thresholds.nativeSetterIncreasePct }),
+ jank: (thresholds) => ({ points: thresholds.jankRatioIncreasePoints }),
+};
+
+/**
+ * Applies the configured thresholds. A metric regresses when it moved in the
+ * wrong direction by more than its threshold; metrics that are N/A on either
+ * side are skipped (and listed), never treated as passing or failing.
+ */
+export function checkRegressions(comparison, thresholds) {
+ const regressions = [];
+ const improvements = [];
+ const skipped = [];
+ for (const { scenario, rows } of comparison.scenarios) {
+ for (const row of rows) {
+ const rule = THRESHOLD_BY_METRIC[row.key];
+ if (rule == null) {
+ continue;
+ }
+ if (row.baseline == null || row.current == null) {
+ skipped.push({ scenario, metric: row.key });
+ continue;
+ }
+ const { pct, points } = rule(thresholds);
+ let regressed = false;
+ let improved = false;
+ if (points != null) {
+ const delta = (row.current - row.baseline) * 100;
+ regressed = delta > points;
+ improved = delta < -points;
+ } else {
+ regressed = row.improvementPct != null && row.improvementPct < -pct;
+ improved = row.improvementPct != null && row.improvementPct > pct;
+ }
+ const entry = {
+ scenario,
+ metric: row.key,
+ label: row.label,
+ baseline: formatValue(row.kind, row.baseline),
+ current: formatValue(row.kind, row.current),
+ change: signed(row.improvementPct),
+ threshold: points != null ? `${points} points` : `${pct} %`,
+ };
+ if (regressed) {
+ regressions.push(entry);
+ } else if (improved) {
+ improvements.push(entry);
+ }
+ }
+ }
+ return { regressions, improvements, skipped };
+}
+
+/** The scorecard table used in PERFORMANCE.md. */
+export function scorecard(results, keys = SCORECARD_METRICS) {
+ const headers = ['Scenario', ...keys.map((key) => metric(key)?.label ?? key)];
+ const rows = [...results.values()].map((result) => [
+ result.scenario,
+ ...keys.map((key) => formatValue(metric(key).kind, metric(key).get(result) ?? null)),
+ ]);
+ return markdownTable(headers, rows, ['left', ...keys.map(() => 'right')]);
+}
+
+function median(values) {
+ const sorted = [...values].sort((a, b) => a - b);
+ if (sorted.length === 0) {
+ return null;
+ }
+ return sorted[Math.floor((sorted.length - 1) / 2)];
+}
+
+/** Least-squares slope of log(cost) against log(size): the empirical scaling exponent. */
+export function fitExponent(points) {
+ const usable = points.filter((point) => point.n > 0 && point.ms > 0);
+ if (usable.length < 2) {
+ return null;
+ }
+ const xs = usable.map((point) => Math.log(point.n));
+ const ys = usable.map((point) => Math.log(point.ms));
+ const meanX = xs.reduce((sum, value) => sum + value, 0) / xs.length;
+ const meanY = ys.reduce((sum, value) => sum + value, 0) / ys.length;
+ let numerator = 0;
+ let denominator = 0;
+ for (let index = 0; index < xs.length; index += 1) {
+ numerator += (xs[index] - meanX) * (ys[index] - meanY);
+ denominator += (xs[index] - meanX) ** 2;
+ }
+ return denominator === 0 ? null : numerator / denominator;
+}
+
+const STEP_SPANS = ['markers.set', 'markers.fingerprint', 'markers.indexBuild', 'markers.viewportCompute', 'markers.applyDiff', 'markers.applySync', 'polylines.set', 'polygons.set'];
+
+/**
+ * Aggregates a result's steps by label (median over repeats) into a table:
+ * the marker-update benchmark and the geometry updates read from this.
+ */
+export function stepsTable(result) {
+ const groups = new Map();
+ for (const step of result.steps ?? []) {
+ let group = groups.get(step.label);
+ if (group == null) {
+ group = { label: step.label, meta: step.meta, commit: [], setter: [], latency: [], spans: {}, jsAlloc: [] };
+ groups.set(step.label, group);
+ }
+ if (step.commits?.count > 0) {
+ group.commit.push(step.commits.avgMs);
+ }
+ if (step.bridge?.setterMs) {
+ group.setter.push(step.bridge.setterMs.avgMs);
+ }
+ if (step.bridge?.commitToNativeMs) {
+ group.latency.push(step.bridge.commitToNativeMs.avgMs);
+ }
+ for (const span of STEP_SPANS) {
+ const stat = step.native?.byName?.[span];
+ if (stat) {
+ (group.spans[span] ??= []).push(stat.totalMs);
+ }
+ }
+ if (step.hermes?.allocatedBytes != null) {
+ group.jsAlloc.push(step.hermes.allocatedBytes);
+ }
+ }
+ const spanKeys = STEP_SPANS.filter((span) => [...groups.values()].some((group) => group.spans[span]));
+ const headers = ['Step', 'Changed', 'JS commit', 'Commit → native', 'Native setter', ...spanKeys, 'JS alloc'];
+ const rows = [...groups.values()].map((group) => [
+ group.label,
+ group.meta?.changed ?? group.meta?.points ?? '',
+ formatValue('ms', median(group.commit)),
+ formatValue('ms', median(group.latency)),
+ formatValue('ms', median(group.setter)),
+ ...spanKeys.map((span) => formatValue('ms', median(group.spans[span] ?? []))),
+ formatValue('bytes', median(group.jsAlloc)),
+ ]);
+ const points = [...groups.values()]
+ .filter((group) => typeof group.meta?.changed === 'number' && group.commit.length > 0)
+ .map((group) => ({ n: group.meta.changed, ms: median(group.commit) }));
+ return { table: markdownTable(headers, rows, ['left', 'right', ...headers.slice(2).map(() => 'right')]), exponent: fitExponent(points) };
+}
+
+/** Timeline windows of a long-running scenario: does anything drift? */
+export function timelineTable(result) {
+ const windows = result.timeline ?? [];
+ if (windows.length === 0) {
+ return null;
+ }
+ const headers = ['Window', 'At', 'FPS', 'p95', 'p99', 'Worst', 'Jank', 'RAM', 'CPU', 'JS alloc', 'Native main'];
+ const rows = windows.map((window) => [
+ window.label,
+ `${Math.round(window.atMs / 1000)} s`,
+ formatValue('number', window.frames?.fps?.average),
+ formatValue('ms', window.frames?.frameTimeMs?.p95),
+ formatValue('ms', window.frames?.frameTimeMs?.p99),
+ formatValue('ms', window.frames?.frameTimeMs?.worst),
+ formatValue('ratio', window.frames?.jankRatio),
+ formatValue('mb', window.memory?.footprintMB),
+ formatValue('pct', window.cpuPercent),
+ formatValue('bytes', window.hermes?.allocatedBytes),
+ formatValue('ms', window.native?.available ? window.native.mainThreadMs : null),
+ ]);
+ const first = windows[0];
+ const last = windows[windows.length - 1];
+ const drift = {
+ fps: first.frames?.fps?.average != null && last.frames?.fps?.average != null ? last.frames.fps.average - first.frames.fps.average : null,
+ memoryMB: first.memory?.footprintMB != null && last.memory?.footprintMB != null ? last.memory.footprintMB - first.memory.footprintMB : null,
+ };
+ return { table: markdownTable(headers, rows, ['left', ...headers.slice(1).map(() => 'right')]), drift };
+}
diff --git a/performance/scripts/lib/devices.mjs b/performance/scripts/lib/devices.mjs
new file mode 100644
index 0000000..480c10e
--- /dev/null
+++ b/performance/scripts/lib/devices.mjs
@@ -0,0 +1,200 @@
+import { existsSync } from 'node:fs';
+import os from 'node:os';
+import path from 'node:path';
+import { run, tryRun } from './util.mjs';
+
+export function adbPath() {
+ const home = process.env.ANDROID_HOME ?? process.env.ANDROID_SDK_ROOT ?? path.join(os.homedir(), 'Library/Android/sdk');
+ const candidate = path.join(home, 'platform-tools', 'adb');
+ return existsSync(candidate) ? candidate : 'adb';
+}
+
+export function listAndroidDevices() {
+ const output = tryRun(adbPath(), ['devices', '-l']);
+ if (output == null) {
+ return [];
+ }
+ return output
+ .split('\n')
+ .slice(1)
+ .map((line) => line.trim())
+ .filter((line) => line.length > 0 && /\sdevice\s/.test(`${line} `))
+ .map((line) => {
+ const [serial, ...rest] = line.split(/\s+/);
+ const model = rest.find((part) => part.startsWith('model:'))?.slice(6) ?? serial;
+ return { platform: 'android', id: serial, name: model, simulator: serial.startsWith('emulator-') };
+ });
+}
+
+export function listIosSimulators() {
+ const output = tryRun('xcrun', ['simctl', 'list', 'devices', 'booted', '-j']);
+ if (output == null) {
+ return [];
+ }
+ const parsed = JSON.parse(output);
+ const devices = [];
+ for (const [runtime, list] of Object.entries(parsed.devices ?? {})) {
+ for (const device of list) {
+ if (device.state === 'Booted') {
+ devices.push({
+ platform: 'ios',
+ id: device.udid,
+ name: device.name,
+ runtime: runtime.split('.').pop(),
+ simulator: true,
+ });
+ }
+ }
+ }
+ return devices;
+}
+
+export function listDevices() {
+ return [...listAndroidDevices(), ...listIosSimulators()];
+}
+
+export function resolveTarget({ platform, device }) {
+ const devices = listDevices().filter((entry) => platform == null || entry.platform === platform);
+ if (devices.length === 0) {
+ throw new Error(
+ platform === 'ios'
+ ? 'No booted iOS simulator. Boot one (xcrun simctl boot "iPhone 17 Pro") or run on a device by hand.'
+ : 'No connected Android device or emulator (adb devices).',
+ );
+ }
+ if (device != null) {
+ const match = devices.find((entry) => entry.id === device || entry.name === device);
+ if (match == null) {
+ throw new Error(`Device "${device}" not found. Known: ${devices.map((entry) => `${entry.id} (${entry.name})`).join(', ')}`);
+ }
+ return match;
+ }
+ if (devices.length > 1 && platform == null) {
+ throw new Error(`Several targets available, pass --platform or --device: ${devices.map((entry) => `${entry.platform}:${entry.id} (${entry.name})`).join(', ')}`);
+ }
+ return devices[0];
+}
+
+export function screenSize(target) {
+ if (target.platform !== 'android') {
+ return null;
+ }
+ const output = tryRun(adbPath(), ['-s', target.id, 'shell', 'wm', 'size']) ?? '';
+ const match = /(\d+)x(\d+)/.exec(output);
+ return match ? { width: Number(match[1]), height: Number(match[2]) } : null;
+}
+
+export function isAppInstalled(target, appId) {
+ if (target.platform === 'android') {
+ return (tryRun(adbPath(), ['-s', target.id, 'shell', 'pm', 'path', appId]) ?? '').includes('package:');
+ }
+ return tryRun('xcrun', ['simctl', 'get_app_container', target.id, appId, 'data']) != null;
+}
+
+export function openUrl(target, appId, url) {
+ if (target.platform === 'android') {
+ // adb joins the arguments into one command line for the device shell, so
+ // the URL must be quoted there or `&` starts a background job.
+ run(adbPath(), ['-s', target.id, 'shell', 'am', 'start', '-W', '-a', 'android.intent.action.VIEW', '-d', `'${url}'`, appId]);
+ return;
+ }
+ run('xcrun', ['simctl', 'openurl', target.id, url]);
+}
+
+export function launchApp(target, appId, args = []) {
+ if (target.platform === 'android') {
+ run(adbPath(), ['-s', target.id, 'shell', 'monkey', '-p', appId, '-c', 'android.intent.category.LAUNCHER', '1']);
+ return;
+ }
+ run('xcrun', ['simctl', 'launch', target.id, appId, ...args]);
+}
+
+/**
+ * Wakes the device and keeps the screen on for the run. A sleeping Android
+ * device pauses the activity, and React Native pauses JS timers with it, so
+ * the runner would stall silently.
+ */
+export function prepareTarget(target) {
+ if (target.platform !== 'android') {
+ return;
+ }
+ tryRun(adbPath(), ['-s', target.id, 'shell', 'settings', 'put', 'global', 'stay_on_while_plugged_in', '7']);
+ tryRun(adbPath(), ['-s', target.id, 'shell', 'svc', 'power', 'stayon', 'true']);
+ tryRun(adbPath(), ['-s', target.id, 'shell', 'input', 'keyevent', 'KEYCODE_WAKEUP']);
+ tryRun(adbPath(), ['-s', target.id, 'shell', 'wm', 'dismiss-keyguard']);
+ const window = tryRun(adbPath(), ['-s', target.id, 'shell', 'dumpsys', 'window']) ?? '';
+ if (/isKeyguardShowing=true/.test(window)) {
+ throw new Error(
+ `${target.name} is locked with a secure lock screen; unlock it (and keep it unlocked) before running. A locked device pauses the app, so the run would stall.`,
+ );
+ }
+ const connectivity = tryRun(adbPath(), ['-s', target.id, 'shell', 'dumpsys', 'connectivity']) ?? '';
+ if (/Active default network: none/.test(connectivity)) {
+ process.stderr.write(`warning: ${target.name} has no network; map tiles will not load and onMapReady may time out.\n`);
+ }
+}
+
+/** Starts a run: Android through a VIEW intent, iOS through a launch argument (no "Open in" prompt). */
+export function startRun(target, appId, url) {
+ if (target.platform === 'android') {
+ openUrl(target, appId, url);
+ return;
+ }
+ launchApp(target, appId, [`--perf-run=${url}`]);
+}
+
+export function terminateApp(target, appId) {
+ if (target.platform === 'android') {
+ tryRun(adbPath(), ['-s', target.id, 'shell', 'am', 'force-stop', appId]);
+ return;
+ }
+ tryRun('xcrun', ['simctl', 'terminate', target.id, appId]);
+}
+
+/** Copies the app-written result file to `destination`; returns false when unreachable. */
+export function pullResultFile(target, appId, runId, destination) {
+ if (target.platform === 'android') {
+ const remote = `/sdcard/Android/data/${appId}/files/perf-lab/${runId}.json`;
+ return tryRun(adbPath(), ['-s', target.id, 'pull', remote, destination]) != null;
+ }
+ const container = tryRun('xcrun', ['simctl', 'get_app_container', target.id, appId, 'data']);
+ if (container == null) {
+ return false;
+ }
+ const source = path.join(container.trim(), 'Documents', 'perf-lab', `${runId}.json`);
+ return tryRun('cp', [source, destination]) != null;
+}
+
+/**
+ * Drives real touch input for gesture scenarios. Android only: `adb shell
+ * input swipe` for pans and double taps for zoom-ins (adb cannot pinch).
+ */
+export async function performGestures(target, name, durationMs, log) {
+ if (target.platform !== 'android') {
+ log(`gesture window "${name}" (${durationMs} ms): no touch driver for ${target.platform}; perform the gesture by hand`);
+ return;
+ }
+ const size = screenSize(target) ?? { width: 1080, height: 2400 };
+ const cx = Math.round(size.width / 2);
+ const cy = Math.round(size.height / 2);
+ const dx = Math.round(size.width * 0.3);
+ const dy = Math.round(size.height * 0.2);
+ const end = Date.now() + durationMs;
+ let index = 0;
+ while (Date.now() < end) {
+ if (name === 'zoom') {
+ if (index % 4 < 3) {
+ run(adbPath(), ['-s', target.id, 'shell', 'input', 'tap', String(cx), String(cy)]);
+ run(adbPath(), ['-s', target.id, 'shell', 'input', 'tap', String(cx), String(cy)]);
+ } else {
+ run(adbPath(), ['-s', target.id, 'shell', 'input', 'swipe', String(cx), String(cy - dy), String(cx), String(cy + dy), '300']);
+ }
+ } else {
+ const direction = index % 4;
+ const from = [cx - (direction === 0 ? dx : direction === 1 ? -dx : 0), cy - (direction === 2 ? dy : direction === 3 ? -dy : 0)];
+ const to = [cx + (direction === 0 ? dx : direction === 1 ? -dx : 0), cy + (direction === 2 ? dy : direction === 3 ? -dy : 0)];
+ run(adbPath(), ['-s', target.id, 'shell', 'input', 'swipe', String(from[0]), String(from[1]), String(to[0]), String(to[1]), '250']);
+ }
+ index += 1;
+ }
+}
diff --git a/performance/scripts/lib/digest.mjs b/performance/scripts/lib/digest.mjs
new file mode 100644
index 0000000..7bef92e
--- /dev/null
+++ b/performance/scripts/lib/digest.mjs
@@ -0,0 +1,56 @@
+import { formatValue } from './metrics.mjs';
+import { markdownTable } from './util.mjs';
+
+/** Top native spans by main-thread time, as "name total/p95 (count)". */
+function topSpans(native, limit = 3, key = 'mainThreadMs') {
+ if (!native?.available) {
+ return 'N/A';
+ }
+ return Object.entries(native.byName ?? {})
+ .filter(([, stat]) => stat[key] > 0)
+ .sort((a, b) => b[1][key] - a[1][key])
+ .slice(0, limit)
+ .map(([name, stat]) => `${name} ${stat[key].toFixed(1)} ms/p95 ${stat.p95Ms.toFixed(2)} (${stat.count})`)
+ .join('; ');
+}
+
+/** Per-scenario evidence table used for the bottleneck analysis. */
+export function digestTable(results) {
+ const headers = ['Scenario', 'Mount commit', 'Mount → ready', 'Load: native main', 'Top native (interaction)', 'Top background', 'Retained after cleanup', 'Events to JS', 'Bridge latency'];
+ const rows = [...results.values()].map((result) => [
+ result.scenario,
+ formatValue('ms', result.load?.commitMs),
+ formatValue('ms', result.load?.readyMs),
+ topSpans(result.load?.native, 2),
+ topSpans(result.native, 3),
+ topSpans(result.native, 2, 'backgroundMs'),
+ formatValue('mb', result.memory?.retainedAfterCleanupMB),
+ Object.entries(result.transfer?.eventsToJs ?? {}).map(([name, count]) => `${name}:${count}`).join(' ') || '-',
+ result.bridge?.commitToNativeMs ? `${result.bridge.commitToNativeMs.avgMs} ms avg / ${result.bridge.commitToNativeMs.maxMs} max` : 'N/A',
+ ]);
+ return markdownTable(headers, rows);
+}
+
+/** Transfer profile: what each scenario pushed across the bridge. */
+export function transferTable(results) {
+ const headers = ['Scenario', 'Updates', 'Markers sent', 'Coordinates sent', 'Est. bytes', 'Largest update'];
+ const rows = [...results.values()]
+ .filter((result) => Object.keys(result.transfer?.updates ?? {}).length > 0)
+ .map((result) => {
+ const payload = result.transfer.payload ?? {};
+ const items = Object.values(payload).reduce((sum, entry) => sum + entry.items, 0);
+ const coordinates = Object.values(payload).reduce((sum, entry) => sum + entry.coordinates, 0);
+ const bytes = Object.values(payload).reduce((sum, entry) => sum + entry.estimatedBytes, 0);
+ const largest = Object.entries(result.transfer.largestUpdate ?? {})
+ .sort((a, b) => b[1].estimatedBytes - a[1].estimatedBytes)[0];
+ return [
+ result.scenario,
+ Object.entries(result.transfer.updates).map(([key, count]) => `${key}:${count}`).join(' '),
+ String(payload.markers?.items ?? payload.markerChildren?.items ?? 0),
+ String(coordinates),
+ formatValue('bytes', bytes),
+ largest ? `${largest[0]} ${formatValue('bytes', largest[1].estimatedBytes)} (${largest[1].coordinates} coords)` : '-',
+ ];
+ });
+ return markdownTable(headers, rows);
+}
diff --git a/performance/scripts/lib/evidence.mjs b/performance/scripts/lib/evidence.mjs
new file mode 100644
index 0000000..99a2f4a
--- /dev/null
+++ b/performance/scripts/lib/evidence.mjs
@@ -0,0 +1,80 @@
+/**
+ * Pulls the specific numbers the scorecard document cites out of a baseline
+ * run, so PERFORMANCE.md can be regenerated from the result files.
+ */
+function median(values) {
+ const sorted = values.filter((value) => value != null).sort((a, b) => a - b);
+ return sorted.length === 0 ? null : sorted[Math.floor((sorted.length - 1) / 2)];
+}
+
+function stepMedians(result, label, pick) {
+ return median((result?.steps ?? []).filter((step) => step.label === label).map(pick));
+}
+
+function span(result, name) {
+ return result?.native?.byName?.[name] ?? null;
+}
+
+export function evidence(results) {
+ const get = (id) => results.get(id);
+ const m10k = get('mutations-10k');
+ const commit = (label) => stepMedians(m10k, label, (step) => (step.commits.count > 0 ? step.commits.avgMs : null));
+ const bridge = (label) => stepMedians(m10k, label, (step) => step.bridge?.commitToNativeMs?.avgMs ?? null);
+ const setter = (label) => stepMedians(m10k, label, (step) => step.bridge?.setterMs?.avgMs ?? null);
+ const alloc = (label) => stepMedians(m10k, label, (step) => step.hermes?.allocatedBytes ?? null);
+ const stepSpan = (label, name) => stepMedians(m10k, label, (step) => step.native?.byName?.[name]?.totalMs ?? null);
+ return {
+ mount: Object.fromEntries(
+ ['markers-100', 'markers-1k', 'markers-10k', 'markers-50k', 'markers-children-1k', 'markers-10k-rich', 'cluster-50k', 'polyline-100k'].map((id) => [
+ id,
+ { commitMs: get(id)?.load?.commitMs ?? null, readyMs: get(id)?.load?.readyMs ?? null, fingerprintCalls: get(id)?.load?.native?.byName?.['markers.fingerprint']?.count ?? null, setCalls: get(id)?.load?.native?.byName?.['markers.set']?.count ?? null },
+ ]),
+ ),
+ mutations10k: Object.fromEntries(
+ ['add-1', 'update-1', 'update-100', 'update-10pct', 'update-100pct'].map((label) => [
+ label,
+ {
+ commitMs: commit(label),
+ commitToNativeMs: bridge(label),
+ setterMs: setter(label),
+ fingerprintMs: stepSpan(label, 'markers.fingerprint'),
+ indexBuildMs: stepSpan(label, 'markers.indexBuild'),
+ applyDiffMs: stepSpan(label, 'markers.applyDiff'),
+ jsAllocBytes: alloc(label),
+ },
+ ]),
+ ),
+ continuous10k: { commitAvgMs: get('mutations-continuous-10k')?.js?.commits?.avgMs ?? null, commitMaxMs: get('mutations-continuous-10k')?.js?.commits?.maxMs ?? null, jsLagP95: get('mutations-continuous-10k')?.js?.lagMs?.p95 ?? null, jsAllocBytes: get('mutations-continuous-10k')?.allocations?.hermes?.allocatedBytes ?? null, nativeMainMs: get('mutations-continuous-10k')?.native?.mainThreadMs ?? null },
+ cluster: Object.fromEntries(
+ ['cluster-1k', 'cluster-10k', 'cluster-50k'].map((id) => [
+ id,
+ { clusterP95Ms: span(get(id), 'markers.cluster')?.p95Ms ?? null, clusterMaxMs: span(get(id), 'markers.cluster')?.maxMs ?? null, clusterTotalMs: span(get(id), 'markers.cluster')?.totalMs ?? null, refreshes: span(get(id), 'markers.cluster')?.count ?? null, applyDiffP95Ms: span(get(id), 'markers.applyDiff')?.p95Ms ?? null, applyDiffTotalMs: span(get(id), 'markers.applyDiff')?.totalMs ?? null, updateCommitMs: stepMedians(get(id), 'update-1pct', (step) => (step.commits.count > 0 ? step.commits.avgMs : null)), p99: get(id)?.frames?.frameTimeMs?.p99 ?? null, worst: get(id)?.frames?.frameTimeMs?.worst ?? null },
+ ]),
+ ),
+ shapes: Object.fromEntries(
+ ['polyline-10k', 'polyline-100k', 'polygon-10k', 'polylines-200x50', 'polygons-200x20'].map((id) => {
+ const key = id.startsWith('polygon') ? 'polygons.set' : 'polylines.set';
+ return [id, { setP95Ms: span(get(id), key)?.p95Ms ?? null, setMaxMs: span(get(id), key)?.maxMs ?? null, setCalls: span(get(id), key)?.count ?? null, commitAvgMs: get(id)?.js?.commits?.avgMs ?? null, bridgeMs: get(id)?.bridge?.commitToNativeMs?.avgMs ?? null, jsAllocBytes: get(id)?.allocations?.hermes?.allocatedBytes ?? null, p99: get(id)?.frames?.frameTimeMs?.p99 ?? null, jank: get(id)?.frames?.jankRatio ?? null }];
+ }),
+ ),
+ camera: Object.fromEntries(
+ ['camera-idle-10k', 'camera-fast-pan-10k', 'camera-continuous-pan-10k', 'camera-zoom-in-10k', 'camera-zoom-out-10k', 'camera-rapid-zoom-10k', 'camera-rotate-10k', 'camera-pitch-10k', 'camera-fast-pan-50k'].map((id) => [
+ id,
+ { fps: get(id)?.frames?.fps?.average ?? null, p95: get(id)?.frames?.frameTimeMs?.p95 ?? null, p99: get(id)?.frames?.frameTimeMs?.p99 ?? null, worst: get(id)?.frames?.frameTimeMs?.worst ?? null, jank: get(id)?.frames?.jankRatio ?? null, nativeMainMs: get(id)?.native?.mainThreadMs ?? null, applyDiffTotalMs: span(get(id), 'markers.applyDiff')?.totalMs ?? null, applyDiffP95Ms: span(get(id), 'markers.applyDiff')?.p95Ms ?? null, viewForCalls: span(get(id), 'annotation.viewFor')?.count ?? null, visualPropsCalls: span(get(id), 'marker.visualProps')?.count ?? null, cameraApplyP95Ms: span(get(id), 'camera.apply')?.p95Ms ?? null, jsLagP95: get(id)?.js?.lagMs?.p95 ?? null, ramDeltaMB: get(id)?.memory?.interactionDeltaMB ?? null, eventsToJs: get(id)?.transfer?.eventsToJs ?? {} },
+ ]),
+ ),
+ stability: (() => {
+ const result = get('stability-5m');
+ const windows = result?.timeline ?? [];
+ return {
+ windows: windows.map((window) => ({ label: window.label, fps: window.frames?.fps?.average, p99: window.frames?.frameTimeMs?.p99, ramMB: window.memory?.footprintMB, cpu: window.cpuPercent, jsAllocBytes: window.hermes?.allocatedBytes, nativeMainMs: window.native?.mainThreadMs })),
+ retainedAfterCleanupMB: result?.memory?.retainedAfterCleanupMB ?? null,
+ peakMB: result?.memory?.peakMB ?? null,
+ nativeMainMs: result?.native?.mainThreadMs ?? null,
+ applyDiffCalls: span(result, 'markers.applyDiff')?.count ?? null,
+ cycles: result?.metrics?.cycles ?? null,
+ };
+ })(),
+ retained: Object.fromEntries([...results.values()].map((result) => [result.scenario, result.memory?.retainedAfterCleanupMB ?? null])),
+ };
+}
diff --git a/performance/scripts/lib/logs.mjs b/performance/scripts/lib/logs.mjs
new file mode 100644
index 0000000..12e3158
--- /dev/null
+++ b/performance/scripts/lib/logs.mjs
@@ -0,0 +1,74 @@
+import { adbPath } from './devices.mjs';
+import { spawnProcess, tryRun } from './util.mjs';
+
+const MARKER = '[perf-lab] ';
+
+/**
+ * Streams `[perf-lab] {...}` events from the device log. Android: logcat with
+ * the `NitroMapsPerfLab` tag. iOS simulator: `log stream` filtered on the
+ * lab's os_log subsystem. Returns a handle with `stop()`.
+ */
+export function startLogTail(target, onEvent, onRaw) {
+ let child;
+ if (target.platform === 'android') {
+ tryRun(adbPath(), ['-s', target.id, 'logcat', '-c']);
+ child = spawnProcess(adbPath(), ['-s', target.id, 'logcat', '-v', 'raw', '-s', 'NitroMapsPerfLab']);
+ } else {
+ child = spawnProcess('xcrun', [
+ 'simctl',
+ 'spawn',
+ target.id,
+ 'log',
+ 'stream',
+ '--style',
+ 'compact',
+ '--predicate',
+ 'subsystem == "com.nitromaps.perflab"',
+ ]);
+ }
+ let buffer = '';
+ const handleChunk = (chunk) => {
+ buffer += chunk.toString('utf8');
+ const lines = buffer.split('\n');
+ buffer = lines.pop() ?? '';
+ for (const line of lines) {
+ onRaw?.(line);
+ const start = line.indexOf(MARKER);
+ if (start < 0) {
+ continue;
+ }
+ try {
+ onEvent(JSON.parse(line.slice(start + MARKER.length)));
+ } catch {
+ // truncated or interleaved line
+ }
+ }
+ };
+ child.stdout.on('data', handleChunk);
+ child.stderr.on('data', (chunk) => onRaw?.(`[stderr] ${chunk.toString('utf8').trim()}`));
+ return {
+ stop() {
+ child.kill('SIGTERM');
+ },
+ };
+}
+
+/** Reassembles a run file streamed as base64 `result-chunk` events. */
+export function assembleChunks(chunks) {
+ if (chunks.size === 0) {
+ return null;
+ }
+ const total = [...chunks.values()][0].total;
+ if (chunks.size !== total) {
+ return null;
+ }
+ let json = '';
+ for (let index = 0; index < total; index += 1) {
+ const chunk = chunks.get(index);
+ if (chunk == null) {
+ return null;
+ }
+ json += Buffer.from(chunk.data, 'base64').toString('utf8');
+ }
+ return JSON.parse(json);
+}
diff --git a/performance/scripts/lib/metrics.mjs b/performance/scripts/lib/metrics.mjs
new file mode 100644
index 0000000..fb33613
--- /dev/null
+++ b/performance/scripts/lib/metrics.mjs
@@ -0,0 +1,89 @@
+/**
+ * Metric definitions shared by `compare`, `check` and `report`.
+ * `better`: which direction is an improvement. `kind`: how to format.
+ */
+export const METRICS = [
+ { key: 'fps', label: 'FPS avg', better: 'higher', kind: 'number', get: (r) => r.frames?.fps?.average },
+ { key: 'fpsP95', label: 'FPS p95 window', better: 'higher', kind: 'number', get: (r) => r.frames?.fps?.p95 },
+ { key: 'p50', label: 'Frame p50', better: 'lower', kind: 'ms', get: (r) => r.frames?.frameTimeMs?.p50 },
+ { key: 'p95', label: 'Frame p95', better: 'lower', kind: 'ms', get: (r) => r.frames?.frameTimeMs?.p95 },
+ { key: 'p99', label: 'Frame p99', better: 'lower', kind: 'ms', get: (r) => r.frames?.frameTimeMs?.p99 },
+ { key: 'worst', label: 'Worst frame', better: 'lower', kind: 'ms', get: (r) => r.frames?.frameTimeMs?.worst },
+ { key: 'jank', label: 'Jank ratio', better: 'lower', kind: 'ratio', get: (r) => r.frames?.jankRatio },
+ { key: 'longFrames', label: 'Frames > 50 ms', better: 'lower', kind: 'count', get: (r) => r.frames?.longFrames },
+ { key: 'jsLagP95', label: 'JS lag p95', better: 'lower', kind: 'ms', get: (r) => r.js?.lagMs?.p95 },
+ { key: 'jsBusy', label: 'JS busy ratio', better: 'lower', kind: 'ratio', get: (r) => r.js?.busyRatio },
+ { key: 'jsCommitBusy', label: 'JS commit busy', better: 'lower', kind: 'ratio', get: (r) => (r.js?.commits?.count > 0 && r.durationMs > 0 ? r.js.commits.totalMs / r.durationMs : null) },
+ { key: 'jsCommit', label: 'JS commit avg', better: 'lower', kind: 'ms', get: (r) => (r.js?.commits?.count > 0 ? r.js.commits.avgMs : null) },
+ { key: 'jsCommitMax', label: 'JS commit max', better: 'lower', kind: 'ms', get: (r) => (r.js?.commits?.count > 0 ? r.js.commits.maxMs : null) },
+ { key: 'loadCommit', label: 'Mount commit', better: 'lower', kind: 'ms', get: (r) => r.load?.commitMs },
+ { key: 'loadReady', label: 'Mount → ready', better: 'lower', kind: 'ms', get: (r) => r.load?.readyMs },
+ { key: 'nativeMain', label: 'Native main-thread', better: 'lower', kind: 'ms', get: (r) => (r.native?.available ? r.native.mainThreadMs : null) },
+ { key: 'nativeBg', label: 'Native background', better: 'lower', kind: 'ms', get: (r) => (r.native?.available ? r.native.backgroundMs : null) },
+ { key: 'setter', label: 'Native setter avg', better: 'lower', kind: 'ms', get: (r) => r.bridge?.setterMs?.avgMs ?? null },
+ { key: 'bridgeLatency', label: 'Commit → native', better: 'lower', kind: 'ms', get: (r) => r.bridge?.commitToNativeMs?.avgMs ?? null },
+ { key: 'memAfter', label: 'RAM after', better: 'lower', kind: 'mb', get: (r) => r.memory?.afterInteractionMB },
+ { key: 'memDelta', label: 'RAM Δ interaction', better: 'lower', kind: 'mb', get: (r) => r.memory?.interactionDeltaMB },
+ { key: 'memRetained', label: 'RAM retained', better: 'lower', kind: 'mb', get: (r) => r.memory?.retainedAfterCleanupMB },
+ { key: 'jsAlloc', label: 'JS allocated', better: 'lower', kind: 'bytes', get: (r) => r.allocations?.hermes?.allocatedBytes ?? null },
+ { key: 'jsGc', label: 'JS GCs', better: 'lower', kind: 'count', get: (r) => r.allocations?.hermes?.gcCount ?? null },
+ { key: 'javaAlloc', label: 'Java allocated', better: 'lower', kind: 'bytes', get: (r) => r.allocations?.android?.javaBytesAllocated ?? null },
+ { key: 'javaGc', label: 'ART GCs', better: 'lower', kind: 'count', get: (r) => r.allocations?.android?.gcCount ?? null },
+ { key: 'mallocBlocks', label: 'malloc blocks Δ', better: 'lower', kind: 'count', get: (r) => r.allocations?.ios?.mallocBlocksDelta ?? null },
+ { key: 'cpu', label: 'CPU', better: 'lower', kind: 'pct', get: (r) => r.cpu?.percent },
+];
+
+export const SCORECARD_METRICS = ['fps', 'p95', 'p99', 'worst', 'jank', 'jsLagP95', 'jsCommit', 'nativeMain', 'memAfter', 'memDelta', 'jsAlloc', 'cpu'];
+
+export function metric(key) {
+ return METRICS.find((entry) => entry.key === key);
+}
+
+export function formatValue(kind, value) {
+ if (value == null || Number.isNaN(value)) {
+ return 'N/A';
+ }
+ switch (kind) {
+ case 'ms':
+ return `${Number(value).toFixed(value < 10 ? 2 : 1)} ms`;
+ case 'ratio':
+ return `${(Number(value) * 100).toFixed(1)} %`;
+ case 'pct':
+ return `${Number(value).toFixed(0)} %`;
+ case 'mb':
+ return `${Number(value).toFixed(0)} MB`;
+ case 'bytes': {
+ const abs = Math.abs(value);
+ if (abs >= 1024 * 1024) {
+ return `${(value / (1024 * 1024)).toFixed(1)} MB`;
+ }
+ if (abs >= 1024) {
+ return `${(value / 1024).toFixed(0)} KB`;
+ }
+ return `${value} B`;
+ }
+ case 'count':
+ return String(Math.round(value));
+ default:
+ return Number(value).toFixed(1);
+ }
+}
+
+/**
+ * Signed percentage change from baseline to current, oriented so that a
+ * positive number is always an improvement. Returns null when either side
+ * is unavailable.
+ */
+export function improvementPct(definition, baseline, current, minAbsolute = 0) {
+ if (baseline == null || current == null) {
+ return null;
+ }
+ if (Math.abs(current - baseline) < minAbsolute) {
+ return 0;
+ }
+ if (baseline === 0) {
+ return current === 0 ? 0 : definition.better === 'lower' ? -100 : 100;
+ }
+ const change = ((current - baseline) / Math.abs(baseline)) * 100;
+ return definition.better === 'lower' ? -change : change;
+}
diff --git a/performance/scripts/lib/results.mjs b/performance/scripts/lib/results.mjs
new file mode 100644
index 0000000..7e06352
--- /dev/null
+++ b/performance/scripts/lib/results.mjs
@@ -0,0 +1,87 @@
+import { existsSync, readdirSync } from 'node:fs';
+import path from 'node:path';
+import { BASELINE_DIR, RUNS_DIR, ensureDir, readJson, slug, writeJson } from './util.mjs';
+
+export function deviceSlug(run) {
+ const device = run.device ?? {};
+ return slug(`${device.manufacturer ?? ''}-${device.model ?? 'unknown'}`);
+}
+
+export function buildSlug(run) {
+ const build = run.build ?? {};
+ return `${build.type ?? 'unknown'}${build.jsDev ? '-devjs' : ''}${build.perfProbes ? '-probes' : ''}`;
+}
+
+/** Writes `run.json` plus one file per scenario into `dir`. */
+export function saveRun(run, dir) {
+ ensureDir(dir);
+ writeJson(path.join(dir, 'run.json'), run);
+ for (const result of run.results) {
+ writeJson(path.join(dir, `${result.scenario}.json`), result);
+ }
+ return dir;
+}
+
+export function runDirFor(run) {
+ return path.join(RUNS_DIR, `${run.runId}-${run.platform}-${deviceSlug(run)}`);
+}
+
+export function baselineDirFor(run) {
+ return path.join(BASELINE_DIR, run.platform, `${deviceSlug(run)}-${buildSlug(run)}`);
+}
+
+/** Loads a run directory (or a single run.json) into `{ run, results: Map }`. */
+export function loadRun(target) {
+ const file = target.endsWith('.json') ? target : path.join(target, 'run.json');
+ if (!existsSync(file)) {
+ throw new Error(`No run.json in ${target}`);
+ }
+ const run = readJson(file);
+ const results = new Map();
+ for (const result of run.results ?? []) {
+ // Keep the first occurrence per scenario when a run repeated scenarios.
+ if (!results.has(result.scenario)) {
+ results.set(result.scenario, result);
+ }
+ }
+ return { run, results, dir: path.dirname(file) };
+}
+
+export function latestRunDir(platform) {
+ if (!existsSync(RUNS_DIR)) {
+ return null;
+ }
+ const dirs = readdirSync(RUNS_DIR)
+ .filter((name) => platform == null || name.includes(`-${platform}-`))
+ .sort();
+ return dirs.length > 0 ? path.join(RUNS_DIR, dirs[dirs.length - 1]) : null;
+}
+
+export function baselineDirs() {
+ if (!existsSync(BASELINE_DIR)) {
+ return [];
+ }
+ const dirs = [];
+ for (const platform of readdirSync(BASELINE_DIR)) {
+ const platformDir = path.join(BASELINE_DIR, platform);
+ if (!existsSync(path.join(platformDir))) {
+ continue;
+ }
+ for (const entry of readdirSync(platformDir, { withFileTypes: true })) {
+ if (entry.isDirectory() && existsSync(path.join(platformDir, entry.name, 'run.json'))) {
+ dirs.push(path.join(platformDir, entry.name));
+ }
+ }
+ }
+ return dirs;
+}
+
+/** Picks the baseline recorded on the same platform/device/build as `run`. */
+export function matchingBaseline(run) {
+ const wanted = baselineDirFor(run);
+ if (existsSync(path.join(wanted, 'run.json'))) {
+ return wanted;
+ }
+ const sameDevice = baselineDirs().filter((dir) => dir.includes(path.join(run.platform, deviceSlug(run))));
+ return sameDevice[0] ?? null;
+}
diff --git a/performance/scripts/lib/util.mjs b/performance/scripts/lib/util.mjs
new file mode 100644
index 0000000..a0af0c6
--- /dev/null
+++ b/performance/scripts/lib/util.mjs
@@ -0,0 +1,124 @@
+import { execFileSync, spawn } from 'node:child_process';
+import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+export const PERF_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
+export const REPO_DIR = path.resolve(PERF_DIR, '..');
+export const RESULTS_DIR = path.join(PERF_DIR, 'results');
+export const RUNS_DIR = path.join(RESULTS_DIR, 'runs');
+export const BASELINE_DIR = path.join(RESULTS_DIR, 'baseline');
+export const APP_ID = 'com.nitromaps.example';
+export const URL_SCHEME = 'nitromapsperf';
+
+export function parseArgs(argv) {
+ const positional = [];
+ const flags = {};
+ for (let index = 0; index < argv.length; index += 1) {
+ const arg = argv[index];
+ if (arg.startsWith('--')) {
+ const [key, inline] = arg.slice(2).split('=');
+ if (inline !== undefined) {
+ flags[key] = inline;
+ } else if (index + 1 < argv.length && !argv[index + 1].startsWith('--')) {
+ flags[key] = argv[index + 1];
+ index += 1;
+ } else {
+ flags[key] = true;
+ }
+ } else {
+ positional.push(arg);
+ }
+ }
+ return { positional, flags };
+}
+
+export function run(command, args, options = {}) {
+ return execFileSync(command, args, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], ...options });
+}
+
+export function tryRun(command, args, options = {}) {
+ try {
+ return run(command, args, options);
+ } catch {
+ return null;
+ }
+}
+
+export function spawnProcess(command, args, options = {}) {
+ return spawn(command, args, { stdio: ['ignore', 'pipe', 'pipe'], ...options });
+}
+
+export function ensureDir(dir) {
+ mkdirSync(dir, { recursive: true });
+ return dir;
+}
+
+export function readJson(file) {
+ return JSON.parse(readFileSync(file, 'utf8'));
+}
+
+export function writeJson(file, value) {
+ ensureDir(path.dirname(file));
+ writeFileSync(file, `${JSON.stringify(value, null, 2)}\n`);
+}
+
+export function slug(value) {
+ return String(value)
+ .toLowerCase()
+ .replace(/[^a-z0-9]+/g, '-')
+ .replace(/^-+|-+$/g, '');
+}
+
+export function timestamp() {
+ const now = new Date();
+ const pad = (value) => String(value).padStart(2, '0');
+ return `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;
+}
+
+export function listRunDirs(root) {
+ if (!existsSync(root)) {
+ return [];
+ }
+ return readdirSync(root, { withFileTypes: true })
+ .filter((entry) => entry.isDirectory())
+ .map((entry) => path.join(root, entry.name))
+ .sort();
+}
+
+export function sleep(ms) {
+ return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+export function formatMs(value, digits = 1) {
+ return value == null || Number.isNaN(value) ? 'N/A' : `${Number(value).toFixed(digits)} ms`;
+}
+
+export function formatNumber(value, digits = 1) {
+ return value == null || Number.isNaN(value) ? 'N/A' : Number(value).toFixed(digits);
+}
+
+export function formatPct(value, digits = 1) {
+ return value == null || Number.isNaN(value) ? 'N/A' : `${(Number(value) * 100).toFixed(digits)} %`;
+}
+
+export function formatBytes(value) {
+ if (value == null || Number.isNaN(value)) {
+ return 'N/A';
+ }
+ const abs = Math.abs(value);
+ if (abs >= 1024 * 1024) {
+ return `${(value / (1024 * 1024)).toFixed(1)} MB`;
+ }
+ if (abs >= 1024) {
+ return `${(value / 1024).toFixed(0)} KB`;
+ }
+ return `${value} B`;
+}
+
+/** Renders rows as a GitHub-flavoured Markdown table. */
+export function markdownTable(headers, rows, align = []) {
+ const line = (cells) => `| ${cells.join(' | ')} |`;
+ const separator = headers.map((_, index) => (align[index] === 'right' ? '---:' : '---'));
+ return [line(headers), line(separator), ...rows.map(line)].join('\n');
+}
diff --git a/performance/scripts/perf.mjs b/performance/scripts/perf.mjs
new file mode 100644
index 0000000..3f5613c
--- /dev/null
+++ b/performance/scripts/perf.mjs
@@ -0,0 +1,698 @@
+#!/usr/bin/env bun
+/**
+ * Performance lab CLI. `bun perf help` lists the commands.
+ *
+ * Runs are executed by the lab build of the example app on a device; this
+ * script starts them through a deep link, follows the device log for
+ * progress, pulls the result file and stores it under performance/results.
+ */
+import { existsSync, readFileSync, writeFileSync } from 'node:fs';
+import path from 'node:path';
+import { REGRESSION_THRESHOLDS, SUITES } from '../perf.config.ts';
+import { catalog, resolveScenarios } from '../scenarios/index.ts';
+import {
+ checkRegressions,
+ compareRuns,
+ formatDetail,
+ formatOverview,
+ scorecard,
+ stepsTable,
+ timelineTable,
+} from './lib/compare.mjs';
+import { digestTable, transferTable } from './lib/digest.mjs';
+import { evidence } from './lib/evidence.mjs';
+import {
+ isAppInstalled,
+ listDevices,
+ performGestures,
+ prepareTarget,
+ pullResultFile,
+ resolveTarget,
+ startRun,
+ terminateApp,
+} from './lib/devices.mjs';
+import { assembleChunks, startLogTail } from './lib/logs.mjs';
+import {
+ baselineDirFor,
+ baselineDirs,
+ latestRunDir,
+ loadRun,
+ matchingBaseline,
+ runDirFor,
+ saveRun,
+} from './lib/results.mjs';
+import {
+ APP_ID,
+ PERF_DIR,
+ REPO_DIR,
+ RUNS_DIR,
+ URL_SCHEME,
+ ensureDir,
+ markdownTable,
+ parseArgs,
+ run as sh,
+ sleep,
+ timestamp,
+} from './lib/util.mjs';
+
+const HELP = `react-native-better-maps performance lab
+
+Usage: bun perf [options]
+
+ list [--group g] [--tag t] List scenarios (ids, groups, tags, estimated duration).
+ devices List connected Android devices and booted iOS simulators.
+ run [options] Run scenarios on a device. Selectors: ids, groups, tag:, prefix*.
+ --suite Run a suite from perf.config.ts (${Object.keys(SUITES).join(', ')}).
+ --platform ios|android Target platform (required when more than one target is available).
+ --device adb serial or simulator udid/name.
+ --label Free-form label stored with the run (branch, PR, hypothesis).
+ --repeat Run every selected scenario n times (n results per scenario).
+ --provider apple|google Map provider (iOS only; Android is always google).
+ --timeout Override the run timeout.
+ --baseline Also store the run as the baseline for this device and build.
+ baseline [options] Shorthand for: run --suite baseline --baseline.
+ compare [baselineDir] [runDir] Compare a run against a baseline (defaults: matching baseline, latest run).
+ --detail Every metric per scenario instead of the overview.
+ check [options] Like compare, then apply the regression thresholds.
+ --fail Exit 1 when a regression exceeds its threshold (off by default).
+ report [runDir] [--out file] Markdown scorecard (+ step and timeline tables) for a run.
+ --digest Add the per-scenario evidence table (load, dominant native spans, retained memory).
+ --transfer Add the JS → native transfer table (updates, items, coordinates, bytes).
+ evidence [runDir] JSON with the numbers PERFORMANCE.md cites (mount, mutation steps, clustering, shapes, camera, stability).
+ scorecard [--write] Markdown for every baseline under results/baseline; --write replaces the
+ RESULTS block in performance/PERFORMANCE.md.
+ bench JS micro-benchmarks (bun, no device): serialization, collection, geometry.
+ fixtures Verify fixture determinism (bun test performance/fixtures).
+ build android|ios [options] Build the lab variant of the example app (see performance/README.md).
+ --debug Debug configuration instead of release.
+ --no-probes Leave PerfProbe recording out of the library.
+ --arch Android ABI (default arm64-v8a).
+ --install Install on the selected device/simulator after building.
+ install android|ios [--device] Install the last built lab app.
+ help This text.
+`;
+
+function print(text = '') {
+ process.stdout.write(`${text}\n`);
+}
+
+function fail(message) {
+ process.stderr.write(`error: ${message}\n`);
+ process.exit(1);
+}
+
+function buildUrl(params) {
+ const query = Object.entries(params)
+ .filter(([, value]) => value != null && value !== '')
+ .map(
+ ([key, value]) =>
+ `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,
+ )
+ .join('&');
+ return `${URL_SCHEME}://run?${query}`;
+}
+
+function commandList(flags) {
+ const entries = catalog().filter(
+ (entry) =>
+ (flags.group == null || entry.group === flags.group) &&
+ (flags.tag == null || entry.tags.includes(flags.tag)),
+ );
+ print(
+ markdownTable(
+ ['Id', 'Group', 'Tags', 'Est.', 'Description'],
+ entries.map((entry) => [
+ entry.id,
+ entry.group,
+ entry.tags.join(', ') || '-',
+ `${Math.round(entry.estimatedDurationMs / 1000)} s`,
+ entry.description,
+ ]),
+ ),
+ );
+ print(
+ `\n${entries.length} scenarios. Suites: ${Object.entries(SUITES)
+ .map(
+ ([name, selectors]) =>
+ `${name} (${resolveScenarios(selectors).length})`,
+ )
+ .join(', ')}`,
+ );
+}
+
+function commandDevices() {
+ const devices = listDevices();
+ if (devices.length === 0) {
+ print('No connected Android devices or booted iOS simulators.');
+ return;
+ }
+ print(
+ markdownTable(
+ ['Platform', 'Id', 'Name', 'Kind'],
+ devices.map((device) => [
+ device.platform,
+ device.id,
+ device.name,
+ device.simulator ? 'simulator/emulator' : 'device',
+ ]),
+ ),
+ );
+}
+
+async function commandRun(positional, flags, { asBaseline = false } = {}) {
+ const suite = flags.suite ?? (positional.length === 0 ? 'quick' : undefined);
+ const selectors = suite != null ? SUITES[suite] : positional;
+ if (selectors == null) {
+ fail(`unknown suite "${suite}"; known: ${Object.keys(SUITES).join(', ')}`);
+ }
+ const scenarios = resolveScenarios(selectors);
+ const repeat = Number.parseInt(flags.repeat ?? '1', 10) || 1;
+ const estimatedMs =
+ scenarios.reduce(
+ (sum, scenario) => sum + scenario.estimatedDurationMs + 6000,
+ 0,
+ ) * repeat;
+ const timeoutMs =
+ Number.parseInt(flags.timeout ?? '0', 10) || estimatedMs * 2 + 90_000;
+ const target = resolveTarget({
+ platform: flags.platform,
+ device: flags.device,
+ });
+ if (!isAppInstalled(target, APP_ID)) {
+ fail(
+ `${APP_ID} is not installed on ${target.name}. Build and install the lab app first: bun perf build ${target.platform} --install`,
+ );
+ }
+ const runId = `${timestamp()}-${Math.random().toString(36).slice(2, 6)}`;
+ print(`Target: ${target.platform} ${target.name} (${target.id})`);
+ print(
+ `Run ${runId}: ${scenarios.length} scenario(s) × ${repeat}, timeout ${Math.round(timeoutMs / 1000)} s`,
+ );
+ print(scenarios.map((scenario) => ` - ${scenario.id}`).join('\n'));
+
+ const chunks = new Map();
+ let completion = null;
+ let runFile = null;
+ let sawStart = false;
+ const gestures = [];
+ const tail = startLogTail(target, (event) => {
+ if (event.runId != null && event.runId !== runId) {
+ return;
+ }
+ if (event.runId === runId) {
+ sawStart = true;
+ }
+ switch (event.event) {
+ case 'run-start':
+ print(
+ `app: run started (${event.device}, ${event.build} build, probes ${event.probes ? 'on' : 'off'})`,
+ );
+ break;
+ case 'scenario-start':
+ print(`▶ ${event.scenario} (${event.index + 1}/${event.total})`);
+ break;
+ case 'scenario-result':
+ print(
+ ` ${event.scenario}: ${event.fps} fps · p95 ${event.p95} ms · p99 ${event.p99} ms · worst ${event.worst} ms · jank ${(event.jank * 100).toFixed(1)} % · js lag p95 ${event.jsLagP95} ms · commit avg ${event.jsCommitAvg} ms · RAM ${event.memAfterMB} MB (${event.memDeltaMB >= 0 ? '+' : ''}${event.memDeltaMB}) · cpu ${event.cpuPct} %`,
+ );
+ break;
+ case 'scenario-failed':
+ print(` ${event.scenario}: FAILED ${event.error}`);
+ break;
+ case 'gesture-window':
+ gestures.push(
+ performGestures(target, event.name, event.durationMs, print),
+ );
+ break;
+ case 'result-chunk':
+ chunks.set(event.index, event);
+ break;
+ case 'run-complete':
+ completion = event;
+ break;
+ case 'error':
+ print(`app error: ${event.message}`);
+ break;
+ case 'busy':
+ fail(
+ 'the app is already running a suite; wait for it or restart the app',
+ );
+ break;
+ default:
+ break;
+ }
+ });
+
+ try {
+ // Every run starts from a cold process so memory baselines are comparable
+ // and no previous suite can still be running.
+ terminateApp(target, APP_ID);
+ prepareTarget(target);
+ // `log stream` / logcat need a moment to attach or the first events are lost.
+ await sleep(target.platform === 'ios' ? 4000 : 1500);
+ startRun(
+ target,
+ APP_ID,
+ buildUrl({
+ scenarios: suite
+ ? undefined
+ : scenarios.map((scenario) => scenario.id).join(','),
+ suite,
+ runId,
+ label: flags.label,
+ repeat,
+ provider: flags.provider,
+ }),
+ );
+ const deadline = Date.now() + timeoutMs;
+ while (completion == null && Date.now() < deadline) {
+ await sleep(500);
+ if (!sawStart && Date.now() - (deadline - timeoutMs) > 30_000) {
+ fail(
+ 'the app did not acknowledge the run within 30 s. Is it the lab build (EXPO_PUBLIC_PERF_LAB=1) and in the foreground?',
+ );
+ }
+ }
+ await Promise.all(gestures);
+ if (completion == null) {
+ fail(
+ `timed out after ${Math.round(timeoutMs / 1000)} s waiting for run-complete`,
+ );
+ }
+ await sleep(500);
+ const tmpFile = path.join(
+ ensureDir(path.join(RUNS_DIR, '.tmp')),
+ `${runId}.json`,
+ );
+ if (pullResultFile(target, APP_ID, runId, tmpFile) && existsSync(tmpFile)) {
+ runFile = JSON.parse(readFileSync(tmpFile, 'utf8'));
+ } else {
+ runFile = assembleChunks(chunks);
+ if (runFile == null) {
+ fail(
+ 'could not pull the result file and the log chunks were incomplete',
+ );
+ }
+ print('(result file pulled from log chunks)');
+ }
+ } finally {
+ tail.stop();
+ }
+
+ const dir = saveRun(runFile, runDirFor(runFile));
+ writeFileSync(path.join(dir, 'summary.md'), renderReport(runFile));
+ print(
+ `\nSaved ${runFile.results.length} result(s) to ${path.relative(REPO_DIR, dir)}`,
+ );
+ if (asBaseline || flags.baseline) {
+ const baselineDir = saveRun(runFile, baselineDirFor(runFile));
+ writeFileSync(path.join(baselineDir, 'summary.md'), renderReport(runFile));
+ print(`Stored as baseline: ${path.relative(REPO_DIR, baselineDir)}`);
+ }
+ print('');
+ print(renderReport(runFile));
+}
+
+function renderReport(runFile) {
+ const { run, results } = loadRunObject(runFile);
+ const device = run.device ?? {};
+ const build = run.build ?? {};
+ const lines = [];
+ lines.push(
+ `Run ${run.runId}${run.label ? ` (${run.label})` : ''} · ${run.platform} ${device.osVersion ?? ''} · ${device.manufacturer ?? ''} ${device.model ?? ''} · ${device.refreshRateHz ?? '?'} Hz · provider ${run.provider}`,
+ );
+ lines.push(
+ `Build: ${build.type}${build.jsDev ? ' + dev JS' : ''}${build.hermes ? ', Hermes' : ''}${build.perfProbes ? ', probes' : ', no probes'} · ${build.representative ? 'REPRESENTATIVE' : 'NOT production-representative'}${(build.caveats ?? []).length ? ` (${build.caveats.join('; ')})` : ''}`,
+ );
+ lines.push(`Recorded ${run.startedAt} → ${run.finishedAt}`);
+ lines.push('');
+ lines.push(scorecard(results));
+ for (const result of results.values()) {
+ if ((result.steps ?? []).length > 0) {
+ const steps = stepsTable(result);
+ lines.push(
+ '',
+ `#### ${result.scenario} steps (median over repeats)`,
+ '',
+ steps.table,
+ );
+ if (steps.exponent != null) {
+ lines.push(
+ '',
+ `JS commit cost vs. changed markers: empirical exponent ${steps.exponent.toFixed(2)} (0 = flat, 1 = linear).`,
+ );
+ }
+ }
+ const timeline = timelineTable(result);
+ if (timeline != null) {
+ lines.push('', `#### ${result.scenario} timeline`, '', timeline.table);
+ lines.push(
+ '',
+ `Drift first → last window: FPS ${timeline.drift.fps == null ? 'N/A' : timeline.drift.fps.toFixed(1)}, RAM ${timeline.drift.memoryMB == null ? 'N/A' : `${timeline.drift.memoryMB.toFixed(0)} MB`}.`,
+ );
+ }
+ if ((result.errors ?? []).length > 0) {
+ lines.push('', `${result.scenario} errors: ${result.errors.join('; ')}`);
+ }
+ }
+ if ((run.failures ?? []).length > 0) {
+ lines.push(
+ '',
+ `Failures: ${run.failures.map((failure) => `${failure.scenario} (${failure.error})`).join(', ')}`,
+ );
+ }
+ return `${lines.join('\n')}\n`;
+}
+
+function loadRunObject(runFile) {
+ const results = new Map();
+ for (const result of runFile.results ?? []) {
+ if (!results.has(result.scenario)) {
+ results.set(result.scenario, result);
+ }
+ }
+ return { run: runFile, results };
+}
+
+function resolveComparison(positional, flags) {
+ let currentDir = positional[1] ?? flags.current ?? null;
+ let baselineDir = positional[0] ?? flags.baseline ?? null;
+ if (positional.length === 1 && baselineDir != null && !flags.baseline) {
+ // A single positional argument is the current run.
+ currentDir = baselineDir;
+ baselineDir = null;
+ }
+ if (currentDir == null) {
+ currentDir = latestRunDir(flags.platform);
+ if (currentDir == null) {
+ fail('no runs under performance/results/runs; run something first');
+ }
+ }
+ const current = loadRun(currentDir);
+ if (baselineDir == null) {
+ baselineDir = matchingBaseline(current.run);
+ if (baselineDir == null) {
+ fail(
+ `no baseline for ${current.run.platform} / ${current.run.device?.model}. Known baselines: ${
+ baselineDirs()
+ .map((dir) => path.relative(PERF_DIR, dir))
+ .join(', ') || 'none'
+ }. Record one with bun perf baseline.`,
+ );
+ }
+ }
+ const baseline = loadRun(baselineDir);
+ print(
+ `Baseline: ${path.relative(REPO_DIR, baseline.dir)} (${baseline.run.runId})`,
+ );
+ print(
+ `Current: ${path.relative(REPO_DIR, current.dir)} (${current.run.runId})`,
+ );
+ if (
+ baseline.run.device?.model !== current.run.device?.model ||
+ baseline.run.build?.type !== current.run.build?.type
+ ) {
+ print(
+ 'warning: baseline and current differ in device or build type; numbers are not directly comparable',
+ );
+ }
+ return compareRuns(baseline, current, {
+ minAbsoluteMs: REGRESSION_THRESHOLDS.minAbsoluteMs,
+ });
+}
+
+function commandCompare(positional, flags) {
+ const comparison = resolveComparison(positional, flags);
+ print('');
+ print(flags.detail ? formatDetail(comparison) : formatOverview(comparison));
+ if (comparison.missing.length > 0) {
+ print(`\nNot in baseline: ${comparison.missing.join(', ')}`);
+ }
+}
+
+function commandCheck(positional, flags) {
+ const comparison = resolveComparison(positional, flags);
+ const verdict = checkRegressions(comparison, REGRESSION_THRESHOLDS);
+ print('');
+ print(
+ formatOverview(comparison, [
+ 'fps',
+ 'p95',
+ 'p99',
+ 'jank',
+ 'jsCommit',
+ 'setter',
+ 'memAfter',
+ ]),
+ );
+ print('');
+ if (verdict.regressions.length === 0) {
+ print('No regressions beyond the thresholds.');
+ } else {
+ print(`${verdict.regressions.length} regression(s):`);
+ print(
+ markdownTable(
+ ['Scenario', 'Metric', 'Baseline', 'Current', 'Change', 'Threshold'],
+ verdict.regressions.map((entry) => [
+ entry.scenario,
+ entry.label,
+ entry.baseline,
+ entry.current,
+ entry.change,
+ entry.threshold,
+ ]),
+ ),
+ );
+ }
+ if (verdict.improvements.length > 0) {
+ print(
+ `\n${verdict.improvements.length} improvement(s) beyond the thresholds: ${verdict.improvements.map((entry) => `${entry.scenario}/${entry.metric} ${entry.change}`).join(', ')}`,
+ );
+ }
+ if (verdict.skipped.length > 0) {
+ print(`\nSkipped (N/A on one side): ${verdict.skipped.length} metric(s)`);
+ }
+ if (verdict.regressions.length > 0 && flags.fail) {
+ process.exit(1);
+ }
+}
+
+function commandReport(positional, flags) {
+ const dir = positional[0] ?? latestRunDir(flags.platform);
+ if (dir == null) {
+ fail('no run directory');
+ }
+ const { run, results } = loadRun(dir);
+ let report = renderReport(run);
+ if (flags.digest) {
+ report += `\n#### Evidence per scenario\n\n${digestTable(results)}\n`;
+ }
+ if (flags.transfer) {
+ report += `\n#### JS → native transfer\n\n${transferTable(results)}\n`;
+ }
+ if (flags.out) {
+ writeFileSync(flags.out, report);
+ print(`wrote ${flags.out}`);
+ } else {
+ print(report);
+ }
+}
+
+function commandBench() {
+ const outDir = ensureDir(path.join(PERF_DIR, 'results', 'bench'));
+ print(
+ `JS micro-benchmarks (bun ${process.versions.bun ?? ''}); output in ${path.relative(REPO_DIR, outDir)}`,
+ );
+ sh('bun', ['test', 'performance/benchmarks', '--timeout', '600000'], {
+ cwd: REPO_DIR,
+ stdio: 'inherit',
+ });
+}
+
+function commandFixtures() {
+ sh('bun', ['test', 'performance/fixtures'], {
+ cwd: REPO_DIR,
+ stdio: 'inherit',
+ });
+}
+
+function commandBuild(positional, flags) {
+ const platform = positional[0];
+ if (platform !== 'android' && platform !== 'ios') {
+ fail('usage: bun perf build android|ios');
+ }
+ const script = path.join(PERF_DIR, 'scripts', `build-${platform}.sh`);
+ const args = [
+ flags.debug ? 'debug' : 'release',
+ flags['no-probes'] ? '0' : '1',
+ ];
+ if (platform === 'android') {
+ args.push(flags.arch ?? 'arm64-v8a');
+ }
+ sh('bash', [script, ...args], { cwd: REPO_DIR, stdio: 'inherit' });
+ if (flags.install) {
+ commandInstall([platform], flags);
+ }
+}
+
+function commandInstall(positional, flags) {
+ const platform = positional[0];
+ const target = resolveTarget({ platform, device: flags.device });
+ if (platform === 'android') {
+ const variant = flags.debug ? 'debug' : 'release';
+ const apk = path.join(
+ REPO_DIR,
+ 'example/android/app/build/outputs/apk',
+ variant,
+ `app-${variant}.apk`,
+ );
+ if (!existsSync(apk)) {
+ fail(`${apk} not found; build first`);
+ }
+ sh(
+ path.join(
+ process.env.ANDROID_HOME ?? `${process.env.HOME}/Library/Android/sdk`,
+ 'platform-tools/adb',
+ ),
+ ['-s', target.id, 'install', '-r', apk],
+ { stdio: 'inherit' },
+ );
+ } else {
+ const config = flags.debug ? 'Debug' : 'Release';
+ const app = path.join(
+ REPO_DIR,
+ 'example/ios/build/perf-lab/Build/Products',
+ `${config}-iphonesimulator`,
+ 'NitroMapsExample.app',
+ );
+ if (!existsSync(app)) {
+ fail(`${app} not found; build first`);
+ }
+ sh('xcrun', ['simctl', 'install', target.id, app], { stdio: 'inherit' });
+ }
+ print(`Installed on ${target.name}`);
+}
+
+/** Renders every stored baseline as the RESULTS section of PERFORMANCE.md. */
+function commandScorecard(flags) {
+ const sections = [];
+ for (const dir of baselineDirs()) {
+ const { run, results } = loadRun(dir);
+ const device = run.device ?? {};
+ const build = run.build ?? {};
+ const title = `${run.platform === 'ios' ? 'iOS' : 'Android'} · ${device.manufacturer ?? ''} ${device.model ?? ''} (${device.isSimulator ? 'simulator/emulator' : 'device'}) · ${run.platform} ${device.osVersion ?? ''} · ${device.refreshRateHz ?? '?'} Hz · provider ${run.provider}`;
+ const lines = [`### ${title}`, ''];
+ lines.push(
+ `- Build: **${build.type}**${build.jsDev ? ' + dev JS' : ', production JS'}${build.hermes ? ', Hermes' : ''}${build.perfProbes ? ', PerfProbe on (profile build)' : ', no probes'}.`,
+ );
+ lines.push(
+ `- ${build.representative ? '**Representative** (release build on a physical device).' : `**Not production-representative**: ${(build.caveats ?? []).join('; ')}.`}`,
+ );
+ lines.push(
+ `- Run \`${run.runId}\`${run.label ? ` — ${run.label}` : ''}, recorded ${run.startedAt} → ${run.finishedAt}; results in \`${path.relative(PERF_DIR, dir)}/\`.`,
+ );
+ lines.push('', scorecard(results), '');
+ for (const result of results.values()) {
+ if ((result.steps ?? []).length > 0 && result.group === 'mutations') {
+ const steps = stepsTable(result);
+ const byChanged = result.steps.some(
+ (step) => typeof step.meta?.changed === 'number',
+ );
+ lines.push(
+ `#### ${result.scenario} — ${byChanged ? 'update cost by number of changed markers (median over repeats)' : 'steps'}`,
+ '',
+ steps.table,
+ '',
+ );
+ if (steps.exponent != null) {
+ lines.push(
+ `JS commit vs. changed markers: empirical exponent ${steps.exponent.toFixed(2)} (0 = independent of how many changed, 1 = linear).`,
+ '',
+ );
+ }
+ }
+ const timeline = timelineTable(result);
+ if (timeline != null) {
+ lines.push(
+ `#### ${result.scenario} — timeline`,
+ '',
+ timeline.table,
+ '',
+ `Drift first → last window: FPS ${timeline.drift.fps == null ? 'N/A' : timeline.drift.fps.toFixed(1)}, RAM ${timeline.drift.memoryMB == null ? 'N/A' : `${timeline.drift.memoryMB.toFixed(0)} MB`}; retained after unmount ${result.memory?.retainedAfterCleanupMB ?? 'N/A'} MB.`,
+ '',
+ );
+ }
+ }
+ lines.push('#### Evidence per scenario', '', digestTable(results), '');
+ lines.push('#### JS → native transfer', '', transferTable(results), '');
+ sections.push(lines.join('\n'));
+ }
+ const body = sections.join('\n');
+ if (flags.write) {
+ const file = path.join(PERF_DIR, 'PERFORMANCE.md');
+ const doc = readFileSync(file, 'utf8');
+ const begin = doc.indexOf('');
+ const end = doc.indexOf('');
+ if (begin < 0 || end < 0) {
+ fail('PERFORMANCE.md is missing the RESULTS markers');
+ }
+ writeFileSync(
+ file,
+ `${doc.slice(0, begin)}\n${body}\n${doc.slice(end)}`,
+ );
+ print(
+ `updated ${path.relative(REPO_DIR, file)} with ${sections.length} baseline(s)`,
+ );
+ return;
+ }
+ print(body);
+}
+
+async function main() {
+ const { positional, flags } = parseArgs(process.argv.slice(2));
+ const command = positional.shift() ?? 'help';
+ switch (command) {
+ case 'list':
+ return commandList(flags);
+ case 'devices':
+ return commandDevices();
+ case 'run':
+ return commandRun(positional, flags);
+ case 'baseline':
+ return commandRun(
+ positional,
+ { ...flags, suite: flags.suite ?? 'baseline' },
+ { asBaseline: true },
+ );
+ case 'compare':
+ return commandCompare(positional, flags);
+ case 'check':
+ return commandCheck(positional, flags);
+ case 'report':
+ return commandReport(positional, flags);
+ case 'scorecard':
+ return commandScorecard(flags);
+ case 'evidence': {
+ const dir = positional[0] ?? latestRunDir(flags.platform);
+ if (dir == null) {
+ fail('no run directory');
+ }
+ print(JSON.stringify(evidence(loadRun(dir).results), null, 2));
+ return undefined;
+ }
+ case 'bench':
+ return commandBench();
+ case 'fixtures':
+ return commandFixtures();
+ case 'build':
+ return commandBuild(positional, flags);
+ case 'install':
+ return commandInstall(positional, flags);
+ case 'help':
+ default:
+ print(HELP);
+ return undefined;
+ }
+}
+
+main().catch((error) => fail(error?.stack ?? String(error)));