美文网首页iOS 实用技术iOS 好文iOS相关
如何让 Xcode 在读写上提速100倍?

如何让 Xcode 在读写上提速100倍?

作者: 故胤道长 | 来源:发表于2017-04-24 02:21 被阅读11538次

上个月参加了一场西雅图当地的线下 iOS 开发者聚会。Jeff Szuhay 作为一个有20+年开发经验的资深程序员,跟我讲了一套提高 iOS 开发效率的方法。相比于其他程序员在 App 启动时间、架构优化方面的经验,老爷子 Jeff 的优化基于硬件层面,匠心独运,极客风十足。以下是他的经验分享和我个人的实测。

问题来源

我们都知道 Xcode 在运行或编译时,会有大量的读写操作。例如从硬盘中调用图片,我们会这么操作:

let image = UIImage(named: "imageName")

这时候 Xcode 就会去电脑的硬盘中去找到图片,完成读写操作。类似的操作还有存取文件等等。如果这类读取数量比较少,那么无伤大雅,但是一旦多起来,尤其是大项目在后期产生了大量的 DerivedData 存在硬盘上,Xcode 在编译时就会花大量时间去硬盘(Disk)上完成读写这些数据的操作。更不幸的是有时候还会遇到硬盘故障等问题。

解决思路

正所谓“哪里需要优化,哪里就需要程序员”,Jeff 在这个时候作为一名白衣骑士登场了。多年的计算机研究让他对整个计算机架构非常熟悉。下图是他展示的计算机结构简图。

计算机结构简图

此图简洁明了得说明了计算机的基本架构。左上角是计算机的大脑,CPU,负责核心计算和处理工作;右上角是内存(RAM),用来运行程序并与 CPU 进行数据交流;中间的线是总线,负责各个模块之间传递信息和信号;图下侧是基本的 System IO。

再回来看我们的问题:Xcode 现在是在 RAM 中运行,然后到 Storage 中读写数据,数据接着再传回 RAM。这种方式有两个瓶颈:

  • Storage 速度很慢。即使是最先进的 SSD,其速度也比 RAM 慢了400倍。也就是无论你怎么在软件层优化,其速度也无法突破 SSD 的瓶颈;
  • 数据要不停的在各个模块之间传递。传递过程中亦有延时和无谓的时间消耗。

针对以上两个瓶颈,Jeff 认为,如果我们可以让所有的读写操作都在内存(RAM)中完成,那么必然能大幅提高 Xcode 的工作效率。问题是,怎么实现?

实现方法

方法的思路很简单,大概可以分两步:

  1. 配置 RAM。在内存中专门开出一块让 Xcode 使用。
  2. 连接 Xcode。让 Xcode 连接到我们开辟出来的专属内存空间。

下面就是见证奇迹的时刻。

第一步, 创建 .sh 文件。代码如下。

#!/bin/bash
// 设置 ram disk 的名称
RAMDISK=”ramdisk”

// 设置 ram disk 的大小,这里是 1024 MB
SIZE=1024  

// 分配给 ramdisk 相应大小的空间
diskutil erasevolume HFS+ $RAMDISK `hdiutil attach -nomount ram://$[SIZE*2048]` 

// 打开元数据索引,如果你使用 Xcode 内部的调试工具这是必须的。因为调试工具使用元数据索引来查询符号连接
mdutil -i on /Volumes/$RAMDISK

第二步, 运行 .sh 文件。在命令行中敲下。

之后你会发现你会多出一个叫 ramdisk 的内存空间,有大概 1 GB 大小。

第三步,连接 Xcode。Xcode -> Preferences -> Locations -> Locations Tab,配置 DerivedData。

Advanced... 也要配置成下图所示

以上就是全部步骤。这时候你就可以享受飞一般的开发了。现在 Project 中所有文件都在内存中,相比于 SSD,理论上是要快上一个数量级。

注意事项

  • 合理分配内存空间。我这里分配了 1GB 的内存当硬盘使,是因为我电脑本身有 16GB 内存空间。假如你电脑内存只有 4GB,我不建议你使用这个方法,或者建议只分配 256M 空间给 Xcode。总之,注意内存不足或溢出的情况。

  • 只把 DerivedData 放在 Ram Disk 中。为了极限速度,你当然可以把 App 相关所有的文件都放在内存空间中。但是要知道,我们创造的 Ram Disk 本质是内存,当关机或重启的时候,在 Ram Disk 中的数据是会丢失的。而 DerivedData 是可以重新生成的,所以放在 Ram Disk 中可以最大限度的提高 Xcode 开发中的读取速度,且十分安全。

参考

相关文章

网友评论

  • 2020攀登者:sh文件中有个错误,需要将ramdisk的双引号改成英文的;在Xcode配置中,没有双引号。正确:/Volumes/ramdisk/DerivedData
  • 阿呆少爷:我感觉编译是CPU密集型的任务,瓶颈在于CPU而不在内存,所以我觉得这个改进对于加快编译速度作用应该不大。
  • 92aaf53fd4df:我发现 新ramdisk一下就满了,然后就报I/O方面的问题
    92aaf53fd4df:分配了1024的空间
  • BillHsieh:其实SSD和RAM读写速度提升很难以量级去估量了因为单位原本就很微小,目前最首要的问题 还是能够真正去解决编译的速度
  • 简而简之:全部步骤弄完,然后项目点什么都是fail,能不能给个解决方案
    故胤道长:@简而简之 改回默认设置,clean,build
  • 巩固2022:bash-3.2$
    是什么情况
  • Link913:效果其实差距不大...
  • 飞翔de小苹果:只有4GB内存的小伙伴路过
  • ismilesky:道长,使用真机测试的时候,编译运行成功后,断掉数据线再连接,再次编译老是显示编译失败,是什么原因。必须重启Xcode重新运行才可以。。。
  • ismilesky:为毛编译都编译不通过啊??
  • 童冀:实测也是变化不大,不过思路不错,特别适合内存大的机器了
  • EdenMa:4G内存试了下256....毫无波动
  • 显卡84du:道长,代码中 RAMDISK=”ramdisk”
    这里面的引号写错了,应该是英文的才对,文中直接复制过来是中文的。
  • xiaoliuTX_iOS:道长我测试了下,并没有感觉快多少啊。顶多就两三秒的样子
    故胤道长:@xiaoliuTX_iOS 这跟derived data有关啊
  • linkoubian:实验环境:MacBook Pro (15-inch, 2016), 2.7 GHz Intel Core i7, 16 GB 2133 MHz LPDDR3
    优化效果:从 64.306s 到 62.334s

    所以,尽信书不如无书!
    linkoubian:@故胤道长 500 M,特大的 Derived Data 也不适合 Ram Disk 了吧
    故胤道长:@linkoubian 你app的derived data 大小才是应该关注的变量啊
  • 没梦想的咸鱼2:瞄了一眼 项目DerivedData的大小 13.63G :scream:
    HEALTHYbaby:应该是有很多个工程吧?
  • 果子酱123::joy: 是我的错觉么,我怎么没觉得快呢
  • 十一岁的加重:SSD就没必要用这个方法了,像我用的这种老式的机械硬盘使用了下,
    不知道是不是心理作用,好像是快了不少
  • 秋雨无痕:好文章:scream:
  • 鬼晓晓:现在用iRamdisk软件可以直接设置Xcode Derived Data 类型的虚拟盘了
    鬼晓晓:@显卡84du 芝士就是力量嘛
    显卡84du:官方卖好几十美元,太黑了。。。。
  • 坏坏ooooo:项目跑不起来了
  • LittleSakana:设置的小的话(比如512)完全不够用,写文件错误,编译失败
  • 9dfbae8dcfcf::+1:

    运行脚本前别忘了用下面命令加读写权限:
    chmod 777 ramdisk.sh
  • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/oidiij 欢迎点赞支持!
    欢迎订阅《iOS相关》https://toutiao.io/subject/183
  • 愿景力:请问 SIZE * 2048. 这个2048是什么东西?
  • Haley_Wong::+1: ,注明出处,转载一波
  • 郭大猿:按照教程配置好之后,报错,项目跑不起来了
    error: codesign_allocate: can't write output file: /Volumes/”ramdisk”/DerivedData/XJUnionPay-ftrzmsxlxrpexjdosieaoyhiyyxi/Build/Products/Debug-iphonesimulator/XJUnionPay.app/XJUnionPay.cstemp (No space left on device)
    显卡84du:最后一句说的很清楚了,没空间了
    郭大猿:可用空间显示为0kb。。
  • gakaki:其实提升并不大 最多就快2 3秒 编译哦
    还有有个软件iramdisk 傻瓜设置的 大家自己看吧 另外可以safarari
    windows上同样vs 可以用 prixmo cache 或者 ramdisk来做...dangran prixmo cache这种要比mac的ramdisk方法要高级不少 机械硬盘也能提速
  • cuagain:项目跑一次 DerivedData直接2g+了:disappointed_relieved:
  • Mr_疯不觉:我想问下,我怎么还原……
    郭大猿:推出新建的盘,xcode设置改为默认就好了
  • TongRy:很实用啊,感谢道长的分享
  • ducks:重启 就没有了
  • 陈晨XX:Android studio有方式么?
  • b23127bfd49f:非常 Nice~~
  • lancely:在公司的非 Retina iMac 试了一下,好像确实快了不少👍
  • TimberTang:厉害 :+1:
  • 十一岁的加重:/bin/bash: RAMDISK=”ramdisk”: No such file or directory
  • 一只二货:命令行:diskutil erasevolume HFS+ 'RAM Disk' `hdiutil attach -nomount ram://2097152, 貌似也是一样的
  • Lonely__M:厉害
  • 绍清_shao:道长的分享很给力
  • 張無忌:不错:+1:确实得动计算机原理才想得出如此办法
  • 帅气的华子:不明觉厉,我也来试试飞一般的感觉

本文标题:如何让 Xcode 在读写上提速100倍?

本文链接:https://www.haomeiwen.com/subject/vfdcottx.html