Converter Benchmark Documentation¶
Overview¶
The Converter Benchmark is a performance testing tool for ZooUI’s image conversion and tiling pipeline. It measures the complete workflow from source image to tiled representation, including:
Image conversion from various formats to PPM
Tiling operation with memory tracking
Interactive zoom performance testing
The benchmark provides detailed metrics for conversion time, tiling performance, memory consumption, and rendering framerates under zoom operations.
Table of Contents¶
Quick Start¶
Run a benchmark on a single image:
cd /path/to/zooui
python test/benchmarks/converterbenchmark.py zooui/data/sample.jpg
Benchmark multiple images:
for file in zooui/data/*.jpg; do
python test/benchmarks/converterbenchmark.py "$file"
done
Usage Documentation¶
Basic Usage¶
The Converter Benchmark requires a single image file as input:
python test/benchmarks/converterbenchmark.py <image_file>
The benchmark will:
Convert the image to PPM format using libvips
Extract image dimensions and metadata
Tile the image into a pyramidal structure
Launch a ZooUI window (800x600)
Perform cold cache zoom test (100 frames)
Perform warm cache zoom test (100 frames)
Display comprehensive performance metrics
Supported Formats¶
The converter supports all formats supported by libvips, including:
JPEG (.jpg, .jpeg)
PNG (.png)
TIFF (.tif, .tiff)
GIF (.gif)
BMP (.bmp)
WebP (.webp)
And many more
For a complete list, see https://www.libvips.org/API/current/file-format.html
Output Interpretation¶
The benchmark produces output in multiple stages:
1. Conversion Phase
Benchmarking sample.jpg ...
Converting to PPM...
Done: took 2.45s
2. Metadata Extraction
Dimensions: 4096x3072, 12.58 megapixels
3. Tiling Phase
Tiling...
Done: took 8.23s consuming 145.32MB RAM
4. Zoom Testing
Viewport: 800x600
Zoom amount: 5.0
Zooming (cold)...
Done: 100 frames took 3.42s, mean framerate 29.24 FPS
Zooming (warm)...
Done: 100 frames took 2.15s, mean framerate 46.51 FPS
Metric Explanations¶
Metric |
Description |
Interpretation |
|---|---|---|
Conversion time |
Time to convert image to PPM |
Depends on format/size |
Tiling time |
Time to create tile pyramid |
Depends on megapixels |
Memory consumption |
Peak RAM during tiling |
Should scale with image size |
Cold cache FPS |
Initial zoom framerate |
Lower due to tile loading |
Warm cache FPS |
Repeat zoom framerate |
Higher due to caching |
Technical Documentation¶
Benchmark Phases¶
Phase 1: Initialization
1. Initialize TileManager
2. Create temporary tile storage directory
3. Create Qt application instance
4. Parse command-line arguments
5. Validate input file exists
Phase 2: Conversion
1. Create VipsConverter instance
2. Load image with libvips
3. Convert to 8-bit RGB/grayscale
4. Write to temporary PPM file
5. Measure conversion time
Phase 3: Metadata Extraction
1. Open PPM file in binary mode
2. Read PPM header (P6 format)
3. Extract width and height
4. Calculate megapixels
5. Close file
Phase 4: Tiling
1. Record baseline memory usage
2. Create PPMTiler instance
3. Execute tiling operation
4. Generate pyramidal tile structure
5. Record peak memory usage
6. Measure tiling time
Phase 5: Zoom Performance - Cold Cache
1. Create QZUI widget (800x600)
2. Create new Scene
3. Add TiledMediaObject
4. Fit object to viewport
5. Execute 100 zoom frames
6. Record time and calculate FPS
Phase 6: Zoom Performance - Warm Cache
1. Zoom back to original position
2. Execute same 100 zoom frames
3. Record time and calculate FPS
4. Tiles now cached in memory
Phase 7: Cleanup
1. Remove temporary tile directory
2. Remove temporary PPM file
3. Clean up Qt resources
Functions¶
mem(size: str = ‘rss’) -> int¶
Get the current process memory usage in kilobytes.
Parameters:
size: Memory type to measure'rss': Resident Set Size (default)'rsz': Resident + text memory'vsz': Virtual memory size
Returns: Memory usage in KB
Implementation: Uses ps command via os.popen
benchmark(filename: str, ppmfile: str) -> None¶
Execute the complete benchmark pipeline.
Parameters:
filename: Absolute path to source imageppmfile: Path to temporary PPM file
Process:
Measures baseline memory
Converts image to PPM
Extracts metadata
Tiles the image
Performs zoom tests
Reports all metrics
main() -> None¶
Entry point for the benchmark utility.
Responsibilities:
Initialize ZooUI systems
Parse command-line arguments
Validate input file
Create temporary files
Execute benchmark
Ensure cleanup on exit
Exit codes:
0: Success1: Error (missing file, invalid arguments)
Benchmark Constants¶
Constant |
Value |
Purpose |
|---|---|---|
Viewport width |
800 |
Display window width |
Viewport height |
600 |
Display window height |
Zoom amount |
5.0 |
Total zoom level change |
Frame count |
100 |
Frames per zoom test |
Tile size |
256 |
Default tile dimensions (via PPMTiler) |
PPM format |
P6 |
Binary PPM with maxval=255 |
Troubleshooting¶
Common Issues¶
“Error: No image file specified”
Provide image path:
python test/benchmarks/converterbenchmark.py path/to/image.jpg
“Error: File not found”
Check file path is correct and accessible.
Conversion fails
Verify libvips is installed:
conda install -c conda-forge libvipsCheck image format is supported by libvips
Ensure image file is not corrupted
Low framerate during zoom
Normal for:
Very large images (>50 megapixels)
First run (cold cache)
Systems with limited RAM
Memory consumption too high
Expected behavior:
Memory scales with image size
PPM format is uncompressed
Tiling requires temporary storage
Performance Tips¶
Use smaller images for quick tests
Warm cache performance represents typical usage
Compare different image formats
Monitor memory for memory leak detection
Interpreting Results¶
Good performance indicators:
Conversion time < 1s per megapixel
Tiling time < 3s per megapixel
Cold cache FPS > 20
Warm cache FPS > 30
Memory usage < 200MB for typical images
Performance bottlenecks:
Slow conversion: I/O or libvips issue
Slow tiling: CPU or I/O bound
Low cold FPS: Tile loading overhead
Low warm FPS: Rendering/GPU issue
High memory: Image size or leak
Batch Testing¶
Test multiple images:
#!/bin/bash
for img in zooui/data/*.jpg; do
echo "===== Testing $img ====="
python test/benchmarks/converterbenchmark.py "$img"
echo ""
done > benchmark_results.txt
Analyze results:
grep "megapixels" benchmark_results.txt
grep "FPS" benchmark_results.txt
grep "consuming" benchmark_results.txt
Implementation Details¶
Memory Tracking¶
Memory is measured at two points:
Baseline: Before tiling starts
Peak: After tiling completes
The difference approximates peak tiling memory consumption.
Note: Python doesn’t always return memory to the OS immediately, so the peak measurement represents approximate maximum usage during the tiling phase.
Zoom Test Methodology¶
Cold cache test:
First zoom operation after tiling
Tiles loaded from disk on demand
Measures I/O and rendering performance
Warm cache test:
Zoom after returning to original position
Tiles already in memory (TileCache)
Measures pure rendering performance
The performance difference between cold and warm cache tests indicates the effectiveness of the tile caching system.
PPM Format¶
The benchmark uses PPM (Portable Pixmap) as an intermediate format:
Advantages:
Simple uncompressed format
Fast to read during tiling
No codec overhead
Consistent format across tests
Disadvantages:
Large file size
Temporary storage required
Extra conversion step
Alternative formats may be added in future versions.
License¶
This benchmark is part of ZooUI and licensed under GNU GPLv2.
Copyright (C) 2009 David Roberts <d@vidr.cc>