Apple's M1 Chip Benchmarks focused on the real-world programming
I'm pretty impressed by what I've seen with Apple's M1 Chip. It's really fast and powerful for essential everyday tasks, which include browsing the web, working with Intel-based apps, and using programming apps. Yes – the ecosystem is moving, and that may take time, but I think M1 is worth paying for it because of its phenomenal performance.
M1 is fast, and many benchmarks have proved its performance. However, I was curious about the performance of the programming languages using M1. So I decided to test it for the most popular workloads here.
Before you see the results, you should know that some benchmark suites are memory-intensive, some are CPU-intensive, and some have no benefits with multi-core processing because of its overhead or its difficulty for utilizing. It means that M1 can have an advantage over the desktop-class multi-core Ryzen processor even though the core count is lesser. Most importantly, I've focused more on real-world development performance testing rather than synthetic, production tests.
You can check the raw benchmark data here.
I add the following comment as of Dec 14: we care how fast our dev computer runs. the multi-core advantage of 3900X is useless for most of the benchmarks here that don't represent the real-world production performance at all but devs usually work on their laptops, desktops, etc most of the time so I think such real-world development performance benchmarks make it worthwhile though. of course, Ryzen 3900X will perform way better than M1 and Intel when it comes to production, mostly achieved by parallelizing.
Test Environment
- Apple M1: Mac Mini (16GB RAM), MacBook Air (8GB RAM) / macOS Big Sur 11.0.1 (All executables used for benchmarks are natively compiled for Apple Silicon.)
- Ryzen 3900X: ASRock Rack X570D4I-2T / 16GB DDR4-3200 x 2 / Ubuntu 20.04.1 LTS (tested after shutting down background tasks.) – You may wonder why I used 3900X instead of Ryzen 5000-series CPUs: Because I don't have it. And note that it doesn't make sense overclocking memory in a server motherboard.
- Intel i7-9750H: MacBook Pro 16" / 16GB / macOS Big Sur 11.0.1
- Intel i9-9880H: MacBook Pro 16" / 32GB / macOS Big Sur 11.0.1
Java Renaissance
Less is better
Renaissance is a modern, open, and diversified benchmark suite for the JVM, aimed at testing JIT compilers, garbage collectors, profilers, analyzers and other tools.
Since JVM is memory intensive, and memory is one of the largest bottlenecks for any Java applications, Apple M1 performance is stunning compared to Ryzen 3900X.
Java SciMark 2.0 (NIST)
Higher is better
SciMark 2.0 is a Java benchmark for scientific and numerical computing. It measures several computational kernels and reports a composite score in approximate Mflops (Millions of floating point operations per second).
Java DaCapo
Less is better
DaCapo benchmark suite is intended as a tool for Java benchmarking by the programming language, memory management and computer architecture communities. It consists of a set of open source, real world applications with non-trivial memory loads.
Python PyPerformance
Less is better
The pyperformance project is intended to be an authoritative source of benchmarks for all Python implementations. The focus is on real-world benchmarks, rather than synthetic benchmarks, using whole applications when possible.
Edit (Dec 15, at 01:55 KST): Fixed an issue I made a mistake that the actual unit is Seconds instead of Milliseconds in the last 'Total Seconds Elapsed' chart while I reuse the subtitles for the benchmark charts.
Go (golang.org/x/benchmarks)
Less is better
Note here that Go utilized all cores during this benchmark.
Go (golang-benchmarks)
(Unit: ns/op, Less is better)
Apple M1 (Mac Mini) | Apple M1 (MacBook Air) | Ryzen 3900X | Intel i7-9750H | |
BenchmarkBase64decode-24 | 68.65 | 69.77 | 137.1 | 103 |
BenchmarkBase64regex-24 | 12001 | 12250 | 32803 | 18255 |
BenchmarkNumberRegEx-24 | 7759 | 7931 | 23379 | 12206 |
BenchmarkFulltextRegEx-24 | 6388 | 6957 | 18627 | 10014 |
BenchmarkNumberParse-24 | 48.69 | 50.19 | 66.83 | 58 |
BenchmarkFulltextParse-24 | 726.3 | 729.7 | 933.2 | 839 |
BenchmarkConcatString-24 | 21949 | 22810 | 65498 | 43343 |
BenchmarkConcatBuffer-24 | 4.338 | 4.648 | 6.258 | 6.24 |
BenchmarkConcatBuilder-24 | 2.37 | 3.1 | 2.934 | 3.02 |
BenchmarkContains-24 | 5.007 | 5.204 | 7.467 | 7.94 |
BenchmarkContainsNot-24 | 6.322 | 6.406 | 7.693 | 8.9 |
BenchmarkContainsBytes-24 | 5.33 | 5.511 | 7.5 | 8.49 |
BenchmarkContainsBytesNot-24 | 6.57 | 6.773 | 9.188 | 10.3 |
BenchmarkCompileMatch-24 | 70.66 | 75.09 | 110.1 | 83 |
BenchmarkCompileMatchNot-24 | 31.65 | 32.08 | 62.42 | 42.1 |
BenchmarkMatch-24 | 800.2 | 804.6 | 2376 | 1313 |
BenchmarkMatchNot-24 | 758.1 | 779.3 | 2311 | 1262 |
BenchmarkForMap-24 | 18.89 | 18.92 | 20.37 | 20.6 |
BenchmarkRangeMap-24 | 47.66 | 48.59 | 53.25 | 56.7 |
BenchmarkRangeSlice-24 | 3.446 | 3.47 | 2.022 | 3.4 |
BenchmarkRangeSliceKey-24 | 4.072 | 4.121 | 2.906 | 3.15 |
BenchmarkAdler32-24 | 699 | 719.4 | 644.4 | 700 |
BenchmarkBlake2b256-24 | 2340 | 2415 | 2026 | 1932 |
BenchmarkBlake2b512-24 | 2343 | 2400 | 1985 | 1945 |
BenchmarkBlake3256-24 | 5753 | 5854 | 2489 | 2634 |
BenchmarkMMH3-24 | 374.3 | 383.2 | 294 | 377 |
BenchmarkCRC32-24 | 255.5 | 260.4 | 152.9 | 122 |
BenchmarkFnv128-24 | 4468 | 4502 | 5540 | 4210 |
BenchmarkMD5-24 | 3193 | 3211 | 2464 | 2534 |
BenchmarkSHA1-24 | 900.4 | 910.9 | 1898 | 1961 |
BenchmarkSHA256-24 | 913.5 | 927.6 | 4016 | 4525 |
BenchmarkSHA512-24 | 6999 | 7033 | 2883 | 3249 |
BenchmarkSHA3256-24 | 4213 | 4231 | 5957 | 5878 |
BenchmarkSHA3512-24 | 7329 | 7429 | 10233 | 10394 |
BenchmarkWhirlpool-24 | 32042 | 32624 | 35714 | 39205 |
BenchmarkMapStringKeys-24 | 68.14 | 70.66 | 87.62 | 100 |
BenchmarkMapIntKeys-24 | 43.6 | 48.49 | 42.51 | 60 |
BenchmarkJsonMarshal-24 | 1240 | 1261 | 2258 | 1720 |
BenchmarkJsonUnmarshal-24 | 4969 | 5102 | 9597 | 6484 |
BenchmarkMathInt8-24 | 0.3128 | 0.3235 | 0.2298 | 0.24 |
BenchmarkMathInt32-24 | 0.3145 | 0.3166 | 0.2324 | 0.239 |
BenchmarkMathInt64-24 | 0.3131 | 0.3158 | 0.2367 | 0.237 |
BenchmarkMathAtomicInt32-24 | 6.9 | 6.965 | 4.02 | 4.33 |
BenchmarkMathAtomicInt64-24 | 6.898 | 7.051 | 4.044 | 4.27 |
BenchmarkMathMutexInt-24 | 13.51 | 13.63 | 8.118 | 12.1 |
BenchmarkMathFloat32-24 | 0.3142 | 0.3142 | 0.2356 | 0.241 |
BenchmarkMathFloat64-24 | 0.313 | 0.3167 | 0.239 | 0.239 |
BenchmarkParseBool-24 | 1.427 | 1.43 | 0.2252 | 0.308 |
BenchmarkParseInt-24 | 10.97 | 11.15 | 11.84 | 13.5 |
BenchmarkParseFloat-24 | 64.52 | 65.74 | 90.89 | 87 |
BenchmarkMathRand-24 | 13.55 | 13.71 | 17.27 | 21.5 |
BenchmarkCryptoRand-24 | 106.6 | 112 | 1311 | 145 |
BenchmarkCryptoRandString-24 | 107.6 | 110.7 | 222 | 138 |
BenchmarkMatchString-24 | 4957 | 5148 | 13869 | 7616 |
BenchmarkMatchStringCompiled-24 | 475.5 | 496.2 | 499.2 | 464 |
BenchmarkMatchStringGolibs-24 | 479.3 | 496.3 | 491.3 | 480 |
SQLite Bench
Less is better
Redis
Higher is better
JavaScript Web Tooling Benchmark (v8)
Higher is better
V8 Web Tooling Benchmark is a benchmark suite designed to measure the JavaScript-related workloads commonly used by web developers, such as the core workloads in popular tools like Babel or TypeScript. The goal is to measure only the JavaScript performance aspect (which is affected by the JavaScript engine) and not measure I/O or other unrelated aspects.
See the in-depth analysis for a detailed description of the tests included in this benchmark suite.
JavaScript Octane 2.0
Higher is better
Webpack Build
Less is better
Target build project: antd-admin
Conclusion
It is very impressive to see the performance of Apple's M1 Chip. It performs better than the existing x86 does in such real-world benchmarks.
I don't feel like I need to say much: Just Buy M1 if you'd like to have a low-power, long-lasting, quiet, and performant dev machine.
M1은 사드세요 제발.
The results of MacBook Air (M1) and MacBook Pro 16" (i9-9880H) were provided by courtesy of Jinho Jeong (@zinozzino).