发布会当天就订了港版 M1 Mac Mini 16G,其实上周就送到手里了,不过因为这周二开了 WOW 9.0 所以赶工工作加肝游戏就一直没去玩他
很多人问我 M1 Mac Mini 上跑 Ruby 效果咋样,抽空试了一下,记录一个流水账
WARNING: PHP is not recommended\nPHP is included in macOS for compatibility with legacy software.\nFuture versions of macOS will not include PHP.
Ruby、Python 3 和 Perl 没有我其实一直用 rvm 的,但是由于 rvm 在 macOS 上依赖 Hombrew,所以这里必须使用 rbenv 了。
需要使用安装脚本安装(而不是推荐的 Homebrew 安装)
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash
然后添加环境变量到 ~/.zshrc
export PATH="$PATH:$HOME/.rbenv/bin:$HOME/.rbenv/shims"
eval "$(rbenv init -)"
最后可以跑一下
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
看看有没有问题,有的话根据提示修一下
重开 shell
rbenv 实际是使用 ruby-build 这个 Ruby 的官方编译脚本来编译 Ruby 的, 我们之所以要 hack 是因为 Ruby 依赖 OpenSSL,需要在安装过程中编译 OpenSSL 之前把补丁打上去。
参考 https://github.com/rbenv/ruby-build/issues/1456#issuecomment-670051168 即可,FFI 的问题因为已经解决了,所以只需要这个评论的 OpenSSL 部分
ruby-build 的位置在 ~/.rbenv/plugins/ruby-build/bin/ruby-build
如果是安装 3.0.0-dev 版本的话,还需要 autoconf,由于 Homebrew 暂不可用的缘故,需要自己动手,丰衣足食了
curl http://mirror.team-cymru.com/gnu/autoconf/autoconf-latest.tar.gz --output autoconf-latest.tar.gz
tar zxvf autoconf-latest.tar.gz
cd autoconf-latest
./configure --prefix=$HOME/opt
make
make install
我不喜欢让自己编译的程序污染系统目录如
/usr
,所以我在自己的 Home 下创建了opt
目录,存放自己编译的程序,这里还需要把~/opt/bin
这个 PATH 添加到.zshrc
去,追加export PATH="$PATH:$HOME/opt/bin"
即可
万事俱备后 rbenv install 3.0.0-dev
即可,装好可以 rbenv global 3.0.0-dev
切换 ruby 相关命令到刚装好的版本去
注意,Apple M1 是 TDP 不超过 28w 的低功耗场景的 CPU
我们使用 Ruby 3x3 的测试项目 https://github.com/mame/optcarrot 来试试看 (该项目在 Ruby 2.0 时 FPS 为 20 左右,3x3 的目标即是做到 FPS 60)
不开 JIT 的情况
jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [arm64-darwin20]
fps: 62.54343294150454
checksum: 59662
Ruby 3x3 超额完成任务!
开了 JIT
jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes --opt
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [arm64-darwin20]
fps: 131.9125859620421
checksum: 59662
对比我的 2019 MBP 16 寸顶配 2.3 GHz 8-Core Intel Core i9,这是一款 TDP 45w 的 CPU
不开 JIT 的情况
jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [x86_64-darwin20]
jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [x86_64-darwin20]
fps: 46.387448578077674
checksum: 59662
Ruby 3x3 挑战失败
开了 JIT
jasl@localhost:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes --opt
ruby 3.0.0dev (2020-12-02T18:47:10Z master 51268be7fe) [x86_64-darwin20]
fps: 144.38348249123476
checksum: 59662
再对比 Dell Precision 7530 移动工作站,Xeon E-2186M 6 核至强、12M 高速缓存、2.90GHz 高达 4.60GHz Turbo、45 W、博锐,这款笔记本的特点就是有三倍 MBP 厚!散热和供电相比 MBP 更充分,根据评测 CPU 的 TDP 可以提升到 65W
不开 JIT 的情况
jasl@jasl-precision-7530:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes
ruby 3.0.0dev (2020-12-02T17:42:02Z master 9e73177d53) [x86_64-linux]
fps: 47.55813269580448
checksum: 59662
开了 JIT
jasl@jasl-precision-7530:~/Workspaces/Ruby/optcarrot on master$ ruby -v -Ilib -r./tools/shim bin/optcarrot --benchmark examples/Lan_Master.nes --opt
ruby 3.0.0dev (2020-12-02T17:42:02Z master 9e73177d53) [x86_64-linux]
fps: 146.70990328870877
checksum: 59662
由于 Apple M1 的资料太少,我只有一个浅显的结论,Apple M1 的设计对于解释型语言非常友好(但是是怎么做到的呢?)
个人感觉如果有 M1x,那么单核性能应该也就是这样差不多的水平了,首先 macOS 的 CPU 调度算法下能效核心和性能核心不能同时启用,所以理解成这是一个 4 核 CPU 似乎也没问题,这样下来核心数就跟 Intel、AMD 有差距了,此外外围太弱,PCIe 通道数量、MMIO bar 大小(树莓派和 M1 不支持 eGPU 的原因就是这个太小)、USB/雷电 接口数量、多显示器支持、内存大小等等...
不知道 Intel、AMD 和其他 ARM CPU 厂商会不会借鉴一些 M1 的设计理念,如果会的话,是不是解释型语言的性能表现普遍会有改善?
TODO:队长希望我测测 Sinatra 的表现,没送到嘴边的测试程序就懒得跑了。。。我要继续肝魔兽。。。
手头的应用没依赖什么特殊的 C 扩展 gem,有这么几点注意一下就可以完美运行起来了
--use-system-libraries
来安装gem "ffi", github: "felipecsl/ffi", submodules: true
官方发新版前,暂时用这个 fork