This table shows the hardware and software details for each platform in the benchmarks. Note that the Intel parts list their base clock rate but they turbo boost too much higher rates when thermally possible.
Platform | HW | CPU | macOS |
---|---|---|---|
M4-Max | MacBookPro-16 | Apple M4 Max | 15.5 |
M1-Max | MacBookPro-16 | Apple M1 Max | 15.5 |
i9 | Late 2019 MacBookPro-16 |
Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz | 15.5 |
i7 | Late 2013 MacBookPro-15 |
Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz | 11.7.10 |
Each test was run on the computer when it was at idle stable temperature such that it could instantly burst to full clock rate. The benchmark was run over a fixed set of test files that were repeated in a number of directories in order to get the total to be reasonably useful. This is a synthetic test set rather than a personal music library, which would be both much larger (taking significantly longer to run) and would change over time as new content is added or existing content is re-encoded.
Number of MP3 Files | Total Size of MP3 files (bytes) |
---|---|
3,116 | 21,412,291,984 |
This metric represents the actual elapsed time from start to finish. It includes all computation, I/O operations, and scheduling delays. Lower values indicate faster overall completion.
Platform | Version | Wall Clock Time (seconds)[shorter is better] | |
---|---|---|---|
M4-Max | rust | 33.17 |
|
|
M4-Max | c | 42.14 |
|
|
M4-Max | rust-x86 | 45.52 |
|
|
M4-Max | swift-x86 | 51.20 |
|
|
M4-Max | swift | 56.56 |
|
|
M4-Max | c-x86 | 56.78 |
|
|
M1-Max | rust | 71.84 |
|
|
M1-Max | rust-x86 | 91.94 |
|
|
M1-Max | c | 94.62 |
|
|
M1-Max | swift-x86 | 102.02 |
|
|
i9 | swift-x86 | 104.59 |
|
|
i9 | rust-x86 | 116.92 |
|
|
M1-Max | c-x86 | 125.28 |
|
|
M1-Max | swift | 134.03 |
|
|
i9 | c-x86 | 169.18 |
|
|
i7 | rust-x86 | 233.82 |
|
|
i7 | swift-x86 | 234.26 |
|
|
i7 | c-x86 | 380.84 |
|
|
This metric represents the total CPU time spent in user-mode code summed across all cores. It will exceed wall clock time on multi-core systems. Lower values indicate less total CPU usage.
Platform | Version | User CPU Time (seconds)[shorter is better] | |
---|---|---|---|
M4-Max | rust | 506.54 |
|
|
M4-Max | c | 656.71 |
|
|
M1-Max | rust | 699.45 |
|
|
M4-Max | rust-x86 | 704.26 |
|
|
M4-Max | swift-x86 | 762.12 |
|
|
M1-Max | rust-x86 | 866.67 |
|
|
M4-Max | c-x86 | 876.39 |
|
|
M4-Max | swift | 880.25 |
|
|
M1-Max | c | 921.21 |
|
|
M1-Max | swift-x86 | 965.71 |
|
|
M1-Max | c-x86 | 1210.13 |
|
|
M1-Max | swift | 1291.98 |
|
|
i9 | swift-x86 | 1600.08 |
|
|
i7 | swift-x86 | 1809.88 |
|
|
i9 | rust-x86 | 1814.10 |
|
|
i7 | rust-x86 | 1831.12 |
|
|
i9 | c-x86 | 2639.31 |
|
|
i7 | c-x86 | 2991.32 |
|
|
This metric shows the maximum amount of physical memory used by the process. Lower values indicate more memory-efficient code.
Platform | Version | Maximum Resident Set Size (MB)[shorter is better] | |
---|---|---|---|
i7 | rust-x86 | 7.08 |
|
|
M1-Max | rust | 21.33 |
|
|
M1-Max | rust-x86 | 22.23 |
|
|
i9 | rust-x86 | 31.35 |
|
|
M4-Max | rust-x86 | 33.66 |
|
|
M4-Max | rust | 34.28 |
|
|
i7 | c-x86 | 120.46 |
|
|
M1-Max | c-x86 | 437.74 |
|
|
M1-Max | c | 442.89 |
|
|
M4-Max | c-x86 | 703.58 |
|
|
M4-Max | c | 736.98 |
|
|
i9 | c-x86 | 744.14 |
|
|
M1-Max | swift | 1560.16 |
|
|
i9 | swift-x86 | 2425.97 |
|
|
M4-Max | swift-x86 | 3050.23 |
|
|
i7 | swift-x86 | 3103.19 |
|
|
M1-Max | swift-x86 | 3165.58 |
|
|
M4-Max | swift | 3202.09 |
|
|
This metric counts the total number of CPU instructions executed to complete the task. Lower values can indicate less computational work.
Platform | Version | Instructions Retired (billions)[shorter is better] | |
---|---|---|---|
M1-Max | rust | 7546.22 |
|
|
M4-Max | rust | 7548.15 |
|
|
i7 | swift-x86 | 7585.56 |
|
|
i9 | swift-x86 | 7715.32 |
|
|
i9 | rust-x86 | 7978.48 |
|
|
i7 | rust-x86 | 7983.54 |
|
|
M1-Max | c | 11450.33 |
|
|
M4-Max | c | 11453.92 |
|
|
M4-Max | rust-x86 | 11941.89 |
|
|
M1-Max | rust-x86 | 11951.00 |
|
|
i7 | c-x86 | 12543.85 |
|
|
i9 | c-x86 | 12552.53 |
|
|
M4-Max | swift | 12693.00 |
|
|
M1-Max | swift | 12699.92 |
|
|
M4-Max | swift-x86 | 12738.43 |
|
|
M1-Max | swift-x86 | 12745.50 |
|
|
M4-Max | c-x86 | 20017.47 |
|
|
M1-Max | c-x86 | 20020.31 |
|
|
This metric counts the total number of CPU cycles used to complete the task. Lower values indicate less computational work or better CPU efficiency.
Platform | Version | CPU Cycles (billions)[shorter is better] | |
---|---|---|---|
M4-Max | rust | 1827.85 |
|
|
M1-Max | rust | 2014.34 |
|
|
M4-Max | c | 2316.65 |
|
|
M4-Max | rust-x86 | 2488.38 |
|
|
M1-Max | rust-x86 | 2510.44 |
|
|
M1-Max | c | 2646.46 |
|
|
M4-Max | swift-x86 | 2689.17 |
|
|
M1-Max | swift-x86 | 2787.87 |
|
|
M4-Max | c-x86 | 3032.01 |
|
|
M4-Max | swift | 3143.68 |
|
|
M1-Max | c-x86 | 3487.63 |
|
|
M1-Max | swift | 3726.11 |
|
|
i7 | swift-x86 | 5147.90 |
|
|
i9 | swift-x86 | 5171.81 |
|
|
i7 | rust-x86 | 5679.25 |
|
|
i9 | rust-x86 | 5882.56 |
|
|
i9 | c-x86 | 8719.05 |
|
|
i7 | c-x86 | 9201.45 |
|
|
This metric is calculated as User Time / Real Time. It reflects how well the program utilizes multiple CPU cores. Higher values indicate better utilization and typically correlate with the number of CPU cores available. The M1/M4 have efficiency and performance cores, which may affect this value.
Platform | Version | Parallelism Factor (ratio)[higher is better] | |
---|---|---|---|
i9 | c-x86 | 15.60 |
|
|
M4-Max | c | 15.58 |
|
|
M4-Max | swift | 15.56 |
|
|
i9 | rust-x86 | 15.52 |
|
|
M4-Max | rust-x86 | 15.47 |
|
|
M4-Max | c-x86 | 15.43 |
|
|
i9 | swift-x86 | 15.30 |
|
|
M4-Max | rust | 15.27 |
|
|
M4-Max | swift-x86 | 14.89 |
|
|
M1-Max | rust | 9.74 |
|
|
M1-Max | c | 9.74 |
|
|
M1-Max | c-x86 | 9.66 |
|
|
M1-Max | swift | 9.64 |
|
|
M1-Max | swift-x86 | 9.47 |
|
|
M1-Max | rust-x86 | 9.43 |
|
|
i7 | c-x86 | 7.85 |
|
|
i7 | rust-x86 | 7.83 |
|
|
i7 | swift-x86 | 7.73 |
|
|
This metric is calculated as Cycles Elapsed / User Time. It shows the average CPU frequency during execution. Higher values indicate the CPU is running at higher clock speeds. Thermal throttling may reduce this value in longer-running programs.
Platform | Version | Effective Clock Rate (GHz)[higher is better] | |
---|---|---|---|
M4-Max | rust | 3.61 |
|
|
M4-Max | swift | 3.57 |
|
|
M4-Max | rust-x86 | 3.53 |
|
|
M4-Max | swift-x86 | 3.53 |
|
|
M4-Max | c | 3.53 |
|
|
M4-Max | c-x86 | 3.46 |
|
|
i9 | c-x86 | 3.30 |
|
|
i9 | rust-x86 | 3.24 |
|
|
i9 | swift-x86 | 3.23 |
|
|
i7 | rust-x86 | 3.10 |
|
|
i7 | c-x86 | 3.08 |
|
|
M1-Max | rust-x86 | 2.90 |
|
|
M1-Max | swift-x86 | 2.89 |
|
|
M1-Max | swift | 2.88 |
|
|
M1-Max | c-x86 | 2.88 |
|
|
M1-Max | rust | 2.88 |
|
|
M1-Max | c | 2.87 |
|
|
i7 | swift-x86 | 2.84 |
|
|
This metric is calculated as Instructions Retired / Cycles Elapsed. Higher values indicate better CPU efficiency, with more instructions executed per cycle. Modern CPU architectures with better instruction-level parallelism achieve higher IPC values.
Platform | Version | Instructions Per Cycle (ratio)[higher is better] | |
---|---|---|---|
M4-Max | c-x86 | 6.60 |
|
|
M1-Max | c-x86 | 5.74 |
|
|
M4-Max | c | 4.94 |
|
|
M4-Max | rust-x86 | 4.80 |
|
|
M1-Max | rust-x86 | 4.76 |
|
|
M4-Max | swift-x86 | 4.74 |
|
|
M1-Max | swift-x86 | 4.57 |
|
|
M1-Max | c | 4.33 |
|
|
M4-Max | rust | 4.13 |
|
|
M4-Max | swift | 4.04 |
|
|
M1-Max | rust | 3.75 |
|
|
M1-Max | swift | 3.41 |
|
|
i9 | swift-x86 | 1.49 |
|
|
i7 | swift-x86 | 1.47 |
|
|
i9 | c-x86 | 1.44 |
|
|
i7 | rust-x86 | 1.41 |
|
|
i7 | c-x86 | 1.36 |
|
|
i9 | rust-x86 | 1.36 |
|
|
This metric shows the peak memory usage of the process. It is influenced by two main factors: (1) code efficiency in handling ‘live’ data and streaming processing, and (2) degree of parallelism. Higher parallelism typically requires more memory as multiple instances of the same code run concurrently. This explains why the M4-Max uses more memory than the M1-Max (due to higher parallelism) and why the i7 uses significantly less memory (due to fewer cores).
Platform | Version | Peak Memory Footprint (MB)[shorter is better] | |
---|---|---|---|
i7 | rust-x86 | 6.00 |
|
|
M1-Max | rust-x86 | 20.49 |
|
|
M1-Max | rust | 20.50 |
|
|
i9 | rust-x86 | 26.94 |
|
|
M4-Max | rust | 30.11 |
|
|
M4-Max | rust-x86 | 32.71 |
|
|
i7 | c-x86 | 77.16 |
|
|
M1-Max | c | 88.42 |
|
|
i9 | c-x86 | 143.21 |
|
|
M4-Max | c | 160.03 |
|
|
M1-Max | c-x86 | 437.63 |
|
|
M4-Max | c-x86 | 704.61 |
|
|
M1-Max | swift | 1531.82 |
|
|
i9 | swift-x86 | 2377.90 |
|
|
M4-Max | swift-x86 | 3054.65 |
|
|
i7 | swift-x86 | 3097.75 |
|
|
M4-Max | swift | 3164.89 |
|
|
M1-Max | swift-x86 | 3169.61 |
|
|
This metric shows peak memory footprint divided by parallelism factor, indicating how efficiently memory is used regardless of the degree of parallelism. Lower values suggest better memory efficiency per unit of parallelism. This helps compare memory usage more fairly across platforms with different core counts.
Platform | Version | Memory Efficiency (MB/unit)[shorter is better] | |
---|---|---|---|
i7 | rust-x86 | 0.77 |
|
|
i9 | rust-x86 | 1.74 |
|
|
M4-Max | rust | 1.97 |
|
|
M1-Max | rust | 2.11 |
|
|
M4-Max | rust-x86 | 2.11 |
|
|
M1-Max | rust-x86 | 2.17 |
|
|
M1-Max | c | 9.08 |
|
|
i9 | c-x86 | 9.18 |
|
|
i7 | c-x86 | 9.82 |
|
|
M4-Max | c | 10.27 |
|
|
M1-Max | c-x86 | 45.31 |
|
|
M4-Max | c-x86 | 45.65 |
|
|
i9 | swift-x86 | 155.43 |
|
|
M1-Max | swift | 158.91 |
|
|
M4-Max | swift | 203.36 |
|
|
M4-Max | swift-x86 | 205.21 |
|
|
M1-Max | swift-x86 | 334.85 |
|
|
i7 | swift-x86 | 400.95 |
|
|
This metric shows the total size of PNG files produced by the benchmark. Swift produces significantly larger output files due to its dependence on macOS media libraries, which don’t support generating indexed 4-color (2-bit) images. In contrast, the Rust and C implementations use custom PNG encoding that creates more compact indexed-color images.
Platform | Version | Output Size (KB)[shorter is better] | |
---|---|---|---|
M4-Max | c | 12728.74 |
|
|
M4-Max | c-x86 | 12728.74 |
|
|
M1-Max | c | 12728.74 |
|
|
M1-Max | c-x86 | 12728.74 |
|
|
i9 | c-x86 | 12728.74 |
|
|
i7 | c-x86 | 12728.74 |
|
|
M4-Max | rust | 13221.70 |
|
|
M4-Max | rust-x86 | 13221.70 |
|
|
M1-Max | rust | 13221.70 |
|
|
M1-Max | rust-x86 | 13221.70 |
|
|
i9 | rust-x86 | 13221.70 |
|
|
i7 | rust-x86 | 13221.70 |
|
|
M4-Max | swift | 45318.93 |
|
|
M1-Max | swift | 45318.93 |
|
|
M4-Max | swift-x86 | 45321.22 |
|
|
M1-Max | swift-x86 | 45321.22 |
|
|
i9 | swift-x86 | 45321.22 |
|
|
i7 | swift-x86 | 45321.22 |
|
|
This shows the file size of the compiled program executable. The Swift executables should have been significantly smaller due to leveraging macOS system libraries for media and image processing but it is the C executables that are the most compact, utilizing only a few shared C, math, and threading libraries while natively implementing all of the media code. In contrast, the Rust executables were expected to be larger because they are fully statically linked and don’t offload functionality to shared libraries (other than kernel OS calls).
Platform | Version | Executable Size (KB)[shorter is better] | |
---|---|---|---|
M4-Max | c-x86 | 87.60 |
|
|
M1-Max | c-x86 | 87.60 |
|
|
i9 | c-x86 | 87.60 |
|
|
i7 | c-x86 | 87.60 |
|
|
M4-Max | c | 100.43 |
|
|
M1-Max | c | 100.43 |
|
|
M4-Max | swift | 726.68 |
|
|
M1-Max | swift | 726.68 |
|
|
M4-Max | swift-x86 | 752.45 |
|
|
M1-Max | swift-x86 | 752.45 |
|
|
i9 | swift-x86 | 752.45 |
|
|
i7 | swift-x86 | 752.45 |
|
|
M4-Max | rust | 1444.90 |
|
|
M1-Max | rust | 1444.90 |
|
|
M4-Max | rust-x86 | 1601.80 |
|
|
M1-Max | rust-x86 | 1601.80 |
|
|
i9 | rust-x86 | 1601.80 |
|
|
i7 | rust-x86 | 1601.80 |
|
|