前言:
同事在我的强烈推荐下购买了mac m1,13寸本,内存16g。😅
主机来了后开始配置环境,这也是烦躁的开始。像一些开发者工具的教程多是x86的,所以需要找到m1的适配教程。像brew工具,官方文档中就有标注m1的安装文档。
golang release里没有m1的版本,下载x86和arm版运行提示不可用,arm版直接报错,x86 golang二进制文件运行后一直hang住,没有任何提示。go官方博客中说1.16的版本会支持mac m1,但1.16的正式版是2021年的2月份,预计会提前先放出几版beta测试版。
但这也不能耽误人家工作呀,所以在网上一堆找方案,安装rosetta 2指令翻译器,然后重新编译golang。 具体编译golang过程我就不描述了,自己在网上搜吧。
Rosetta 2 的作用在于它通过指令翻译,可以让 ARM 平台的 macOS,直接运行绝大部分的 X86 软件。经过测试,以前常用的Mac x86软件多数可流程运行,也有一些各别的软件出现卡顿,比如karabiner、vimac、magnet等。vscode打开一瞬间像是hang住了,近2秒后才显示按钮布局。Rosetta 2的翻译还是有损耗,还是要等软件出m1适配版。
M1
借来玩了几天Mac M1,续航真是不错。除了前期遇到些问题,后面的应用体验跟x86差不多,平时办公和开发用到的软件也都可以流畅跑起来。除了docker和虚拟机不能x86系统之外,没什么影响。
我个人习惯使用Vim和vscode做为golang的代码编辑器,在M1下基本无问题,可以用。Goland支持当然也没有问题的。
最让人惊艳的就是散热,首先没有风扇的声音干扰太爽了。😁 就日常开发工作中,相比16寸 mac来说温度着实低些。
性能对比
全网都在鼓吹M1的性能,个人也相当的感兴趣,所以来一波简单粗暴、不可靠的压力测试。由于工作主要是基于golang开发,那么索性就测试github中较热门的benchmark。
下面是 mac m1 跟 mac 2019 16寸 i7的性能对比,分别做了5轮测试,且go test都限制为4个u,取各个平台的多次结果中较为平均的测试输出。压力测试项目用的这个 github.com/cornelk/go-benchmark 。
单单就测试耗时来说,m1是要比intel i7执行的快个14%。其实之前在两个mac上还做过 go_serialization_benchmarks 对比测试,m1耗时依然要比intel i7快12%左右。
mac m1
// mac m1
➜ go-benchmark git:(master) go test -bench=. -cpu=4
goos: darwin
goarch: amd64
pkg: github.com/cornelk/go-benchmark
BenchmarkAtomicInt32-4 334891 3539 ns/op
BenchmarkAtomicInt64-4 335152 3551 ns/op
BenchmarkAtomicUintptr-4 333566 3551 ns/op
BenchmarkDefer-4 3812605 315 ns/op
BenchmarkDeferNo-4 39484240 30.4 ns/op
BenchmarkGoroutineNew-4 10000 2556633 ns/op
BenchmarkGoroutineChan1RteCPU-4 10000 1370799 ns/op
BenchmarkGoroutineChan10RteCPU-4 10000 314480 ns/op
BenchmarkGoroutineChanCPURteCPU-4 10000 349479 ns/op
BenchmarkGoroutineChan100RteCPU-4 10000 150737 ns/op
BenchmarkGoroutineChan10000RteCPU-4 10000 159831 ns/op
BenchmarkGoroutineChan10Rte10-4 10000 320326 ns/op
BenchmarkGoroutineChan100Rte100-4 10000 253850 ns/op
BenchmarkGoroutineChan10000Rte10000-4 100 14479701 ns/op
BenchmarkHashing64MD5-4 5085172 250 ns/op 32.05 MB/s
BenchmarkHashing64SHA1-4 4629715 280 ns/op 28.53 MB/s
BenchmarkHashing64SHA256-4 3403106 354 ns/op 22.62 MB/s
BenchmarkHashing64SHA3B224-4 1511235 828 ns/op 9.66 MB/s
BenchmarkHashing64SHA3B256-4 1791288 765 ns/op 10.45 MB/s
BenchmarkHashing64RIPEMD160-4 2268490 529 ns/op 15.11 MB/s
BenchmarkHashing64Blake2B-4 1834280 707 ns/op 11.32 MB/s
BenchmarkHashing64Blake2BSimd-4 1937584 622 ns/op 12.86 MB/s
BenchmarkHashing64Murmur3-4 13321485 134 ns/op 59.49 MB/s
BenchmarkHashing64Murmur3Twmb-4 14345737 89.2 ns/op 89.73 MB/s
BenchmarkHashing64SipHash-4 18197372 85.3 ns/op 93.77 MB/s
BenchmarkHashing64XXHash-4 16784458 68.6 ns/op 116.63 MB/s
BenchmarkHashing64XXHashpier-4 17751019 84.3 ns/op 94.90 MB/s
BenchmarkHashing64HighwayHash-4 8982220 141 ns/op 56.64 MB/s
BenchmarkHashing32XXHashvova-4 18115452 65.8 ns/op 121.56 MB/s
BenchmarkHashing32XXHashpier-4 20853364 63.9 ns/op 125.20 MB/s
BenchmarkHashing32XXHash-4 13377956 98.3 ns/op 81.40 MB/s
BenchmarkHashing16XXHash-4 18447655 98.3 ns/op 81.36 MB/s
BenchmarkHashing8XXHash-4 18637072 68.7 ns/op 116.47 MB/s
BenchmarkValueUnsafePointer-4 53164192 22.3 ns/op
BenchmarkValueInterface-4 23458231 51.0 ns/op
BenchmarkReflect-4 2154338 555 ns/op
BenchmarkCast-4 18145458 66.1 ns/op
BenchmarkParameterPassedByPointer-4 12744134 92.5 ns/op
BenchmarkParameterPassedByValue-4 12046428 93.0 ns/op
BenchmarkSliceReadRange-4 54937928 21.7 ns/op
BenchmarkSliceReadForward-4 38538789 31.0 ns/op
BenchmarkSliceReadBackwards-4 33178958 36.0 ns/op
BenchmarkSliceReadLastItemFirst-4 38209411 31.4 ns/op
BenchmarkSliceFillByIndex-4 55740060 21.5 ns/op
BenchmarkSliceFillByIndexMake-4 56151075 26.9 ns/op
BenchmarkSliceFillMakeAppend-4 50314112 23.9 ns/op
BenchmarkSliceFillAppendNoMake-4 3114499 601 ns/op
BenchmarkSliceFillSmallMakeAppend-4 2443990 943 ns/op
BenchmarkFillLinkedListPushBack-4 619824 3911 ns/op
BenchmarkFillLinkedListPushFront-4 692575 2082 ns/op
BenchmarkSyncRWMutex-4 11111484 109 ns/op
BenchmarkSyncRWAtomic-4 10568516 113 ns/op
BenchmarkSyncRWAtomicGosched-4 13135485 91.8 ns/op
PASS
ok github.com/cornelk/go-benchmark 327.366s
mac intel i7 2019 16寸
// mac intel i7 2019 16寸
go test -bench=. -cpu=4
goos: darwin
goarch: amd64
pkg: github.com/cornelk/go-benchmark
BenchmarkAtomicInt32-4 309592 3785 ns/op
BenchmarkAtomicInt64-4 310130 3941 ns/op
BenchmarkAtomicUintptr-4 300513 3910 ns/op
BenchmarkDefer-4 3523532 328 ns/op
BenchmarkDeferNo-4 12503139 91.2 ns/op
BenchmarkGoroutineNew-4 10000 1820902 ns/op
BenchmarkGoroutineChan1RteCPU-4 10000 334300 ns/op
BenchmarkGoroutineChan10RteCPU-4 10000 220070 ns/op
BenchmarkGoroutineChanCPURteCPU-4 10000 204412 ns/op
BenchmarkGoroutineChan100RteCPU-4 10000 170625 ns/op
BenchmarkGoroutineChan10000RteCPU-4 10000 175718 ns/op
BenchmarkGoroutineChan10Rte10-4 10000 213040 ns/op
BenchmarkGoroutineChan100Rte100-4 10000 241891 ns/op
BenchmarkGoroutineChan10000Rte10000-4 100 19974006 ns/op
BenchmarkHashing64MD5-4 7532625 189 ns/op 42.33 MB/s
BenchmarkHashing64SHA1-4 5739030 186 ns/op 43.08 MB/s
BenchmarkHashing64SHA256-4 5050978 242 ns/op 33.01 MB/s
BenchmarkHashing64SHA3B224-4 1565026 901 ns/op 8.88 MB/s
BenchmarkHashing64SHA3B256-4 1690936 765 ns/op 10.45 MB/s
BenchmarkHashing64RIPEMD160-4 2395820 499 ns/op 16.02 MB/s
BenchmarkHashing64Blake2B-4 3472456 341 ns/op 23.49 MB/s
BenchmarkHashing64Blake2BSimd-4 3831225 340 ns/op 23.54 MB/s
BenchmarkHashing64Murmur3-4 18620680 64.3 ns/op 124.35 MB/s
BenchmarkHashing64Murmur3Twmb-4 19444350 63.5 ns/op 125.97 MB/s
BenchmarkHashing64SipHash-4 21155768 56.0 ns/op 142.77 MB/s
BenchmarkHashing64XXHash-4 31849977 51.3 ns/op 155.94 MB/s
BenchmarkHashing64XXHashpier-4 28207137 44.9 ns/op 178.29 MB/s
BenchmarkHashing64HighwayHash-4 13295876 92.0 ns/op 86.95 MB/s
BenchmarkHashing32XXHashvova-4 33265984 35.6 ns/op 224.68 MB/s
BenchmarkHashing32XXHashpier-4 31837797 37.0 ns/op 216.20 MB/s
BenchmarkHashing32XXHash-4 21471313 56.1 ns/op 142.53 MB/s
BenchmarkHashing16XXHash-4 21619030 55.0 ns/op 145.49 MB/s
BenchmarkHashing8XXHash-4 31882546 36.8 ns/op 217.49 MB/s
BenchmarkValueUnsafePointer-4 68717324 17.0 ns/op
BenchmarkValueInterface-4 30155677 38.9 ns/op
BenchmarkReflect-4 7165081 165 ns/op
BenchmarkCast-4 18640602 62.4 ns/op
BenchmarkParameterPassedByPointer-4 16345183 76.5 ns/op
BenchmarkParameterPassedByValue-4 10353224 120 ns/op
BenchmarkSliceReadRange-4 59617837 19.7 ns/op
BenchmarkSliceReadForward-4 18860553 61.5 ns/op
BenchmarkSliceReadBackwards-4 18713661 62.0 ns/op
BenchmarkSliceReadLastItemFirst-4 47315362 25.2 ns/op
BenchmarkSliceFillByIndex-4 72714333 16.3 ns/op
BenchmarkSliceFillByIndexMake-4 35459602 31.7 ns/op
BenchmarkSliceFillMakeAppend-4 41651622 28.7 ns/op
BenchmarkSliceFillAppendNoMake-4 3953661 671 ns/op
BenchmarkSliceFillSmallMakeAppend-4 2419346 430 ns/op
BenchmarkFillLinkedListPushBack-4 498951 2398 ns/op
BenchmarkFillLinkedListPushFront-4 503970 2394 ns/op
BenchmarkSyncRWMutex-4 19353127 61.8 ns/op
BenchmarkSyncRWAtomic-4 4075513 303 ns/op
BenchmarkSyncRWAtomicGosched-4 18012901 68.9 ns/op
PASS
ok github.com/cornelk/go-benchmark 375.283s
社区里其他人的测试
下面m1 vs intel的测试结果显得更加专业,文章的总结都表示M1的结果让人惊艳。但像crypto这类高度依赖指令集的代码,intel运行性能还是要高于M1处理器。
https://roland.zone/m1-go-benchmarks/
https://gohugo.io/news/hugo-macos-intel-vs-arm/
总结
Mac M1各方面还真是可以,性能压测数据也相对可观,但还是建议够买需求的朋友再稳稳。毕竟对于程序员来说,Mac是生产工具,而不是让你烦躁的发动机。要么等开发工具完美适配,要么等M2出世。
M1的发热控制的不错,在压测的几十分钟内,M1的发热要比16寸低一些。另外,长时间跑cpu密集运算,M1还是会有些降频的。