前言:

同事在我的强烈推荐下购买了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测试版。

golang mac m1 编译

但这也不能耽误人家工作呀,所以在网上一堆找方案,安装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处理器。

总结

Mac M1各方面还真是可以,性能压测数据也相对可观,但还是建议够买需求的朋友再稳稳。毕竟对于程序员来说,Mac是生产工具,而不是让你烦躁的发动机。要么等开发工具完美适配,要么等M2出世。

M1的发热控制的不错,在压测的几十分钟内,M1的发热要比16寸低一些。另外,长时间跑cpu密集运算,M1还是会有些降频的。