UNPKG

com.wallstop-studios.unity-helpers

Version:

Treasure chest of Unity developer tools

139 lines (113 loc) 8.02 kB
# Performance Baseline Tests > Auto-generated via PerformanceBaselineTests.GeneratePerformanceBaselineReport. Run the test explicitly to refresh these tables. These tests serve as automated CI regression guards. They verify that critical operations complete within acceptable time bounds, detecting performance regressions before they reach production. ## Baseline Philosophy Baselines are set generously (2-3x expected typical performance) to account for CI environment variability while still catching significant regressions. A test failure indicates a performance regression that needs investigation. ## Test Categories - **Spatial Trees**: QuadTree2D, KdTree2D, KdTree3D, OctTree3D, RTree2D construction and query performance - **PRNG**: Random number generation throughput for PcgRandom, XoroShiroRandom, SplitMix64, RomuDuo - **Pooling**: Collection pool rent/return overhead for List, HashSet, Dictionary, StringBuilder, SystemArrayPool - **Serialization**: JSON and Protobuf serialization/deserialization throughput <!-- BASELINE_PERFORMANCE_START --> ## Performance Baseline Report Generated: 2026-01-12 01:36:55 UTC ### Spatial Trees <table data-sortable> <thead> <tr> <th align="left">Test</th> <th align="right">Iterations</th> <th align="right">Time (ms)</th> <th align="right">Baseline (ms)</th> <th align="right">% of Baseline</th> <th align="left">Status</th> </tr> </thead> <tbody> <tr><td align="left">QuadTree2DRangeQuery</td><td align="right">1K</td><td align="right">27</td><td align="right">200</td><td align="right">13.5%</td><td align="left">Pass</td></tr> <tr><td align="left">QuadTree2DBoundsQuery</td><td align="right">1K</td><td align="right">29</td><td align="right">200</td><td align="right">14.5%</td><td align="left">Pass</td></tr> <tr><td align="left">KdTree2DRangeQuery</td><td align="right">1K</td><td align="right">27</td><td align="right">200</td><td align="right">13.5%</td><td align="left">Pass</td></tr> <tr><td align="left">KdTree2DNearestNeighbor</td><td align="right">1K</td><td align="right">32</td><td align="right">200</td><td align="right">16.0%</td><td align="left">Pass</td></tr> <tr><td align="left">RTree2DRangeQuery</td><td align="right">1K</td><td align="right">2479</td><td align="right">200</td><td align="right">1239.5%</td><td align="left">FAIL</td></tr> <tr><td align="left">OctTree3DRangeQuery</td><td align="right">1K</td><td align="right">15</td><td align="right">200</td><td align="right">7.5%</td><td align="left">Pass</td></tr> <tr><td align="left">KdTree3DRangeQuery</td><td align="right">1K</td><td align="right">33</td><td align="right">200</td><td align="right">16.5%</td><td align="left">Pass</td></tr> <tr><td align="left">QuadTree2DConstruction</td><td align="right">1</td><td align="right">2</td><td align="right">500</td><td align="right">0.4%</td><td align="left">Pass</td></tr> <tr><td align="left">KdTree2DConstruction</td><td align="right">1</td><td align="right">2</td><td align="right">500</td><td align="right">0.4%</td><td align="left">Pass</td></tr> <tr><td align="left">RTree2DConstruction</td><td align="right">1</td><td align="right">1</td><td align="right">500</td><td align="right">0.2%</td><td align="left">Pass</td></tr> </tbody> </table> ### PRNG <table data-sortable> <thead> <tr> <th align="left">Test</th> <th align="right">Iterations</th> <th align="right">Time (ms)</th> <th align="right">Baseline (ms)</th> <th align="right">% of Baseline</th> <th align="left">Status</th> </tr> </thead> <tbody> <tr><td align="left">PcgRandomNextInt</td><td align="right">1M</td><td align="right">1</td><td align="right">500</td><td align="right">0.2%</td><td align="left">Pass</td></tr> <tr><td align="left">PcgRandomNextFloat</td><td align="right">1M</td><td align="right">5</td><td align="right">500</td><td align="right">1.0%</td><td align="left">Pass</td></tr> <tr><td align="left">XoroShiroRandomNextInt</td><td align="right">1M</td><td align="right">1</td><td align="right">500</td><td align="right">0.2%</td><td align="left">Pass</td></tr> <tr><td align="left">SplitMix64NextInt</td><td align="right">1M</td><td align="right">1</td><td align="right">500</td><td align="right">0.2%</td><td align="left">Pass</td></tr> <tr><td align="left">RomuDuoNextInt</td><td align="right">1M</td><td align="right">1</td><td align="right">500</td><td align="right">0.2%</td><td align="left">Pass</td></tr> </tbody> </table> ### Pooling <table data-sortable> <thead> <tr> <th align="left">Test</th> <th align="right">Iterations</th> <th align="right">Time (ms)</th> <th align="right">Baseline (ms)</th> <th align="right">% of Baseline</th> <th align="left">Status</th> </tr> </thead> <tbody> <tr><td align="left">ListPooling</td><td align="right">100K</td><td align="right">239504</td><td align="right">200</td><td align="right">119752.0%</td><td align="left">FAIL</td></tr> <tr><td align="left">HashSetPooling</td><td align="right">100K</td><td align="right">16503</td><td align="right">200</td><td align="right">8251.5%</td><td align="left">FAIL</td></tr> <tr><td align="left">DictionaryPooling</td><td align="right">100K</td><td align="right">16997</td><td align="right">200</td><td align="right">8498.5%</td><td align="left">FAIL</td></tr> <tr><td align="left">SystemArrayPool</td><td align="right">100K</td><td align="right">8</td><td align="right">200</td><td align="right">4.0%</td><td align="left">Pass</td></tr> <tr><td align="left">StringBuilderPooling</td><td align="right">100K</td><td align="right">16456</td><td align="right">200</td><td align="right">8228.0%</td><td align="left">FAIL</td></tr> </tbody> </table> ### Serialization <table data-sortable> <thead> <tr> <th align="left">Test</th> <th align="right">Iterations</th> <th align="right">Time (ms)</th> <th align="right">Baseline (ms)</th> <th align="right">% of Baseline</th> <th align="left">Status</th> </tr> </thead> <tbody> <tr><td align="left">JsonSerialize</td><td align="right">10K</td><td align="right">43</td><td align="right">500</td><td align="right">8.6%</td><td align="left">Pass</td></tr> <tr><td align="left">JsonDeserialize</td><td align="right">10K</td><td align="right">64</td><td align="right">500</td><td align="right">12.8%</td><td align="left">Pass</td></tr> <tr><td align="left">JsonRoundTrip</td><td align="right">10K</td><td align="right">113</td><td align="right">1000</td><td align="right">11.3%</td><td align="left">Pass</td></tr> <tr><td align="left">ProtobufSerialize</td><td align="right">10K</td><td align="right">1169</td><td align="right">500</td><td align="right">233.8%</td><td align="left">FAIL</td></tr> <tr><td align="left">ProtobufDeserialize</td><td align="right">10K</td><td align="right">12</td><td align="right">500</td><td align="right">2.4%</td><td align="left">Pass</td></tr> <tr><td align="left">ProtobufRoundTrip</td><td align="right">10K</td><td align="right">1728</td><td align="right">1000</td><td align="right">172.8%</td><td align="left">FAIL</td></tr> </tbody> </table> ### Summary 19 passed, 7 failed out of 26 tests. <!-- BASELINE_PERFORMANCE_END --> ## Running the Tests These tests run automatically during CI to catch regressions. To generate fresh benchmark results: 1. Open Unity Test Runner 2. Navigate to `PerformanceBaselineTests` 3. Run `GeneratePerformanceBaselineReport` explicitly (it is marked `[Explicit]`) 4. Results will be output to the console and can be copied to this document ## Interpreting Results - **Time (ms)**: Actual measured time for the operation - **Baseline (ms)**: Maximum allowed time before test failure - **% of Baseline**: How much of the baseline budget was used (lower is better) - **Status**: Pass if within baseline, Fail if exceeded