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 3900XIntel i7-9750H
BenchmarkBase64decode-2468.6569.77137.1103
BenchmarkBase64regex-2412001122503280318255
BenchmarkNumberRegEx-24775979312337912206
BenchmarkFulltextRegEx-24638869571862710014
BenchmarkNumberParse-2448.6950.1966.8358
BenchmarkFulltextParse-24726.3729.7933.2839
BenchmarkConcatString-2421949228106549843343
BenchmarkConcatBuffer-244.3384.6486.2586.24
BenchmarkConcatBuilder-242.373.12.9343.02
BenchmarkContains-245.0075.2047.4677.94
BenchmarkContainsNot-246.3226.4067.6938.9
BenchmarkContainsBytes-245.335.5117.58.49
BenchmarkContainsBytesNot-246.576.7739.18810.3
BenchmarkCompileMatch-2470.6675.09110.183
BenchmarkCompileMatchNot-2431.6532.0862.4242.1
BenchmarkMatch-24800.2804.623761313
BenchmarkMatchNot-24758.1779.323111262
BenchmarkForMap-2418.8918.9220.3720.6
BenchmarkRangeMap-2447.6648.5953.2556.7
BenchmarkRangeSlice-243.4463.472.0223.4
BenchmarkRangeSliceKey-244.0724.1212.9063.15
BenchmarkAdler32-24699719.4644.4700
BenchmarkBlake2b256-242340241520261932
BenchmarkBlake2b512-242343240019851945
BenchmarkBlake3256-245753585424892634
BenchmarkMMH3-24374.3383.2294377
BenchmarkCRC32-24255.5260.4152.9122
BenchmarkFnv128-244468450255404210
BenchmarkMD5-243193321124642534
BenchmarkSHA1-24900.4910.918981961
BenchmarkSHA256-24913.5927.640164525
BenchmarkSHA512-246999703328833249
BenchmarkSHA3256-244213423159575878
BenchmarkSHA3512-24732974291023310394
BenchmarkWhirlpool-2432042326243571439205
BenchmarkMapStringKeys-2468.1470.6687.62100
BenchmarkMapIntKeys-2443.648.4942.5160
BenchmarkJsonMarshal-241240126122581720
BenchmarkJsonUnmarshal-244969510295976484
BenchmarkMathInt8-240.31280.32350.22980.24
BenchmarkMathInt32-240.31450.31660.23240.239
BenchmarkMathInt64-240.31310.31580.23670.237
BenchmarkMathAtomicInt32-246.96.9654.024.33
BenchmarkMathAtomicInt64-246.8987.0514.0444.27
BenchmarkMathMutexInt-2413.5113.638.11812.1
BenchmarkMathFloat32-240.31420.31420.23560.241
BenchmarkMathFloat64-240.3130.31670.2390.239
BenchmarkParseBool-241.4271.430.22520.308
BenchmarkParseInt-2410.9711.1511.8413.5
BenchmarkParseFloat-2464.5265.7490.8987
BenchmarkMathRand-2413.5513.7117.2721.5
BenchmarkCryptoRand-24106.61121311145
BenchmarkCryptoRandString-24107.6110.7222138
BenchmarkMatchString-2449575148138697616
BenchmarkMatchStringCompiled-24475.5496.2499.2464
BenchmarkMatchStringGolibs-24479.3496.3491.3480

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).