64 lines
3.0 KiB
Markdown
64 lines
3.0 KiB
Markdown
# 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. |