true_rng/PERFORMANCE_COMPARISON.md

3.0 KiB

Performance Comparison: C vs Python TrueRNG Implementation

Test Results

Final Corrected Results (After Fixing C Implementation)

C Version Performance

  • Execution time: 2.27 seconds
  • Data read: 1,048,576 bytes (1 MB - full dataset)
  • Read rate: 462.60 KB/s
  • Total bits processed: 8,388,608

Python Version Performance

  • Execution time: 2.27 seconds
  • Data read: 1,048,576 bytes (1 MB - full dataset)
  • Read rate: 462.47 KB/s
  • Total bits processed: 8,388,608

Performance Analysis

Speed Comparison

  • C version completed in: 2.27 seconds
  • Python version completed in: 2.27 seconds
  • Speed difference: Effectively identical for this I/O-bound task

Key Discoveries

  1. I/O Bottleneck: Both implementations perform identically because the task is I/O-bound, not CPU-bound. The serial communication at ~462 KB/s is the limiting factor.

  2. Initial Bug: The C version initially appeared faster (0.29 seconds) because it was incorrectly stopping early due to improper handling of partial reads from the serial device.

  3. Proper Serial Handling: The fix required implementing a read loop that continues until the full block size is received, matching Python's pyserial behavior.

  4. Identical Functionality: After correction, both versions process exactly the same amount of data with identical performance characteristics.

Technical Issues Resolved

  1. Partial Read Handling: C's read() system call can return fewer bytes than requested, requiring a loop to accumulate the full block size.

  2. Serial Port Configuration: Proper termios settings with VMIN=1, VTIME=0 for blocking reads.

  3. Error Handling: Distinguishing between partial reads (continue) vs. actual errors (abort).

Performance Implications

For I/O-bound tasks like serial communication:

  • Language choice has minimal impact on performance
  • Hardware communication speed dominates execution time
  • Proper protocol handling is more important than language efficiency

For CPU-intensive tasks:

  • C would likely show significant performance advantages
  • Bit manipulation, mathematical operations, and memory management favor compiled languages

Lessons Learned

  1. Measure Correctly: Initial performance differences were due to bugs, not language efficiency
  2. Understand Bottlenecks: Serial I/O at 462 KB/s dominates any CPU processing overhead
  3. Proper Equivalence: Both implementations must handle the same data volume for fair comparison
  4. System API Differences: C requires more explicit handling of partial I/O operations

Conclusion

For this I/O-bound TrueRNG application, both C and Python implementations achieve identical performance (2.27 seconds for 1MB). The bottleneck is the serial communication hardware, not the programming language. The C implementation provides equivalent functionality with more explicit control over system resources, while Python offers simpler, more abstract I/O handling through the pyserial library.