react-native-skia-webgpu-video 0.0.0-stage → 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +303 -2
- package/android/BUILD_VALIDATION.md +62 -0
- package/android/CMakeLists.txt +99 -0
- package/android/build-validation.json +262 -0
- package/android/build.gradle +185 -0
- package/android/cpp/EncoderTargets.cpp +226 -0
- package/android/cpp/EncoderTargets.h +70 -0
- package/android/cpp/JNIHelpers.cpp +15 -0
- package/android/cpp/JNIHelpers.h +20 -0
- package/android/cpp/NativeEventDispatcher.cpp +59 -0
- package/android/cpp/NativeEventDispatcher.h +31 -0
- package/android/cpp/NativeHardwareBuffer.cpp +397 -0
- package/android/cpp/NativeHardwareBuffer.h +34 -0
- package/android/cpp/NativeRgbaBuffer.cpp +45 -0
- package/android/cpp/NativeRgbaBuffer.h +9 -0
- package/android/cpp/ReturnedVideoFrames.h +37 -0
- package/android/cpp/RgbaFrameLease.h +53 -0
- package/android/cpp/VideoCapabilities.cpp +87 -0
- package/android/cpp/VideoCapabilities.h +44 -0
- package/android/cpp/VideoComposition.cpp +170 -0
- package/android/cpp/VideoComposition.h +36 -0
- package/android/cpp/VideoCompositionFramesExtractor.cpp +82 -0
- package/android/cpp/VideoCompositionFramesExtractor.h +48 -0
- package/android/cpp/VideoCompositionFramesExtractorHostObject.cpp +230 -0
- package/android/cpp/VideoCompositionFramesExtractorHostObject.h +42 -0
- package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.cpp +133 -0
- package/android/cpp/VideoCompositionFramesExtractorSyncHostObject.h +46 -0
- package/android/cpp/VideoEncoderHostObject.cpp +318 -0
- package/android/cpp/VideoEncoderHostObject.h +76 -0
- package/android/cpp/VideoFrame.cpp +293 -0
- package/android/cpp/VideoFrame.h +27 -0
- package/android/cpp/VideoPlayer.cpp +96 -0
- package/android/cpp/VideoPlayer.h +52 -0
- package/android/cpp/VideoPlayerHostObject.cpp +225 -0
- package/android/cpp/VideoPlayerHostObject.h +43 -0
- package/android/cpp/cpp-adapter.cpp +316 -0
- package/android/gradle.properties +5 -0
- package/android/instrumentation-inventory.json +178 -0
- package/android/proguard-rules.pro +4 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/azzapp/rnskv/AudioCompositionExporter.java +537 -0
- package/android/src/main/java/com/azzapp/rnskv/AudioCompositionPlayer.java +321 -0
- package/android/src/main/java/com/azzapp/rnskv/BufferLifetime.java +55 -0
- package/android/src/main/java/com/azzapp/rnskv/DecodeRequests.java +100 -0
- package/android/src/main/java/com/azzapp/rnskv/DecoderWindow.java +55 -0
- package/android/src/main/java/com/azzapp/rnskv/EGLResourcesHolder.java +132 -0
- package/android/src/main/java/com/azzapp/rnskv/EGLUtils.java +225 -0
- package/android/src/main/java/com/azzapp/rnskv/FrameSize.java +50 -0
- package/android/src/main/java/com/azzapp/rnskv/GLFrameExtractor.java +510 -0
- package/android/src/main/java/com/azzapp/rnskv/JNIHelpers.java +12 -0
- package/android/src/main/java/com/azzapp/rnskv/NativeEventDispatcher.java +25 -0
- package/android/src/main/java/com/azzapp/rnskv/NativeHardwareBuffer.java +62 -0
- package/android/src/main/java/com/azzapp/rnskv/NativeRgbaBuffer.java +35 -0
- package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoModule.java +45 -0
- package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoPackage.java +43 -0
- package/android/src/main/java/com/azzapp/rnskv/ReactNativeSkiaVideoSpec.java +9 -0
- package/android/src/main/java/com/azzapp/rnskv/RgbaBufferAllocator.java +83 -0
- package/android/src/main/java/com/azzapp/rnskv/RgbaLayout.java +33 -0
- package/android/src/main/java/com/azzapp/rnskv/SurfaceOutputPolicy.java +13 -0
- package/android/src/main/java/com/azzapp/rnskv/TextureRenderer.java +150 -0
- package/android/src/main/java/com/azzapp/rnskv/TimeHelpers.java +11 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCapabilities.java +354 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoComposition.java +147 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionDecoder.java +772 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractor.java +354 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionFramesExtractorSync.java +241 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoCompositionItemDecoder.java +492 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoEncoder.java +639 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoFrame.java +74 -0
- package/android/src/main/java/com/azzapp/rnskv/VideoPlayer.java +361 -0
- package/cpp/RNSVCheckedSizes.h +54 -0
- package/cpp/RNSVEventEmitter.cpp +199 -0
- package/cpp/RNSVEventEmitter.h +31 -0
- package/cpp/RNSVHostObject.cpp +79 -0
- package/cpp/RNSVHostObject.h +67 -0
- package/cpp/RNSVMemoryBudget.cpp +68 -0
- package/cpp/RNSVMemoryBudget.h +100 -0
- package/cpp/RNSVRuntimeLifecycleMonitor.cpp +88 -0
- package/cpp/RNSVRuntimeLifecycleMonitor.h +33 -0
- package/docs/ANDROID_DEVICE_306.md +95 -0
- package/docs/ANDROID_EXPORT_CACHE_306.md +48 -0
- package/docs/ANDROID_MEMORY_RETENTION_306.md +67 -0
- package/docs/BENCHMARKS.md +368 -0
- package/docs/IOS_DEVICE_TESTS.md +115 -0
- package/docs/IOS_SIMULATOR_TESTS.md +74 -0
- package/docs/MIGRATION.md +82 -0
- package/docs/NATIVE_MEMORY_INVESTIGATION_306.md +88 -0
- package/docs/PERFORMANCE_AB_IPHONE_303.md +196 -0
- package/docs/PERFORMANCE_AB_SIMULATOR.md +135 -0
- package/docs/PERFORMANCE_AB_SOAK_SIMULATOR.md +84 -0
- package/docs/PERFORMANCE_IPHONE_306_OPTIMIZATION.md +76 -0
- package/docs/PERFORMANCE_SIMULATOR.md +89 -0
- package/docs/PERFORMANCE_SIMULATOR_INITIAL.md +96 -0
- package/docs/PERFORMANCE_SOAK_IPHONE_303.md +41 -0
- package/docs/UPSTREAM_NOTES.md +188 -0
- package/docs/assets/banner.svg +26 -0
- package/examples/webgpu-overlay.ts +147 -0
- package/ios/AVAssetTrackUtils.h +24 -0
- package/ios/AudioCompositionUtils.h +27 -0
- package/ios/AudioCompositionUtils.mm +113 -0
- package/ios/DecoderWindow.h +52 -0
- package/ios/NativeResourceStats.h +32 -0
- package/ios/RNSVColorSpace.h +50 -0
- package/ios/RNSVJSIUtils.h +46 -0
- package/ios/RNSVScopedPixelBuffer.h +17 -0
- package/ios/RNSVVideoPlayer.h +46 -0
- package/ios/RNSVVideoPlayer.mm +410 -0
- package/ios/ReactNativeSkiaVideo.h +8 -0
- package/ios/ReactNativeSkiaVideo.mm +310 -0
- package/ios/SeekPolicy.h +27 -0
- package/ios/VideoComposition.h +148 -0
- package/ios/VideoCompositionFramesExtractorHostObject.h +105 -0
- package/ios/VideoCompositionFramesExtractorHostObject.mm +686 -0
- package/ios/VideoCompositionFramesExtractorSyncHostObject.h +37 -0
- package/ios/VideoCompositionFramesExtractorSyncHostObject.mm +168 -0
- package/ios/VideoCompositionItemDecoder.h +60 -0
- package/ios/VideoCompositionItemDecoder.mm +480 -0
- package/ios/VideoEncoderHostObject.h +83 -0
- package/ios/VideoEncoderHostObject.mm +706 -0
- package/ios/VideoFrame.h +66 -0
- package/ios/VideoFrame.mm +108 -0
- package/ios/VideoPlayerHostObject.h +52 -0
- package/ios/VideoPlayerHostObject.mm +332 -0
- package/lib/module/NativeReactNativeSkiaVideo.js +5 -0
- package/lib/module/NativeReactNativeSkiaVideo.js.map +1 -0
- package/lib/module/RNSkiaVideoModule.js +20 -0
- package/lib/module/RNSkiaVideoModule.js.map +1 -0
- package/lib/module/canvas.js +18 -0
- package/lib/module/canvas.js.map +1 -0
- package/lib/module/exportCache.js +22 -0
- package/lib/module/exportCache.js.map +1 -0
- package/lib/module/exportFrames.js +338 -0
- package/lib/module/exportFrames.js.map +1 -0
- package/lib/module/exportQueue.js +52 -0
- package/lib/module/exportQueue.js.map +1 -0
- package/lib/module/exportTarget.js +137 -0
- package/lib/module/exportTarget.js.map +1 -0
- package/lib/module/exportVideoComposition.js +492 -0
- package/lib/module/exportVideoComposition.js.map +1 -0
- package/lib/module/frameInterop.js +532 -0
- package/lib/module/frameInterop.js.map +1 -0
- package/lib/module/gpu.js +222 -0
- package/lib/module/gpu.js.map +1 -0
- package/lib/module/gpuDevice.js +54 -0
- package/lib/module/gpuDevice.js.map +1 -0
- package/lib/module/index.js +36 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/memory.js +38 -0
- package/lib/module/memory.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/previewLifecycle.js +52 -0
- package/lib/module/previewLifecycle.js.map +1 -0
- package/lib/module/runtimeYield.js +10 -0
- package/lib/module/runtimeYield.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/useEventListener.js +18 -0
- package/lib/module/utils/useEventListener.js.map +1 -0
- package/lib/module/videoCompositionPlayer.js +348 -0
- package/lib/module/videoCompositionPlayer.js.map +1 -0
- package/lib/module/videoFrameImage.js +185 -0
- package/lib/module/videoFrameImage.js.map +1 -0
- package/lib/module/videoPlayer.js +172 -0
- package/lib/module/videoPlayer.js.map +1 -0
- package/lib/module/yuvBlit.js +299 -0
- package/lib/module/yuvBlit.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts +7 -0
- package/lib/typescript/src/NativeReactNativeSkiaVideo.d.ts.map +1 -0
- package/lib/typescript/src/RNSkiaVideoModule.d.ts +4 -0
- package/lib/typescript/src/RNSkiaVideoModule.d.ts.map +1 -0
- package/lib/typescript/src/canvas.d.ts +4 -0
- package/lib/typescript/src/canvas.d.ts.map +1 -0
- package/lib/typescript/src/exportCache.d.ts +6 -0
- package/lib/typescript/src/exportCache.d.ts.map +1 -0
- package/lib/typescript/src/exportFrames.d.ts +57 -0
- package/lib/typescript/src/exportFrames.d.ts.map +1 -0
- package/lib/typescript/src/exportQueue.d.ts +5 -0
- package/lib/typescript/src/exportQueue.d.ts.map +1 -0
- package/lib/typescript/src/exportTarget.d.ts +28 -0
- package/lib/typescript/src/exportTarget.d.ts.map +1 -0
- package/lib/typescript/src/exportVideoComposition.d.ts +68 -0
- package/lib/typescript/src/exportVideoComposition.d.ts.map +1 -0
- package/lib/typescript/src/frameInterop.d.ts +17 -0
- package/lib/typescript/src/frameInterop.d.ts.map +1 -0
- package/lib/typescript/src/gpu.d.ts +39 -0
- package/lib/typescript/src/gpu.d.ts.map +1 -0
- package/lib/typescript/src/gpuDevice.d.ts +11 -0
- package/lib/typescript/src/gpuDevice.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +21 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/memory.d.ts +25 -0
- package/lib/typescript/src/memory.d.ts.map +1 -0
- package/lib/typescript/src/previewLifecycle.d.ts +22 -0
- package/lib/typescript/src/previewLifecycle.d.ts.map +1 -0
- package/lib/typescript/src/runtimeYield.d.ts +4 -0
- package/lib/typescript/src/runtimeYield.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +631 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/useEventListener.d.ts +5 -0
- package/lib/typescript/src/utils/useEventListener.d.ts.map +1 -0
- package/lib/typescript/src/videoCompositionPlayer.d.ts +85 -0
- package/lib/typescript/src/videoCompositionPlayer.d.ts.map +1 -0
- package/lib/typescript/src/videoFrameImage.d.ts +60 -0
- package/lib/typescript/src/videoFrameImage.d.ts.map +1 -0
- package/lib/typescript/src/videoPlayer.d.ts +99 -0
- package/lib/typescript/src/videoPlayer.d.ts.map +1 -0
- package/lib/typescript/src/yuvBlit.d.ts +50 -0
- package/lib/typescript/src/yuvBlit.d.ts.map +1 -0
- package/package.json +154 -4
- package/patches/react-native-skia+3.7.0.patch +502 -0
- package/react-native-skia-webgpu-video.podspec +35 -0
- package/scripts/apply-skia-canvas-patch.mjs +48 -0
- package/scripts/skia-canvas-patch.json +291 -0
- package/src/NativeReactNativeSkiaVideo.ts +8 -0
- package/src/RNSkiaVideoModule.ts +27 -0
- package/src/canvas.ts +22 -0
- package/src/exportCache.ts +27 -0
- package/src/exportFrames.ts +421 -0
- package/src/exportQueue.ts +65 -0
- package/src/exportTarget.ts +179 -0
- package/src/exportVideoComposition.ts +718 -0
- package/src/frameInterop.ts +684 -0
- package/src/gpu.ts +290 -0
- package/src/gpuDevice.ts +80 -0
- package/src/index.tsx +45 -0
- package/src/memory.ts +48 -0
- package/src/previewLifecycle.ts +60 -0
- package/src/runtimeYield.ts +6 -0
- package/src/types.ts +661 -0
- package/src/utils/useEventListener.ts +22 -0
- package/src/videoCompositionPlayer.ts +520 -0
- package/src/videoFrameImage.ts +205 -0
- package/src/videoPlayer.ts +318 -0
- package/src/yuvBlit.ts +331 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Comparaison Skia 2 / Skia 3 WebGPU
|
|
2
|
+
|
|
3
|
+
La nouvelle version réduit nettement la mémoire résidente après fermeture de la lecture 4K, mais consomme davantage pendant les exports répétés. La cadence reste proche de 60 callbacks/s. **Ces essais ne permettent pas de conclure à un gain global de vitesse d'export** : la direction s'inverse entre les deux paires.
|
|
4
|
+
|
|
5
|
+
Les constats répétés dans les deux ordres sont : RSS final après lecture 4K inférieur de **53 à 61 %** ; pic RSS des exports alternés supérieur de **21 à 23 %** et RSS final supérieur de **47 à 52 %**. Le RSS final est mesuré après deux secondes de stabilisation, sans forcer le GC ni purger les caches. Les résultats concernent le simulateur et ces vidéos de test, pas la consommation d'un iPhone physique ni les widgets réels de une application de montage.
|
|
6
|
+
|
|
7
|
+
**30 exécutions terminées par bibliothèque, 126 exports sondés par bibliothèque.** Cela ne vaut pas qualification complète : les comparaisons de pixels restent absentes et les seuils mémoire ne sont pas respectés. Les métadonnées natives des fichiers — dimensions, codec, nombre d'images, durée et horodatages — sont sondées ; les validateurs sémantiques supplémentaires déclarés par les scénarios restent signalés indisponibles ci-dessous.
|
|
8
|
+
|
|
9
|
+
La référence est le fork historique **0.10.1, commit `334348ffeee8a4f6887fd1f663f8cf584f579911`**, conservé inchangé. Son premier scénario avec seek a provoqué un crash : lecture AVAssetReader et annulation/recréation du lecteur concurrentes. [Analyse](../benchmark/results/baseline-crash-analysis.local.json), [rapport natif](../benchmark/results/baseline-crash-first.local.ips). Les trois nouveaux cas de lecture continue sans seek servent uniquement à isoler les mesures comparables ; ils n'effacent pas cet échec. Le correctif de synchronisation est déjà présent dans le candidat, dont les scénarios seek ciblés avaient passé avant cette comparaison.
|
|
10
|
+
|
|
11
|
+
En l'état, la migration reste intéressante pour les nouvelles fonctions et les corrections de stabilité, mais **la mémoire des exports répétés doit être traitée avant de présenter cette alpha comme une amélioration générale**. Le [guide de migration](MIGRATION.md) décrit la compatibilité et les limites actuelles.
|
|
12
|
+
|
|
13
|
+
Comparaison mesurée : **failed** selon le comparateur strict. Cette qualification conserve les échecs, les régressions et les validations média manquantes.
|
|
14
|
+
|
|
15
|
+
Ancien : @azzapp/react-native-skia-video 0.10.1, Skia 2.10.1. Nouveau : react-native-skia-webgpu-video 0.1.0-alpha.0, Skia 3.0.3.
|
|
16
|
+
|
|
17
|
+
Environnement : simulator, iPhone19,2, ios 27.0, React Native 0.86.2, release, horloge performance.now.
|
|
18
|
+
|
|
19
|
+
Ordre : ancien (AB) → nouveau (AB) → nouveau (BA) → ancien (BA). Ordre A/B puis B/A vérifié, sans chevauchement.
|
|
20
|
+
|
|
21
|
+
**Intervalle prolongé : 180.5 minutes entre candidate/AB et candidate/BA.** Les conditions du système hôte pendant cet intervalle ne sont pas contrôlées. Examiner la cohérence des résultats par paire avant de tirer une conclusion des médianes regroupées ; l'ordre A/B puis B/A ne supprime pas cette limite.
|
|
22
|
+
|
|
23
|
+
Le [test prolongé distinct de 300 exports par bibliothèque](PERFORMANCE_AB_SOAK_SIMULATOR.md) confirme le problème mémoire : après 100/200/300 exports, l’ancien reste à environ 308/315/300 Mio, le nouveau atteint 416/553/626 Mio. Après trois minutes de repos, les processus sont à **133,20 Mio et 437,38 Mio**. Les 600 fichiers ont été sondés ; l’absence de fuite n’est pas démontrée.
|
|
24
|
+
|
|
25
|
+
## Résultats regroupés
|
|
26
|
+
|
|
27
|
+
Médianes des répétitions réussies ; les effectifs restent visibles. Les six répétitions éventuelles sont regroupées depuis deux processus par version et ne constituent pas six démarrages indépendants. Pour les tailles alternées, chaque répétition pèse autant après calcul de sa propre médiane.
|
|
28
|
+
|
|
29
|
+
| Scénario | Réussis ancien / nouveau | Pic RSS ancien / nouveau (MiB) | Écart RSS | RSS final ancien / nouveau (MiB) |
|
|
30
|
+
|---|---:|---:|---:|---:|
|
|
31
|
+
| Lecture continue H.264 1080p | 6/6 · 6/6 | 334.28 / 349.84 | +4.7 % | 307.30 / 243.46 |
|
|
32
|
+
| Lecture continue H.264 4K | 6/6 · 6/6 | 695.98 / 609.65 | -12.4 % | 546.51 / 245.76 |
|
|
33
|
+
| Lecture continue HEVC 4K | 6/6 · 6/6 | 741.91 / 722.45 | -2.6 % | 563.27 / 241.30 |
|
|
34
|
+
| Export H.264 | 6/6 · 6/6 | 331.44 / 345.95 | +4.4 % | 271.77 / 299.16 |
|
|
35
|
+
| Exports de tailles alternées | 6/6 · 6/6 | 609.32 / 719.59 | +18.1 % | 312.54 / 476.85 |
|
|
36
|
+
|
|
37
|
+
| Lecture | Callbacks/s ancien / nouveau | p95 CPU ancien / nouveau (ms) | p95 intervalle ancien / nouveau (ms) |
|
|
38
|
+
|---|---:|---:|---:|
|
|
39
|
+
| Lecture continue H.264 1080p | 59.94 / 59.89 | ≤ 0.50 / ≤ 0.25 | ≤ 25.00 / ≤ 25.00 |
|
|
40
|
+
| Lecture continue H.264 4K | 59.83 / 59.85 | ≤ 0.25 / ≤ 0.25 | ≤ 25.00 / ≤ 29.17 |
|
|
41
|
+
| Lecture continue HEVC 4K | 59.67 / 59.60 | ≤ 0.50 / ≤ 0.25 | ≤ 25.00 / ≤ 33.33 |
|
|
42
|
+
|
|
43
|
+
| Export | Images | Pipeline ancien / nouveau (ms) | Écart pipeline | Total ancien / nouveau (ms) |
|
|
44
|
+
|---|---:|---:|---:|---:|
|
|
45
|
+
| Export H.264 640×360 | 60 | 462.71 / 323.31 | -30.1 % | 516.88 / 347.15 |
|
|
46
|
+
| Exports de tailles alternées 640×360 | 18 | 90.36 / 99.80 | +10.5 % | 101.93 / 110.86 |
|
|
47
|
+
| Exports de tailles alternées 1920×1080 | 18 | 253.87 / 242.83 | -4.4 % | 288.27 / 273.13 |
|
|
48
|
+
| Exports de tailles alternées 720×1280 | 18 | 138.57 / 143.57 | +3.6 % | 156.21 / 161.78 |
|
|
49
|
+
|
|
50
|
+
Le pipeline couvre décodage, dessin et encodage, avant lecture des métadonnées. Le total inclut aussi la vérification et la suppression du fichier. La lecture mesure des callbacks, pas les images effectivement affichées ni le temps GPU ; les valeurs p95 sont les médianes des bornes supérieures du p95 par répétition. Une valeur intermédiaire comme 29,17 ms n'est donc ni une classe réelle de l'histogramme ni un p95 global recalculé.
|
|
51
|
+
|
|
52
|
+
Les scénarios steady-playback mesurent une lecture continue sans seek ; ils ne remplacent pas les scénarios historiques de seek, boucle et maintien d’image. Un échec historique de seek reste un échec fonctionnel distinct.
|
|
53
|
+
|
|
54
|
+
Les pics RSS sont échantillonnés, donc des bornes inférieures du vrai maximum. Le RSS final suit la pause de stabilisation prévue par le scénario ; les caches peuvent survivre et le processus poursuit les scénarios suivants. Ces chiffres ne démontrent ni fuite ni absence de fuite.
|
|
55
|
+
|
|
56
|
+
## Qualification et limites
|
|
57
|
+
|
|
58
|
+
Budget demandé : 512 MiB. Application ancien : non disponible ; nouveau : oui.
|
|
59
|
+
|
|
60
|
+
Les compteurs de ressources propres à la nouvelle bibliothèque restent indisponibles sur l’ancienne. Ils ne sont jamais remplacés par zéro et ne servent pas à comparer la mémoire totale. Mémoire GPU totale et tas natif séparé : non mesurés lorsque les collecteurs sont absents.
|
|
61
|
+
|
|
62
|
+
### AB — failed
|
|
63
|
+
|
|
64
|
+
- Library-owned memory budget enforcement differs between backends; requested limits are identical, enforcement availability is recorded
|
|
65
|
+
- Decode/render/encode transport changed; record the intended change and do not describe CPU readback results as GPU-only
|
|
66
|
+
- Export H.264 : failed. Baseline: Media validation unavailable: pixels ; Baseline: Media validation unavailable: presentation-timestamps ; Baseline: Media validation unavailable: actual-codec ; Candidate: Media validation unavailable: pixels ; Candidate: Media validation unavailable: presentation-timestamps ; Candidate: Media validation unavailable: actual-codec ; rssBytes peak regression ; Pixel / audio / timestamp validation incomplete
|
|
67
|
+
- Exports de tailles alternées : failed. rssBytes peak regression ; rssBytes grows after warmup; inspect retained resources
|
|
68
|
+
|
|
69
|
+
### BA — failed
|
|
70
|
+
|
|
71
|
+
- Library-owned memory budget enforcement differs between backends; requested limits are identical, enforcement availability is recorded
|
|
72
|
+
- Decode/render/encode transport changed; record the intended change and do not describe CPU readback results as GPU-only
|
|
73
|
+
- Export H.264 : incomplete. Baseline: Media validation unavailable: pixels ; Baseline: Media validation unavailable: presentation-timestamps ; Baseline: Media validation unavailable: actual-codec ; Candidate: Media validation unavailable: pixels ; Candidate: Media validation unavailable: presentation-timestamps ; Candidate: Media validation unavailable: actual-codec ; Pixel / audio / timestamp validation incomplete
|
|
74
|
+
- Exports de tailles alternées : failed. rssBytes peak regression ; rssBytes grows after warmup; inspect retained resources
|
|
75
|
+
|
|
76
|
+
## Paire AB
|
|
77
|
+
|
|
78
|
+
| Scénario | Réussis ancien / nouveau | Pic RSS ancien / nouveau (MiB) | Écart RSS | RSS final ancien / nouveau (MiB) |
|
|
79
|
+
|---|---:|---:|---:|---:|
|
|
80
|
+
| Lecture continue H.264 1080p | 3/3 · 3/3 | 345.31 / 360.75 | +4.5 % | 319.58 / 255.66 |
|
|
81
|
+
| Lecture continue H.264 4K | 3/3 · 3/3 | 669.44 / 619.27 | -7.5 % | 560.91 / 261.20 |
|
|
82
|
+
| Lecture continue HEVC 4K | 3/3 · 3/3 | 707.58 / 746.44 | +5.5 % | 571.19 / 266.05 |
|
|
83
|
+
| Export H.264 | 3/3 · 3/3 | 335.56 / 383.56 | +14.3 % | 288.97 / 333.30 |
|
|
84
|
+
| Exports de tailles alternées | 3/3 · 3/3 | 626.33 / 769.94 | +22.9 % | 340.56 / 516.20 |
|
|
85
|
+
|
|
86
|
+
| Lecture | Callbacks/s ancien / nouveau | p95 CPU ancien / nouveau (ms) | p95 intervalle ancien / nouveau (ms) |
|
|
87
|
+
|---|---:|---:|---:|
|
|
88
|
+
| Lecture continue H.264 1080p | 59.94 / 59.88 | ≤ 0.50 / ≤ 0.25 | ≤ 25.00 / ≤ 25.00 |
|
|
89
|
+
| Lecture continue H.264 4K | 59.95 / 59.86 | ≤ 0.25 / ≤ 0.25 | ≤ 25.00 / ≤ 25.00 |
|
|
90
|
+
| Lecture continue HEVC 4K | 59.68 / 59.53 | ≤ 1.00 / ≤ 0.25 | ≤ 25.00 / ≤ 33.33 |
|
|
91
|
+
|
|
92
|
+
| Export | Images | Pipeline ancien / nouveau (ms) | Écart pipeline | Total ancien / nouveau (ms) |
|
|
93
|
+
|---|---:|---:|---:|---:|
|
|
94
|
+
| Export H.264 640×360 | 60 | 210.34 / 243.86 | +15.9 % | 231.14 / 264.33 |
|
|
95
|
+
| Exports de tailles alternées 640×360 | 18 | 79.03 / 90.02 | +13.9 % | 89.86 / 100.75 |
|
|
96
|
+
| Exports de tailles alternées 1920×1080 | 18 | 209.88 / 218.75 | +4.2 % | 238.27 / 248.01 |
|
|
97
|
+
| Exports de tailles alternées 720×1280 | 18 | 121.07 / 132.06 | +9.1 % | 137.90 / 149.42 |
|
|
98
|
+
|
|
99
|
+
## Paire BA
|
|
100
|
+
|
|
101
|
+
| Scénario | Réussis ancien / nouveau | Pic RSS ancien / nouveau (MiB) | Écart RSS | RSS final ancien / nouveau (MiB) |
|
|
102
|
+
|---|---:|---:|---:|---:|
|
|
103
|
+
| Lecture continue H.264 1080p | 3/3 · 3/3 | 330.47 / 346.61 | +4.9 % | 297.14 / 238.95 |
|
|
104
|
+
| Lecture continue H.264 4K | 3/3 · 3/3 | 722.53 / 597.34 | -17.3 % | 538.52 / 226.36 |
|
|
105
|
+
| Lecture continue HEVC 4K | 3/3 · 3/3 | 771.31 / 698.27 | -9.5 % | 550.84 / 216.98 |
|
|
106
|
+
| Export H.264 | 3/3 · 3/3 | 327.31 / 338.92 | +3.5 % | 255.92 / 291.22 |
|
|
107
|
+
| Exports de tailles alternées | 3/3 · 3/3 | 589.41 / 715.64 | +21.4 % | 285.06 / 418.66 |
|
|
108
|
+
|
|
109
|
+
| Lecture | Callbacks/s ancien / nouveau | p95 CPU ancien / nouveau (ms) | p95 intervalle ancien / nouveau (ms) |
|
|
110
|
+
|---|---:|---:|---:|
|
|
111
|
+
| Lecture continue H.264 1080p | 59.94 / 59.91 | ≤ 0.50 / ≤ 0.25 | ≤ 25.00 / ≤ 25.00 |
|
|
112
|
+
| Lecture continue H.264 4K | 59.70 / 59.85 | ≤ 0.25 / ≤ 0.25 | ≤ 25.00 / ≤ 33.33 |
|
|
113
|
+
| Lecture continue HEVC 4K | 59.65 / 59.84 | ≤ 0.50 / ≤ 0.25 | ≤ 25.00 / ≤ 33.33 |
|
|
114
|
+
|
|
115
|
+
| Export | Images | Pipeline ancien / nouveau (ms) | Écart pipeline | Total ancien / nouveau (ms) |
|
|
116
|
+
|---|---:|---:|---:|---:|
|
|
117
|
+
| Export H.264 640×360 | 60 | 645.40 / 342.21 | -47.0 % | 676.28 / 367.64 |
|
|
118
|
+
| Exports de tailles alternées 640×360 | 18 | 148.12 / 109.58 | -26.0 % | 164.65 / 122.39 |
|
|
119
|
+
| Exports de tailles alternées 1920×1080 | 18 | 354.82 / 262.48 | -26.0 % | 387.21 / 295.18 |
|
|
120
|
+
| Exports de tailles alternées 720×1280 | 18 | 277.19 / 158.11 | -43.0 % | 297.92 / 176.32 |
|
|
121
|
+
|
|
122
|
+
## Traçabilité
|
|
123
|
+
|
|
124
|
+
| Version / paire | Début UTC | Fin UTC | JSON SHA-256 |
|
|
125
|
+
|---|---|---|---|
|
|
126
|
+
| baseline / AB | 2026-10-06T17:15:50.672Z | 2026-10-06T17:17:48.817Z | 577dec3b0de510c329bde0ead6120c52be98713ff0912d3689215a7c899d641d |
|
|
127
|
+
| candidate / AB | 2026-10-06T17:18:37.600Z | 2026-10-06T17:20:36.017Z | bcd7a67e7e0e8d26ff44573cde1d7f7c8254ae8636974cd7b535f5644506f893 |
|
|
128
|
+
| candidate / BA | 2026-10-06T20:21:06.503Z | 2026-10-06T20:23:08.558Z | b947db3c8910abed4ea0f89e16164d9597a3fd94fe92121b376aff631ec6e167 |
|
|
129
|
+
| baseline / BA | 2026-10-06T20:24:18.113Z | 2026-10-06T20:26:26.476Z | d15ab1f1c5cce937515dcad8af8a1438aacc69619d4df14782c042d1acbf86d2 |
|
|
130
|
+
|
|
131
|
+
Les fenêtres sont celles enregistrées par chaque application. Les fichiers JSON conservent les échantillons, les conditions thermiques, les résultats des vérifications et les mesures par répétition.
|
|
132
|
+
|
|
133
|
+
Provenance complémentaire : benchmark/results/ab-provenance.local.json.
|
|
134
|
+
|
|
135
|
+
Hôte : {"recordedAt":"2026-10-06T16:17:55.791Z","model":"MacBookPro18,3","cpu":"Apple M1 Pro","memoryBytes":17179869184,"macOS":"27.0.1","macOSBuild":"26A434","source":"sysctl hw.model/hw.memsize/machdep.cpu.brand_string and sw_vers"}.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Mémoire comparée — 300 exports par bibliothèque
|
|
2
|
+
|
|
3
|
+
Chaque bibliothèque a terminé trois blocs de 100 exports alternant 640×360, 1920×1080 et 720×1280. Les **600 fichiers** ont été sondés, sans erreur de dimensions, codec, nombre d’images ou horodatages. Ce diagnostic reste distinct des deux paires de cinq scénarios ; un seul ordre ancien → nouveau a été exécuté pour cette session longue.
|
|
4
|
+
|
|
5
|
+
**La mémoire du nouveau moteur continue de monter pendant les trois blocs.** Les compteurs propres au candidat reviennent à zéro, mais ils ne représentent pas les allocations opaques du processus. La baisse observée au repos ne prouve ni un palier stable ni une absence de fuite.
|
|
6
|
+
|
|
7
|
+
| Exports terminés | RSS après stabilisation ancien (Mio) | Nouveau (Mio) |
|
|
8
|
+
|---|---:|---:|
|
|
9
|
+
| 100 | 308.02 | 415.81 |
|
|
10
|
+
| 200 | 314.88 | 552.64 |
|
|
11
|
+
| 300 | 300.41 | 626.03 |
|
|
12
|
+
| Pic échantillonné de la session entière | 612.27 | 886.83 |
|
|
13
|
+
|
|
14
|
+
Le tableau précédent utilise le collecteur natif commun `mach task_info`. Ensuite, le même processus reste ouvert sur l’écran de résultats ; `ps` relève son RSS toutes les 30 secondes. Ces deux collecteurs sont distingués : les valeurs immédiates ne sont pas supposées interchangeables. Aucun GC forcé, purge globale, redémarrage ou profilage d’allocations n’intervient pendant le repos.
|
|
15
|
+
|
|
16
|
+
| Temps de repos après sauvegarde | RSS ancien (Mio, ps) | Nouveau (Mio, ps) |
|
|
17
|
+
|---|---:|---:|
|
|
18
|
+
| 0 s | 330.47 | 635.55 |
|
|
19
|
+
| 30 s | 330.63 | 570.48 |
|
|
20
|
+
| 60 s | 277.00 | 485.52 |
|
|
21
|
+
| 90 s | 198.91 | 463.31 |
|
|
22
|
+
| 120 s | 175.13 | 440.66 |
|
|
23
|
+
| 150 s | 165.05 | 440.67 |
|
|
24
|
+
| 180 s | 133.20 | 437.38 |
|
|
25
|
+
|
|
26
|
+
À trois minutes, le RSS vaut **133.20 Mio contre 437.38 Mio**. Ce constat motive une investigation native/Graphite/allocateurs avant d’ajouter les coûts du ML et de la 3D ; aucune catégorie d’allocation n’a été attribuée par ce test.
|
|
27
|
+
|
|
28
|
+
Les conditions thermiques sont restées nominales, sans économie d’énergie ni troncature des échantillons. Le simulateur utilise le matériel du Mac M1 Pro ; ces chiffres ne constituent pas une mesure sur iPhone physique. Les durées de la session longue restent descriptives, puisque cet ordre n’a pas été inversé.
|
|
29
|
+
|
|
30
|
+
Preuves : [ancien](../benchmark/results/ab-soak-baseline.local.json), [nouveau](../benchmark/results/ab-soak-candidate.local.json), [repos ancien](../benchmark/results/ab-soak-baseline-execution.local.json), [repos nouveau](../benchmark/results/ab-soak-candidate-execution.local.json). Comparaison principale : [cinq scénarios dans les deux ordres](PERFORMANCE_AB_SIMULATOR.md).
|
|
31
|
+
|
|
32
|
+
## Mesures détaillées
|
|
33
|
+
Comparaison mesurée : **failed** selon le comparateur strict. Cette qualification conserve les échecs, les régressions et les validations média manquantes.
|
|
34
|
+
|
|
35
|
+
Ancien : @azzapp/react-native-skia-video 0.10.1, Skia 2.10.1. Nouveau : react-native-skia-webgpu-video 0.1.0-alpha.0, Skia 3.0.3.
|
|
36
|
+
|
|
37
|
+
Environnement : simulator, iPhone19,2, ios 27.0, React Native 0.86.2, release, horloge performance.now.
|
|
38
|
+
|
|
39
|
+
Ordre : ancien (SOAK) → nouveau (SOAK). Cette série ne constitue pas un ordre A/B puis B/A complet.
|
|
40
|
+
|
|
41
|
+
## Résultats regroupés
|
|
42
|
+
|
|
43
|
+
Médianes des répétitions réussies ; les effectifs restent visibles. Les six répétitions éventuelles sont regroupées depuis deux processus par version et ne constituent pas six démarrages indépendants. Pour les tailles alternées, chaque répétition pèse autant après calcul de sa propre médiane.
|
|
44
|
+
|
|
45
|
+
| Scénario | Réussis ancien / nouveau | Pic RSS ancien / nouveau (MiB) | Écart RSS | RSS final ancien / nouveau (MiB) |
|
|
46
|
+
|---|---:|---:|---:|---:|
|
|
47
|
+
| Exports de tailles alternées | 3/3 · 3/3 | 603.67 / 839.45 | +39.1 % | 308.02 / 552.64 |
|
|
48
|
+
|
|
49
|
+
| Export | Images | Pipeline ancien / nouveau (ms) | Écart pipeline | Total ancien / nouveau (ms) |
|
|
50
|
+
|---|---:|---:|---:|---:|
|
|
51
|
+
| Exports de tailles alternées 640×360 | 18 | 105.68 / 94.50 | -10.6 % | 118.13 / 106.59 |
|
|
52
|
+
| Exports de tailles alternées 1920×1080 | 18 | 291.59 / 236.61 | -18.9 % | 330.60 / 268.54 |
|
|
53
|
+
| Exports de tailles alternées 720×1280 | 18 | 165.43 / 138.84 | -16.1 % | 185.02 / 156.70 |
|
|
54
|
+
|
|
55
|
+
Le pipeline couvre décodage, dessin et encodage, avant lecture des métadonnées. Le total inclut aussi la vérification et la suppression du fichier. La lecture mesure des callbacks, pas les images effectivement affichées ni le temps GPU ; les valeurs p95 sont les médianes des bornes supérieures du p95 par répétition, pas un p95 global recalculé.
|
|
56
|
+
|
|
57
|
+
Les scénarios steady-playback mesurent une lecture continue sans seek ; ils ne remplacent pas les scénarios historiques de seek, boucle et maintien d’image. Un échec historique de seek reste un échec fonctionnel distinct.
|
|
58
|
+
|
|
59
|
+
Les pics RSS sont échantillonnés, donc des bornes inférieures du vrai maximum. Le RSS final suit la pause de stabilisation prévue par le scénario ; les caches peuvent survivre et le processus poursuit les scénarios suivants. Ces chiffres ne démontrent ni fuite ni absence de fuite.
|
|
60
|
+
|
|
61
|
+
## Qualification et limites
|
|
62
|
+
|
|
63
|
+
Budget demandé : 512 MiB. Application ancien : non disponible ; nouveau : oui.
|
|
64
|
+
|
|
65
|
+
Les compteurs de ressources propres à la nouvelle bibliothèque restent indisponibles sur l’ancienne. Ils ne sont jamais remplacés par zéro et ne servent pas à comparer la mémoire totale. Mémoire GPU totale et tas natif séparé : non mesurés lorsque les collecteurs sont absents.
|
|
66
|
+
|
|
67
|
+
### SOAK — failed
|
|
68
|
+
|
|
69
|
+
- Library-owned memory budget enforcement differs between backends; requested limits are identical, enforcement availability is recorded
|
|
70
|
+
- Decode/render/encode transport changed; record the intended change and do not describe CPU readback results as GPU-only
|
|
71
|
+
- Exports de tailles alternées : failed. rssBytes peak regression ; rssBytes grows after warmup; inspect retained resources
|
|
72
|
+
|
|
73
|
+
## Traçabilité
|
|
74
|
+
|
|
75
|
+
| Version / paire | Début UTC | Fin UTC | JSON SHA-256 |
|
|
76
|
+
|---|---|---|---|
|
|
77
|
+
| baseline / SOAK | 2026-10-06T20:26:49.570Z | 2026-10-06T20:30:14.811Z | bc1d3d168dad39860ab318fd711d46006f0883137dc4f01ef474d9437022051f |
|
|
78
|
+
| candidate / SOAK | 2026-10-06T20:34:48.228Z | 2026-10-06T20:38:01.662Z | e3b712bc0d98fee161bd54ddd89ba36562ca81b1b643c37c116aa12f4d829ba5 |
|
|
79
|
+
|
|
80
|
+
Les fenêtres sont celles enregistrées par chaque application. Les fichiers JSON conservent les échantillons, les conditions thermiques, les résultats des vérifications et les mesures par répétition.
|
|
81
|
+
|
|
82
|
+
Provenance complémentaire : benchmark/results/ab-provenance.local.json.
|
|
83
|
+
|
|
84
|
+
Hôte : {"recordedAt":"2026-10-06T16:17:55.791Z","model":"MacBookPro18,3","cpu":"Apple M1 Pro","memoryBytes":17179869184,"macOS":"27.0.1","macOSBuild":"26A434","source":"sysctl hw.model/hw.memsize/machdep.cpu.brand_string and sw_vers"}.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# iPhone : Skia 3.0.6 initial / optimisé
|
|
2
|
+
|
|
3
|
+
Le transport optimisé réduit l’empreinte physique observée, mais **aucun gain de vitesse n’est mesuré** dans cette passe. Les quatre passages ABBA ont réussi **96/96 exécutions**, avec **24 exports / 1440 frames sondés**. Tous les **3260 relevés** sont **fair / alimentation normale / application active** : le protocole thermique **nominal n’est pas satisfait**. La qualification stricte est **incomplete**, également à cause des validateurs médias non branchés.
|
|
4
|
+
|
|
5
|
+
La [preuve publique déidentifiée](../benchmark/ios-device-306-optimization-verification.json) conserve les métriques, les deux paires, les hashes complets et leurs sources locales ignorées par Git. Les preuves [natives initiales](../benchmark/ios-native-device-306-verification.json) et [fonctionnelles du simulateur](../benchmark/ios-simulator-306-functional-verification.json) restent distinctes.
|
|
6
|
+
|
|
7
|
+
Contexte communiqué par l’utilisateur après les mesures : l’iPhone était posé sur un mini-routeur de voyage et utilisé en partage de connexion (tethering). Ce contexte externe n’a pas été instrumenté ; sa contribution thermique et sa charge en arrière-plan ne sont pas quantifiées. La chauffe ne peut donc pas être attribuée à la bibliothèque, et ces données ne permettent pas d’isoler la cause des écarts de durée. Les résultats bruts et le verdict thermique restent inchangés. Une comparaison en conditions contrôlées demanderait un téléphone refroidi, éloigné du routeur et sans partage de connexion actif.
|
|
8
|
+
|
|
9
|
+
## Ce qui est comparé
|
|
10
|
+
|
|
11
|
+
Même bibliothèque alpha, **Skia 3.0.6 / WebGPU 0.12.1**, iPhone 15 Pro / iOS 27.0.1, RN 0.86.2, Release, horloge performance.now. Huit scénarios sélectionnés, trois répétitions par processus et deux processus par variante, ordre **initial → optimisé → optimisé → initial**. Les fenêtres ne se chevauchent pas. La preview mesure **720×720 pixels physiques**, les fixtures embarquées sont vérifiées par hashes et le budget appliqué est identique : **512 Mio de réservations vidéo**. Ce résultat ne qualifie pas le catalogue complet de 65 cas.
|
|
12
|
+
|
|
13
|
+
Le build initial utilise un blit natif puis une surface GPU intermédiaire avant la copie possédée. Le build optimisé retire cette surface intermédiaire et prend son snapshot possédé depuis la texture de transfert. Les copies et l’attente nécessaires à l’indépendance des images restent présentes. Les deux chemins d’export conservent le **readback CPU et le pool de CVPixelBuffer borné** ; `gpuDirectExport` vaut `false`, y compris pour le mode direct demandé. Cette passe ne compare ni Skia 2, ni Skia 3.0.3, ni le backend Android.
|
|
14
|
+
|
|
15
|
+
## Mémoire du processus
|
|
16
|
+
|
|
17
|
+
Médianes de six répétitions réussies par variante, regroupées depuis deux processus. « Pic » désigne le maximum échantillonné dans chaque répétition ; il peut manquer une pointe. RSS et phys_footprint mesurent le processus et leurs imputations diffèrent. Les cas précédents peuvent laisser des caches ; les écarts ne sont pas une attribution exhaustive à la seule frame.
|
|
18
|
+
|
|
19
|
+
| Scénario | Pic empreinte initial / optimisé (Mio) | Écart | Empreinte settled initial / optimisé (Mio) | Pic RSS initial / optimisé (Mio) |
|
|
20
|
+
|---|---:|---:|---:|---:|
|
|
21
|
+
| H.264 1080p — copy | 184,58 / 175,27 | -5,0 % | 70,45 / 62,59 | 82,35 / 82,09 |
|
|
22
|
+
| H.264 4K — copy | 402,54 / 358,53 | -10,9 % | 173,50 / 131,35 | 84,28 / 84,03 |
|
|
23
|
+
| HEVC 4K — copy | 404,98 / 361,03 | -10,9 % | 176,90 / 135,44 | 86,42 / 86,23 |
|
|
24
|
+
| H.264 1080p — direct demandé | 297,56 / 255,58 | -14,1 % | 179,70 / 139,29 | 90,14 / 90,28 |
|
|
25
|
+
| H.264 4K — direct demandé | 411,03 / 368,40 | -10,4 % | 181,75 / 140,65 | 92,43 / 92,46 |
|
|
26
|
+
| HEVC 4K — direct demandé | 412,24 / 368,91 | -10,5 % | 182,77 / 144,59 | 93,75 / 93,23 |
|
|
27
|
+
| Export H.264 — copy | 281,24 / 239,76 | -14,8 % | 236,13 / 189,45 | 122,77 / 122,87 |
|
|
28
|
+
| Export H.264 — direct demandé | 316,31 / 273,38 | -13,6 % | 270,19 / 228,35 | 157,37 / 157,02 |
|
|
29
|
+
|
|
30
|
+
En lecture 4K, l’empreinte physique au pic baisse d’environ **10 à 11 %**, avec RSS pratiquement inchangé. Les **120 points settled** ont les quatre compteurs suivis à zéro : ownedBytes, ownedResources, decoderCount et inFlightFrames. Ces réservations ne mesurent pas la mémoire totale. La stabilisation programmée ne prouve ni fermeture de tous les caches/pilotes, ni palier durable, ni absence de fuite. Aucun diagnostic prolongé 3.0.6 ou repos natif n’a été ajouté à cette passe.
|
|
31
|
+
|
|
32
|
+
## Lecture et export
|
|
33
|
+
|
|
34
|
+
Les six lectures restent autour de **60 callbacks/s**, sans frame déclarée manquante. La médiane de la borne supérieure du p95 de durée murale du callback vaut **≤ 0,25 ms** des deux côtés. Les buckets ne permettent pas de mesurer un gain sous cette borne. Ces chiffres ne sont ni les FPS vidéo décodées/présentées, ni le temps GPU, ni une consommation CPU.
|
|
35
|
+
|
|
36
|
+
Les exports demandent H.264 **640×360, 30 images/s, 2 s, 60 frames**, en copy ou direct demandé. Les 24 fichiers complets ont ces dimensions, codec, durée et cadence ; les PTS sont monotones et exacts, de 0 à 59/30 s. Les pixels, la couleur, l’orientation visuelle, l’audio et l’immutabilité GPU des images détenues ne sont pas validés par cette sonde.
|
|
37
|
+
|
|
38
|
+
| Export | Pipeline initial / optimisé (ms) | Écart pipeline | Sonde initial / optimisé (ms) | Total initial / optimisé (ms) |
|
|
39
|
+
|---|---:|---:|---:|---:|
|
|
40
|
+
| Export H.264 — copy | 248,18 / 263,09 | +6,0 % | 41,07 / 41,78 | 294,91 / 307,16 |
|
|
41
|
+
| Export H.264 — direct demandé | 251,80 / 260,67 | +3,5 % | 41,45 / 40,90 | 295,49 / 305,08 |
|
|
42
|
+
|
|
43
|
+
Le pipeline couvre préparation, décodage, dessin, readback et encodage ; il exclut la sonde. Le total inclut aussi la sonde et la suppression du fichier. Le pipeline est environ **6,0 % plus lent en copy** et **3,5 % plus lent avec direct demandé** dans les médianes regroupées. Aucune amélioration globale de vitesse n’est établie.
|
|
44
|
+
|
|
45
|
+
## Direction dans chaque paire
|
|
46
|
+
|
|
47
|
+
Les deux ordres montrent la même direction pour l’empreinte physique et les deux pipelines d’export. Ils restent tous deux entièrement fair ; aucune paire nominale ne permet de lever cette limite.
|
|
48
|
+
|
|
49
|
+
| Scénario | Écart pic empreinte AB / BA | Écart pipeline AB / BA |
|
|
50
|
+
|---|---:|---:|
|
|
51
|
+
| H.264 1080p — copy | -5,0 % / -5,1 % | — / — |
|
|
52
|
+
| H.264 4K — copy | -11,0 % / -10,8 % | — / — |
|
|
53
|
+
| HEVC 4K — copy | -11,0 % / -10,3 % | — / — |
|
|
54
|
+
| H.264 1080p — direct demandé | -14,8 % / -14,0 % | — / — |
|
|
55
|
+
| H.264 4K — direct demandé | -10,8 % / -10,1 % | — / — |
|
|
56
|
+
| HEVC 4K — direct demandé | -10,8 % / -10,2 % | — / — |
|
|
57
|
+
| Export H.264 — copy | -15,4 % / -14,1 % | +6,2 % / +6,8 % |
|
|
58
|
+
| Export H.264 — direct demandé | -13,7 % / -13,5 % | +2,1 % / +5,0 % |
|
|
59
|
+
|
|
60
|
+
Les validateurs de catalogue demandés pour les exports restent indisponibles, même si leurs métadonnées sont vérifiées séparément par AVFoundation. Aucun seuil ni exigence nominale n’a été modifié pour obtenir un verdict passé. Les petits écarts temporels sont descriptifs de ce téléphone dans ces conditions ; aucun test de significativité ou intervalle de confiance n’est revendiqué.
|
|
61
|
+
|
|
62
|
+
## Traçabilité
|
|
63
|
+
|
|
64
|
+
| Passage | Variante | Début UTC | Fin UTC | Relevés fair | JSON SHA-256 |
|
|
65
|
+
|---|---|---|---|---:|---|
|
|
66
|
+
| A1 | initial | 2026-10-07T09:11:23.286Z | 2026-10-07T09:13:35.359Z | 813 | 6126537ad84f5f368a75b701e98b6a858ac5e6c3182eee0c4cd8504b0b93e173 |
|
|
67
|
+
| B1 | optimisé | 2026-10-07T09:14:05.347Z | 2026-10-07T09:16:17.610Z | 815 | 3bee240d07448de9114a57b8875d54bebad29af05850ad2c95a115649567f1e1 |
|
|
68
|
+
| B2 | optimisé | 2026-10-07T09:16:41.803Z | 2026-10-07T09:18:54.200Z | 816 | e4bd2052a8f2535fafa19a0fc34666a224c57b7c740d6596e755c71066da1814 |
|
|
69
|
+
| A2 | initial | 2026-10-07T09:19:23.995Z | 2026-10-07T09:21:36.326Z | 816 | 6ac7859ac63b86c8239573d83bb0c4bf8e9a049ecd230b0f308401520486cbde |
|
|
70
|
+
|
|
71
|
+
| Build gelé | Exécutable SHA-256 | Bundle Hermes SHA-256 |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| initial | d8add0b84daf5ad62f789c1cb256e02582ca62dae55287d5523664e3c250dbff | 81d05e2c71785474ac7f17bdf32c6880db7cd541ea611d4c3b979e68243f8b02 |
|
|
74
|
+
| optimisé | 7464c2f2c8a89a7cd42676b650b1db4f04af65fe1a5db58146fff3f13307e690 | f054c61a32aa80a64fb685c187ff2e8865206e23c3e117f9d41b6995c8fea137 |
|
|
75
|
+
|
|
76
|
+
Avant cette comparaison, le smoke physique optimisé a passé **5/5 cas**, de **09:10:13.538 à 09:11:01.576 UTC**, avec 368 relevés fair/normal/active. Ses sorties et timings restent séparés des 96 exécutions ABBA. Le build optimisé a été laissé installé après les mesures, sans lancement ni mesure supplémentaire. Les tests Android sont compilés et les suites JVM ont passé ; aucune exécution physique Android ni mesure de performance/mémoire Android n’est ajoutée par ce rapport. Les résultats [physiques Skia 3.0.3](PERFORMANCE_AB_IPHONE_303.md) et [diagnostic prolongé 3.0.3](PERFORMANCE_SOAK_IPHONE_303.md) restent historiques et séparés.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Mesures du candidat sur simulateur iOS
|
|
2
|
+
|
|
3
|
+
Cette passe concerne la révision `486b12a…`, après activation des scopes autorelease synchrones. La [passe initiale](PERFORMANCE_SIMULATOR_INITIAL.md), son diagnostic long et ses observations au repos restent archivés séparément. Aucun gain statistique n'est déduit entre les deux passes, et le comparatif avec l'ancienne bibliothèque reste différé.
|
|
4
|
+
|
|
5
|
+
Mesures réelles du 2026-10-06T16:40:14.850Z au 2026-10-06T16:43:27.826Z, en Release sur simulateur iPhone19,2, iOS 27.0. Candidat 0.1.0-alpha.0, Skia 3.0.3, WebGPU 0.11.0, RN 0.86.2. Trois répétitions réussies pour chacun des cinq cas.
|
|
6
|
+
|
|
7
|
+
Horloge : performance.now. Écran déclaré : 60 Hz, PixelRatio 3. Conditions natives constantes : nominal / normal. Budget déclaré : 512 Mio. Workloads 2026-10-06.4.
|
|
8
|
+
|
|
9
|
+
Hôte vérifié : MacBookPro18,3, Apple M1 Pro, 16 Gio, macOS 27.0.1 (26A434). Source : sysctl hw.model/hw.memsize/machdep.cpu.brand_string and sw_vers.
|
|
10
|
+
|
|
11
|
+
Les tableaux donnent la médiane des trois répétitions et leur plage [min–max]. Ces mesures concernent uniquement le candidat sur le GPU et les codecs du Mac ; elles ne sont ni une comparaison A/B ni une qualification de performance sur iPhone.
|
|
12
|
+
|
|
13
|
+
## Lecture
|
|
14
|
+
|
|
15
|
+
| Cas | Callbacks de dessin/s | p95 CPU, borne supérieure (ms) | p95 espacement, borne supérieure (ms) | Callbacks / frames attendues manquantes par répétition |
|
|
16
|
+
| --- | --- | --- | --- | --- |
|
|
17
|
+
| single-h264-1080p30-audio.mp4 | 59.90 [59.57–59.92] | 0.25 [0.25–0.25] | 25.00 [25.00–25.00] | 228/0, 229/0, 229/0 |
|
|
18
|
+
| single-h264-4k30.mp4 | 59.92 [59.90–59.96] | 0.25 [0.25–0.25] | 25.00 [25.00–25.00] | 229/0, 229/0, 229/0 |
|
|
19
|
+
| single-hevc-4k30.mp4 | 59.85 [59.84–59.85] | 0.25 [0.25–0.25] | 33.33 [33.33–33.33] | 229/0, 229/0, 229/0 |
|
|
20
|
+
|
|
21
|
+
Preview : 720×720 pixels physiques. Le p95 est la borne supérieure du bucket d’histogramme, pas une valeur précise. La mesure dite CPU est la durée murale du callback de dessin et de son observation, y compris ses appels natifs et attentes éventuelles ; elle ne mesure pas une consommation CPU par profilage. Elle exclut une partie du décodage/import de frame et ne mesure pas la fin des commandes GPU. La cadence décrit des callbacks/s ; plusieurs callbacks peuvent redessiner la même frame vidéo. Le nombre de frames décodées/perdues et le temps GPU ne sont pas collectés.
|
|
22
|
+
|
|
23
|
+
## Export
|
|
24
|
+
|
|
25
|
+
| Cas | Dimensions / frames par fichier | Fichiers sondés | Pipeline export hors sonde (ms) | Sonde séparée (ms) |
|
|
26
|
+
| --- | --- | --- | --- | --- |
|
|
27
|
+
| encode-h264-copy | 640×360 / 60 | 3 | 244.34 [238.24–393.71] | 19.82 [18.33–20.59] |
|
|
28
|
+
| repeated-mixed-size-exports | 640×360 / 18 | 21 | 95.21 [93.94–95.34] | 10.36 [10.34–10.45] |
|
|
29
|
+
| repeated-mixed-size-exports | 1920×1080 / 18 | 21 | 233.40 [231.19–235.77] | 28.80 [28.49–28.96] |
|
|
30
|
+
| repeated-mixed-size-exports | 720×1280 / 18 | 18 | 135.81 [133.48–138.93] | 16.73 [16.60–16.83] |
|
|
31
|
+
|
|
32
|
+
63 fichiers ont été exportés puis sondés. Pour les tailles alternées, chaque répétition fournit d’abord sa médiane par taille ; le tableau résume ensuite ces trois médianes. Le chronomètre d’encodage comprend le pipeline export de la bibliothèque, sa préparation, le décodage, le rendu, la lecture CPU, l’encodeur et sa fermeture ; il exclut la sonde AVFoundation. Les métadonnées, nombres de frames, dimensions, codec et PTS exacts ont été vérifiés. Les validateurs de pixels/audio du catalogue restent indisponibles.
|
|
33
|
+
|
|
34
|
+
## Mémoire
|
|
35
|
+
|
|
36
|
+
| Cas | RSS initial (Mio) | Pic RSS échantillonné (Mio) | RSS après fermeture (Mio) | Pic owned estimé (Mio) | Owned après fermeture (Mio) |
|
|
37
|
+
| --- | --- | --- | --- | --- | --- |
|
|
38
|
+
| single-h264-1080p30-audio.mp4 | 255.63 [189.84–259.14] | 364.19 [360.58–366.91] | 259.14 [255.63–261.83] | 67.24 [67.24–67.24] | 0.00 [0.00–0.00] |
|
|
39
|
+
| single-h264-4k30.mp4 | 262.38 [261.83–262.98] | 621.25 [620.47–623.45] | 262.98 [262.38–265.38] | 225.44 [225.44–225.44] | 0.00 [0.00–0.00] |
|
|
40
|
+
| single-hevc-4k30.mp4 | 244.91 [241.73–265.38] | 725.78 [722.89–739.83] | 244.59 [241.73–244.91] | 225.44 [225.44–225.44] | 0.00 [0.00–0.00] |
|
|
41
|
+
| encode-h264-copy | 296.55 [244.59–327.97] | 371.48 [324.44–381.13] | 327.97 [296.55–338.72] | 7.89 [7.02–8.76] | 0.00 [0.00–0.00] |
|
|
42
|
+
| repeated-mixed-size-exports | 444.88 [338.72–502.45] | 787.50 [698.47–840.83] | 502.45 [444.88–574.17] | 50.95 [50.95–50.95] | 0.00 [0.00–0.00] |
|
|
43
|
+
|
|
44
|
+
Les exports alternés présentent une croissance du RSS à expliquer : 444.88 → 502.45 → 574.17 Mio après fermeture des trois répétitions, depuis 338.72 Mio avant la première. Les réservations suivies reviennent à zéro, mais aucun palier du processus n'est démontré. Une session prolongée avec attribution des allocations est nécessaire pour distinguer caches persistants et fuite ; cette passe ne permet pas de trancher.
|
|
45
|
+
|
|
46
|
+
Le budget vidéo suivi n’inclut pas les budgets de cache Graphite : les headers livrés de Skia 3.0.3 définissent par défaut 256 Mio par Recorder et 256 Mio pour le Context. Ces budgets ne sont ni des allocations permanentes mesurées ni une attribution de ce RSS. [UPSTREAM_NOTES.md](UPSTREAM_NOTES.md) conserve les références et le point futur d’inspection/configuration amont. La bibliothèque ne purge pas globalement Graphite et ne modifie pas le device partagé de l’application.
|
|
47
|
+
|
|
48
|
+
RSS : resident_size par mach task_info, à l’échelle du processus. Owned : estimations des réservations de la bibliothèque. Tous les cas terminent avec zéro octet/réservation/décodeur/buffer en vol suivi. Les pics sont seulement ceux des échantillons disponibles ; une allocation brève entre deux relevés peut être absente. La fermeture attend le démontage et un délai de stabilisation ; aucun fence GPU général n’est fourni par le harness. Le RSS comprend les caches et allocations opaques des codecs/pilotes ; zéro owned ne prouve pas une absence de fuite.
|
|
49
|
+
|
|
50
|
+
La mémoire est échantillonnée toutes les 100 ms demandées ; les relevés natifs asynchrones peuvent arriver plus tard. Ce collecteur plus fréquent ajoute son propre coût, identique dans les répétitions de cette passe. La mémoire GPU totale, le heap natif et le heap JavaScript ne sont pas collectés. Les répétitions partagent un processus : les caches des cas antérieurs influencent le RSS et l’ordre des cas est conservé. Aucun palier de mémoire physique à long terme ni gain par rapport à la référence n’est démontré.
|
|
51
|
+
|
|
52
|
+
Les traces de création/fermeture de la bibliothèque sont désactivées en Release avec RNSV_TRACE_LIFECYCLE. Des traces système du codec HEVC Apple du simulateur peuvent subsister ; elles ne viennent pas du code JavaScript.
|
|
53
|
+
|
|
54
|
+
## Preuves
|
|
55
|
+
|
|
56
|
+
- simulator-performance-pooled.local.json — SHA-256 85bd8b3d78fc9a5ae35fbda6418b664aba27915846f673b25c480e15ceec8626.
|
|
57
|
+
- performance-host.local.json — SHA-256 4ff6a17dfbbe93dbe4de556c33b56b970c1f4787f01d088dca6dd1829e36f69b.
|
|
58
|
+
- final-functional-source-pooled.local.json — SHA-256 108be2c3032d9d073c9136109002e5550f6c02907aa6f3dc69eda81ab9eca55c.
|
|
59
|
+
|
|
60
|
+
Provenance consignée avant le run : fingerprint de production 486b12a722d317dd6bc5db720c1bb63e31c4ede7a2c07b5d19fa83422c1e78e8, SHA-256 main.jsbundle eb434d2ac98eb0246a25a7a05256f409caaf4ccfc484399c11f1653cd94ba878, SHA-256 exécutable 0f9ceb1b115ed08f0156fcf3e2dde2f35a93c773bc3a8f6b826e90459d71e966. Le fichier de provenance conserve également les hashes App/harness.
|
|
61
|
+
|
|
62
|
+
Les JSON bruts restent dans benchmark/results/*.local.json, ignorés par Git. Les identifiants privés d’appareil ne sont pas reproduits ici.
|
|
63
|
+
|
|
64
|
+
## Diagnostic long séparé des mesures initiales
|
|
65
|
+
|
|
66
|
+
Run distinct du 2026-10-06T16:44:32.449Z au 2026-10-06T16:47:41.140Z, 300 fichiers exportés/sondés sur trois répétitions. Ce run ne remplace ni ne fusionne les quinze répétitions des tableaux précédents. Les mêmes contrôles de Release/horloge/conditions/collecteurs, de séquence des tailles et de métadonnées/PTS sont appliqués.
|
|
67
|
+
|
|
68
|
+
| Répétition | RSS initial (Mio) | Pic RSS échantillonné (Mio) | RSS final après fermeture (Mio) | Owned final / réservations / décodeurs / buffers en vol |
|
|
69
|
+
| --- | --- | --- | --- | --- |
|
|
70
|
+
| 1 | 199.45 | 695.64 | 418.58 | 0 / 0 / 0 / 0 |
|
|
71
|
+
| 2 | 418.69 | 821.84 | 553.73 | 0 / 0 / 0 / 0 |
|
|
72
|
+
| 3 | 554.06 | 877.48 | 627.16 | 0 / 0 / 0 / 0 |
|
|
73
|
+
|
|
74
|
+
Sur ces répétitions, le RSS final augmente ; une croissance reste à expliquer. Ce constat se limite à ce run. Ces valeurs restent des relevés du processus, demandés après un délai de stabilisation, sans attribution native/GPU exhaustive. Elles ne prouvent ni la libération de toutes les allocations opaques ni une absence de fuite à long terme.
|
|
75
|
+
|
|
76
|
+
Aucune attribution de heap/GPU n'est fournie par ce rapport. Les temps de ce diagnostic ne constituent pas une nouvelle mesure comparative de performance.
|
|
77
|
+
|
|
78
|
+
Preuve locale : simulator-mixed-soak-pooled.local.json — SHA-256 eb71a035d28b0edd507b48ce6eddf49a2d7836ec8bd73bc96ff050910dfe5e65.
|
|
79
|
+
|
|
80
|
+
## Repos observé après le diagnostic long
|
|
81
|
+
|
|
82
|
+
Lectures RSS par ps du même processus au repos :
|
|
83
|
+
|
|
84
|
+
- 551.375 Mio, à 05:40 de durée de vie du processus, dans la fenêtre du 2026-10-06 16:50:08 UTC au 2026-10-06 16:50:11 UTC.
|
|
85
|
+
- 353.453 Mio, à 08:42 de durée de vie du processus, dans la fenêtre du 2026-10-06 16:53:09 UTC au 2026-10-06 16:53:13 UTC.
|
|
86
|
+
|
|
87
|
+
Ces relevés sont distincts des points settled après fermeture. Ils décrivent le RSS du processus à ces instants, sans identifier le heap, le GC ou le GPU responsables de sa variation. Ils ne démontrent ni un palier stable ni une absence de fuite à long terme.
|
|
88
|
+
|
|
89
|
+
Preuve locale : mixed-soak-pooled-idle-observations.local.json — SHA-256 17c45ab84e114cdb26a68128d3b08a4d41c913391481ac375b41a9b4e4a6a2ac.
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Mesures du candidat sur simulateur iOS
|
|
2
|
+
|
|
3
|
+
Cette passe initiale concerne la révision `621c20f…`, avant la correction des pools autorelease sur les appels synchrones du thread Worklets. Elle est conservée comme historique ; les nouvelles preuves de la révision `486b12a…` figurent dans [PERFORMANCE_SIMULATOR.md](PERFORMANCE_SIMULATOR.md). Les tableaux de ces quinze répétitions restent inchangés, et les diagnostics de 300 exports et de repos sont présentés séparément. Aucun gain statistique n'est déduit entre les passes.
|
|
4
|
+
|
|
5
|
+
Mesures réelles du 2026-10-06T16:16:28.332Z au 2026-10-06T16:19:41.747Z, en Release sur simulateur iPhone19,2, iOS 27.0. Candidat 0.1.0-alpha.0, Skia 3.0.3, WebGPU 0.11.0, RN 0.86.2. Trois répétitions réussies pour chacun des cinq cas.
|
|
6
|
+
|
|
7
|
+
Horloge : performance.now. Écran déclaré : 60 Hz, PixelRatio 3. Conditions natives constantes : nominal / normal. Budget déclaré : 512 Mio. Workloads 2026-10-06.4.
|
|
8
|
+
|
|
9
|
+
Hôte vérifié : MacBookPro18,3, Apple M1 Pro, 16 Gio, macOS 27.0.1 (26A434). Source : sysctl hw.model/hw.memsize/machdep.cpu.brand_string and sw_vers.
|
|
10
|
+
|
|
11
|
+
Les tableaux donnent la médiane des trois répétitions et leur plage [min–max]. Ces mesures concernent uniquement le candidat sur le GPU et les codecs du Mac ; elles ne sont ni une comparaison A/B ni une qualification de performance sur iPhone.
|
|
12
|
+
|
|
13
|
+
## Lecture
|
|
14
|
+
|
|
15
|
+
| Cas | Callbacks de dessin/s | p95 CPU, borne supérieure (ms) | p95 espacement, borne supérieure (ms) | Callbacks / frames attendues manquantes par répétition |
|
|
16
|
+
| --- | --- | --- | --- | --- |
|
|
17
|
+
| single-h264-1080p30-audio.mp4 | 59.93 [59.90–59.96] | 0.25 [0.25–0.25] | 25.00 [25.00–25.00] | 229/0, 229/0, 229/0 |
|
|
18
|
+
| single-h264-4k30.mp4 | 59.87 [59.85–59.90] | 0.25 [0.25–0.25] | 25.00 [25.00–25.00] | 229/0, 229/0, 228/0 |
|
|
19
|
+
| single-hevc-4k30.mp4 | 59.85 [59.82–59.86] | 0.25 [0.25–0.25] | 33.33 [25.00–33.33] | 229/0, 229/0, 229/0 |
|
|
20
|
+
|
|
21
|
+
Preview : 720×720 pixels physiques. Le p95 est la borne supérieure du bucket d’histogramme, pas une valeur précise. La mesure dite CPU est la durée murale du callback de dessin et de son observation, y compris ses appels natifs et attentes éventuelles ; elle ne mesure pas une consommation CPU par profilage. Elle exclut une partie du décodage/import de frame et ne mesure pas la fin des commandes GPU. La cadence décrit des callbacks/s ; plusieurs callbacks peuvent redessiner la même frame vidéo. Le nombre de frames décodées/perdues et le temps GPU ne sont pas collectés.
|
|
22
|
+
|
|
23
|
+
## Export
|
|
24
|
+
|
|
25
|
+
| Cas | Dimensions / frames par fichier | Fichiers sondés | Pipeline export hors sonde (ms) | Sonde séparée (ms) |
|
|
26
|
+
| --- | --- | --- | --- | --- |
|
|
27
|
+
| encode-h264-copy | 640×360 / 60 | 3 | 265.39 [249.91–630.34] | 19.97 [19.78–20.05] |
|
|
28
|
+
| repeated-mixed-size-exports | 640×360 / 18 | 21 | 93.69 [89.86–97.25] | 10.24 [10.16–10.52] |
|
|
29
|
+
| repeated-mixed-size-exports | 1920×1080 / 18 | 21 | 229.07 [226.93–236.51] | 29.15 [29.12–30.19] |
|
|
30
|
+
| repeated-mixed-size-exports | 720×1280 / 18 | 18 | 136.40 [135.55–138.14] | 16.80 [16.67–16.92] |
|
|
31
|
+
|
|
32
|
+
63 fichiers ont été exportés puis sondés. Pour les tailles alternées, chaque répétition fournit d’abord sa médiane par taille ; le tableau résume ensuite ces trois médianes. Le chronomètre d’encodage comprend le pipeline export de la bibliothèque, sa préparation, le décodage, le rendu, la lecture CPU, l’encodeur et sa fermeture ; il exclut la sonde AVFoundation. Les métadonnées, nombres de frames, dimensions, codec et PTS exacts ont été vérifiés. Les validateurs de pixels/audio du catalogue restent indisponibles.
|
|
33
|
+
|
|
34
|
+
## Mémoire
|
|
35
|
+
|
|
36
|
+
Le budget vidéo suivi n'inclut pas les budgets de cache Graphite : Skia 3.0.3 configure par défaut 256 Mio par Recorder et 256 Mio pour le Context. Ce sont des budgets de cache, pas des allocations permanentes mesurées ni une attribution de ce RSS. [UPSTREAM_NOTES.md](UPSTREAM_NOTES.md) conserve les références exactes et le point futur d'inspection/configuration amont ; la bibliothèque ne purge pas les caches ni ne modifie le device partagé de l'application.
|
|
37
|
+
|
|
38
|
+
| Cas | RSS initial (Mio) | Pic RSS échantillonné (Mio) | RSS après fermeture (Mio) | Pic owned estimé (Mio) | Owned après fermeture (Mio) |
|
|
39
|
+
| --- | --- | --- | --- | --- | --- |
|
|
40
|
+
| single-h264-1080p30-audio.mp4 | 189.20 [148.80–220.72] | 342.69 [267.63–360.78] | 148.80 [143.08–220.69] | 67.24 [67.24–67.24] | 0.00 [0.00–0.00] |
|
|
41
|
+
| single-h264-4k30.mp4 | 157.61 [143.08–158.88] | 516.95 [515.61–519.39] | 158.88 [157.61–161.30] | 225.44 [225.44–225.44] | 0.00 [0.00–0.00] |
|
|
42
|
+
| single-hevc-4k30.mp4 | 147.02 [144.00–161.30] | 629.58 [628.33–635.64] | 147.02 [144.00–148.91] | 225.44 [225.44–225.44] | 0.00 [0.00–0.00] |
|
|
43
|
+
| encode-h264-copy | 219.02 [148.91–253.78] | 293.27 [256.61–305.23] | 253.78 [219.02–264.00] | 8.76 [8.76–8.76] | 0.00 [0.00–0.00] |
|
|
44
|
+
| repeated-mixed-size-exports | 386.39 [264.00–446.31] | 699.81 [632.23–792.03] | 446.30 [386.39–527.16] | 50.95 [50.95–50.95] | 0.00 [0.00–0.00] |
|
|
45
|
+
|
|
46
|
+
Les exports alternés présentent une croissance du RSS à expliquer : 386.39 → 446.30 → 527.16 Mio après fermeture des trois répétitions, depuis 264.00 Mio avant la première. Les réservations suivies reviennent à zéro, mais aucun palier du processus n'est démontré. Une session prolongée avec attribution des allocations est nécessaire pour distinguer caches persistants et fuite ; cette passe ne permet pas de trancher.
|
|
47
|
+
|
|
48
|
+
RSS : resident_size par mach task_info, à l’échelle du processus. Owned : estimations des réservations de la bibliothèque. Tous les cas terminent avec zéro octet/réservation/décodeur/buffer en vol suivi. Les pics sont seulement ceux des échantillons disponibles ; une allocation brève entre deux relevés peut être absente. La fermeture attend le démontage et un délai de stabilisation ; aucun fence GPU général n’est fourni par le harness. Le RSS comprend les caches et allocations opaques des codecs/pilotes ; zéro owned ne prouve pas une absence de fuite.
|
|
49
|
+
|
|
50
|
+
La mémoire est échantillonnée toutes les 100 ms demandées ; les relevés natifs asynchrones peuvent arriver plus tard. Ce collecteur plus fréquent ajoute son propre coût, identique dans les répétitions de cette passe. La mémoire GPU totale, le heap natif et le heap JavaScript ne sont pas collectés. Les répétitions partagent un processus : les caches des cas antérieurs influencent le RSS et l’ordre des cas est conservé. Aucun palier de mémoire physique à long terme ni gain par rapport à la référence n’est démontré.
|
|
51
|
+
|
|
52
|
+
Les traces de création/fermeture de la bibliothèque sont désactivées en Release avec RNSV_TRACE_LIFECYCLE. Des traces système du codec HEVC Apple du simulateur peuvent subsister ; elles ne viennent pas du code JavaScript.
|
|
53
|
+
|
|
54
|
+
## Preuves
|
|
55
|
+
|
|
56
|
+
- simulator-performance.local.json — SHA-256 8217d099ae301a0f31227f10ee85492e69668c88ecdf1ad6442a89e766261e83.
|
|
57
|
+
- performance-host.local.json — SHA-256 4ff6a17dfbbe93dbe4de556c33b56b970c1f4787f01d088dca6dd1829e36f69b.
|
|
58
|
+
- final-functional-source.local.json — SHA-256 a85a154a74b198568a775438c2411f7264b400b446d5e8a60ea7b2aba061bbe9.
|
|
59
|
+
|
|
60
|
+
Provenance consignée avant le run : fingerprint de production 621c20f63ff056996abd2beb22e107527ae3bbe4259252380680ff30eeeafd7c, SHA-256 main.jsbundle 5883d967064c8de054199e87df1567942bfa335f867a528daf4cbf3f2061cfe2, SHA-256 exécutable 0f9ceb1b115ed08f0156fcf3e2dde2f35a93c773bc3a8f6b826e90459d71e966. Le fichier de provenance conserve également les hashes App/harness.
|
|
61
|
+
|
|
62
|
+
Les JSON bruts restent dans benchmark/results/*.local.json, ignorés par Git. Les identifiants privés d’appareil ne sont pas reproduits ici.
|
|
63
|
+
|
|
64
|
+
## Diagnostic long séparé des mesures initiales
|
|
65
|
+
|
|
66
|
+
Ce run a redémarré l'application. Une tentative vmmap pendant ce diagnostic a été bloquée puis annulée ; aucune catégorie de heap n'a été collectée. Ses durées ne constituent pas une mesure comparative de performance.
|
|
67
|
+
|
|
68
|
+
Run distinct du 2026-10-06T16:23:51.771Z au 2026-10-06T16:28:01.091Z, 300 fichiers exportés/sondés sur trois répétitions. Ce run ne remplace ni ne fusionne les quinze répétitions des tableaux précédents. Les mêmes contrôles de Release/horloge/conditions/collecteurs, de séquence des tailles et de métadonnées/PTS sont appliqués.
|
|
69
|
+
|
|
70
|
+
| Répétition | RSS initial (Mio) | Pic RSS échantillonné (Mio) | RSS final après fermeture (Mio) | Owned final / réservations / décodeurs / buffers en vol |
|
|
71
|
+
| --- | --- | --- | --- | --- |
|
|
72
|
+
| 1 | 197.06 | 716.56 | 350.38 | 0 / 0 / 0 / 0 |
|
|
73
|
+
| 2 | 350.41 | 679.52 | 317.23 | 0 / 0 / 0 / 0 |
|
|
74
|
+
| 3 | 317.61 | 703.64 | 294.20 | 0 / 0 / 0 / 0 |
|
|
75
|
+
|
|
76
|
+
Sur ces répétitions, le RSS final diminue ; aucune croissance continue n'est observée. Ce constat se limite à ce run. Ces valeurs restent des relevés du processus, demandés après un délai de stabilisation, sans attribution native/GPU exhaustive. Elles ne prouvent ni la libération de toutes les allocations opaques ni une absence de fuite à long terme.
|
|
77
|
+
|
|
78
|
+
Aucune attribution de heap/GPU n'est fournie par ce rapport. Les temps de ce diagnostic ne constituent pas une nouvelle mesure comparative de performance.
|
|
79
|
+
|
|
80
|
+
Preuve locale : simulator-mixed-soak.local.json — SHA-256 2aefd9cd36d2422d1e76a2165520194159dcaa04d1b26037f7269e33eb8b289c.
|
|
81
|
+
|
|
82
|
+
## Repos observé après le run initial
|
|
83
|
+
|
|
84
|
+
Le même processus est resté au repos entre deux lectures RSS par ps : 354.375 Mio à 343 s de durée de vie du processus ; 354.375 Mio à 409 s de durée de vie du processus. Les heures murales exactes de ces lectures n'ont pas été capturées ; le recordedAt du JSON correspond à leur consignation, pas à chaque mesure.
|
|
85
|
+
|
|
86
|
+
Ces relevés sont distincts des points settled après deux secondes et de leur collecteur mach task_info. Ils montrent que le RSS du processus a baissé au repos ; ils n'attribuent pas cette baisse au heap, au GC ou au GPU, et ne prouvent aucune libération précise de buffer.
|
|
87
|
+
|
|
88
|
+
Preuve locale : performance-idle-observations.local.json — SHA-256 b7ef37a9ddac4a4e4018a1bd30313b060e4eb06940952c499dc8096276eb2302.
|
|
89
|
+
|
|
90
|
+
## Repos observé après le diagnostic de 300 exports
|
|
91
|
+
|
|
92
|
+
Lecture RSS par ps du même processus au repos : 85.234 Mio, à 09:02 de durée de vie du processus, dans la fenêtre du 2026-10-06 16:32:49 UTC au 2026-10-06 16:32:52 UTC.
|
|
93
|
+
|
|
94
|
+
Le RSS du scénario est redescendu après un repos plus long : aucune rétention RSS permanente n'est détectée dans cette observation. Cela n'identifie ni le heap, ni le GC, ni le GPU responsables de cette baisse, et ne constitue pas une preuve d'absence de fuite dans tous les scénarios ou à long terme.
|
|
95
|
+
|
|
96
|
+
Preuve locale : mixed-soak-idle-observations.local.json — SHA-256 9399bfa3bdfcf9a9a1d23d8b3614b5bd612a3a03c37675096e884222d4a5d4c0.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Endurance d’export sur iPhone — Skia 3.0.3
|
|
2
|
+
|
|
3
|
+
Le candidat a terminé **3/3 répétitions de 100 exports**, avec **300 fichiers sondés**, du 2026-10-07T08:03:12.123Z au 2026-10-07T08:06:20.428Z. La mémoire du processus augmente entre les répétitions ; le collecteur de repos a ensuite dépassé son délai sans relevés. Aucun palier stable ni absence de fuite n’est démontré. La référence a subi un crash natif avant de produire son JSON : aucune comparaison chiffrée d’endurance n’est disponible.
|
|
4
|
+
|
|
5
|
+
Cible physique : iPhone 15 Pro (iPhone16,1), iOS 27.0.1, RN 0.86.2, Release. Candidat 0.1.0-alpha.0, Skia 3.0.3 / WebGPU 0.11.0, workload 2026-10-07.1, profil soak. Un seul processus a exécuté les trois blocs ; aucun relevé de repos associé n’a été obtenu. Budget vidéo suivi : 512 Mio ; ce n’est pas un plafond de mémoire totale.
|
|
6
|
+
|
|
7
|
+
Source H.264 638×358, compositions de 0,6 s. Tailles alternées : 640×360 (102 fichiers), 1920×1080 (99), 720×1280 (99). Chaque fichier contient **18 frames H.264 à 30 fps**, de 0 à 17/30 s. Les dimensions, codec, compte, durée, rotation et timestamps monotones/exacts ont été revérifiés pour les 300 sondes. Cela ne remplace pas une validation visuelle/colorimétrique des pixels.
|
|
8
|
+
|
|
9
|
+
## Mémoire par répétition
|
|
10
|
+
|
|
11
|
+
| Bloc | Statut / fichiers sondés | RSS initial / pic / final (Mio) | Empreinte physique initiale / pic / finale (Mio) | Owned / réservations / décodeurs / buffers en vol finaux |
|
|
12
|
+
| --- | --- | --- | --- | --- |
|
|
13
|
+
| 1 | passed / 100 | 52.53 / 246.48 / 193.66 | 22.02 / 284.60 / 192.94 | 0 / 0 / 0 / 0 |
|
|
14
|
+
| 2 | passed / 100 | 193.66 / 349.47 / 330.97 | 192.94 / 385.41 / 326.56 | 0 / 0 / 0 / 0 |
|
|
15
|
+
| 3 | passed / 100 | 330.97 / 444.89 / 408.53 | 326.56 / 477.02 / 402.03 | 0 / 0 / 0 / 0 |
|
|
16
|
+
|
|
17
|
+
Collecte demandée toutes les 100 ms, 1723 relevés, aucun relevé tronqué. Conditions : 1528 nominal, 195 fair ; tous les relevés sont au premier plan et en alimentation normale. L’état thermique devient fair pendant le dernier bloc : les durées de ce diagnostic ne constituent pas une performance thermique nominale ni un A/B.
|
|
18
|
+
|
|
19
|
+
RSS : mach task_info resident_size. Empreinte physique : task_vm_info phys_footprint. Ce sont deux mesures distinctes du processus entier, pas la mémoire de cette bibliothèque seule ; elles ne s’additionnent pas. Les pics sont échantillonnés et peuvent manquer une allocation brève. Les fins suivent le délai de stabilisation prévu, sans preuve de libération de tous les caches. Le retour des réservations suivies à zéro ne permet pas d’attribuer le RSS ou l’empreinte au heap, au GC ou au GPU. La mémoire GPU totale et le heap natif séparé ne sont pas mesurés.
|
|
20
|
+
|
|
21
|
+
## Repos demandé : collecteur en échec
|
|
22
|
+
|
|
23
|
+
Le run demandait 180 s de relevés natifs au repos, mais aucun fichier de repos n’a été obtenu avant le délai du runner. Le journal final conserve **failed** et **Native idle collector did not finish before its deadline**, terminé à 2026-10-07T08:11:30.431Z. Le runner a ensuite arrêté son application de test (stoppedAfterFailure: true). Les 300 sondes déjà enregistrées restent valides ; le statut global de l’expérience, incluant le repos, reste en échec.
|
|
24
|
+
|
|
25
|
+
Ce délai dépassé concerne le collecteur de repos : il ne constitue ni un crash natif observé, ni une preuve de palier, ni une mesure mémoire à 180 s. Aucun zéro, courbe de repos ou pourcentage n’est substitué aux valeurs absentes. La demande ultérieure de passer à Skia 3.0.6 explique l’absence de nouvelle investigation ou réexécution de ce test 3.0.3 ; elle n’est pas la cause du timeout déjà enregistré.
|
|
26
|
+
|
|
27
|
+
## Crash de la référence
|
|
28
|
+
|
|
29
|
+
La référence Skia 2.10.1 a subi un **SIGTRAP / EXC_BREAKPOINT** à 2026-10-07T08:01:30.9561Z, dans **GrResourceCache::removeResource(GrGpuResource*)**, pendant la destruction d’une surface Ganesh sur le thread GC **hades**. Le PID, le bundle, le conteneur d’exécutable et l’UUID binaire ont été rapprochés des preuves de ce run. Aucun JSON de benchmark ni relevé de repos comparable n’a été émis. Le nom d’un fichier restant suggère la 68e demande d’export du premier bloc ; ce n’est pas un compte d’exports réussis ou vérifiés.
|
|
30
|
+
|
|
31
|
+
La cause précise de l’invariant Ganesh violé reste inconnue. Ce crash n’est ni une preuve de fuite ni une terminaison Jetsam, et ne justifie aucun nombre mémoire ou pourcentage d’amélioration inventé. Le fork historique reste inchangé. Les huit cas du [comparatif physique court](PERFORMANCE_AB_IPHONE_303.md) et les résultats du simulateur restent des expériences distinctes.
|
|
32
|
+
|
|
33
|
+
## Traçabilité
|
|
34
|
+
|
|
35
|
+
Exécutable candidat SHA-256 : b829983937bb0a1e092a40c78ab2b9e4753af72aee86c6007ffeae1698aa2d38. Bundle JavaScript SHA-256 : a967d60fb422ca6b307df0be19c3fafe3ec66187ec9c95c73bfc3f0038a7506a. Ces deux identités concordent avec celles des deux passages candidats du comparatif court. Le manifest et les hashes des 14 fixtures embarquées ont été vérifiés contre ceux du résultat.
|
|
36
|
+
|
|
37
|
+
- iphone-soak-candidate-303.local.json — SHA-256 ab4d191346800fc6f87085e723155b42d42aa9d0c475d96e5bab1518f73ab617.
|
|
38
|
+
- iphone-soak-candidate-303-execution.local.json — SHA-256 8e4f538bd94136ff3112b753fb380b35e7d4cce9bc41a28ef07038cbbb5bd20e.
|
|
39
|
+
- iphone-soak-baseline-303-crash-analysis.local.json — SHA-256 79c10f971cfcfec404eb8d29001e2b782e99dff08078f4cf26694fb57ef9c024.
|
|
40
|
+
|
|
41
|
+
Les JSON originaux et leurs identités privées restent dans benchmark/results/*.local.json, ignorés par Git. Les valeurs de PID, runId, UDID et les chemins du conteneur ne sont pas reproduits ici. Les résultats concernent exclusivement Skia 3.0.3 / WebGPU 0.11.0 ; le brouillon isolé de migration vers Skia 3.0.6 / WebGPU 0.12.1 n’est pas qualifié par cette passe.
|