Compare optimized vs original B+ tree performance.
()
| 293 | |
| 294 | |
| 295 | def test_optimized_performance(): |
| 296 | """Compare optimized vs original B+ tree performance.""" |
| 297 | print("Optimized B+ Tree Performance Test") |
| 298 | print("=" * 60) |
| 299 | |
| 300 | sizes = [1000, 10000, 50000] |
| 301 | |
| 302 | for size in sizes: |
| 303 | print(f"\nData Size: {size:,} items") |
| 304 | print("-" * 40) |
| 305 | |
| 306 | keys = list(range(size)) |
| 307 | random.shuffle(keys) |
| 308 | |
| 309 | # Test insertion |
| 310 | print("\nInsertion Performance:") |
| 311 | |
| 312 | # Original |
| 313 | gc.collect() |
| 314 | start = time.perf_counter() |
| 315 | original = BPlusTreeMap(capacity=128) |
| 316 | for key in keys: |
| 317 | original[key] = key * 2 |
| 318 | original_time = time.perf_counter() - start |
| 319 | |
| 320 | # Optimized |
| 321 | gc.collect() |
| 322 | start = time.perf_counter() |
| 323 | optimized = OptimizedBPlusTree(capacity=128) |
| 324 | for key in keys: |
| 325 | optimized[key] = key * 2 |
| 326 | optimized_time = time.perf_counter() - start |
| 327 | |
| 328 | improvement = (original_time - optimized_time) / original_time * 100 |
| 329 | print(f" Original: {original_time:.4f}s ({original_time/size*1e6:.1f} μs/op)") |
| 330 | print( |
| 331 | f" Optimized: {optimized_time:.4f}s ({optimized_time/size*1e6:.1f} μs/op)" |
| 332 | ) |
| 333 | print(f" Improvement: {improvement:.1f}%") |
| 334 | |
| 335 | # Test lookup |
| 336 | print("\nLookup Performance:") |
| 337 | lookup_keys = random.sample(keys, min(1000, size)) |
| 338 | |
| 339 | # Original |
| 340 | gc.collect() |
| 341 | start = time.perf_counter() |
| 342 | for _ in range(10): |
| 343 | for key in lookup_keys: |
| 344 | _ = original[key] |
| 345 | original_lookup = time.perf_counter() - start |
| 346 | |
| 347 | # Optimized |
| 348 | gc.collect() |
| 349 | start = time.perf_counter() |
| 350 | for _ in range(10): |
| 351 | for key in lookup_keys: |
| 352 | _ = optimized[key] |
no test coverage detected