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

dafd5073 7年前
   <p style="text-align: center;"><img src="https://simg.open-open.com/show/bc386aebf48b71228f98e865d21db219.png"></p>    <p>上个月参加了一场西雅图当地的线下 iOS 开发者聚会。Jeff Szuhay 作为一个有20+年开发经验的资深程序员,跟我讲了一套提高 iOS 开发效率的方法。相比于其他程序员在 App 启动时间、架构优化方面的经验,老爷子 Jeff 的优化基于硬件层面,匠心独运,极客风十足。以下是他的经验分享和我个人的实测。</p>    <h2>问题来源</h2>    <p>我们都知道 Xcode 在运行或编译时,会有大量的读写操作。例如从硬盘中调用图片,我们会这么操作:</p>    <pre>  letimage = UIImage(named: "imageName")  </pre>    <p>这时候 Xcode 就会去电脑的硬盘中去找到图片,完成读写操作。类似的操作还有存取文件等等。如果这类读取数量比较少,那么无伤大雅,但是一旦多起来,尤其是大项目在后期产生了大量的 DerivedData 存在硬盘上,Xcode 在编译时就会花大量时间去硬盘(Disk)上完成读写这些数据的操作。更不幸的是有时候还会遇到硬盘故障等问题。</p>    <h2>解决思路</h2>    <p>正所谓“哪里需要优化,哪里就需要程序员”,Jeff 在这个时候作为一名白衣骑士登场了。多年的计算机研究让他对整个计算机架构非常熟悉。下图是他展示的计算机结构简图。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c763177c0150f579ca23b84399ed2700.png"></p>    <p>计算机结构简图</p>    <p>此图简洁明了得说明了计算机的基本架构。左上角是计算机的大脑,CPU,负责核心计算和处理工作;右上角是内存(RAM),用来运行程序并与 CPU 进行数据交流;中间的线是总线,负责各个模块之间传递信息和信号;图下侧是基本的 System IO。</p>    <p>再回来看我们的问题:Xcode 现在是在 RAM 中运行,然后到 Storage 中读写数据,数据接着再传回 RAM。这种方式有两个瓶颈:</p>    <ul>     <li>Storage 速度很慢。即使是最先进的 SSD,其速度也比 RAM 慢了400倍。也就是无论你怎么在软件层优化,其速度也无法突破 SSD 的瓶颈;</li>     <li>数据要不停的在各个模块之间传递。传递过程中亦有延时和无谓的时间消耗。</li>    </ul>    <p>针对以上两个瓶颈,Jeff 认为,如果我们可以让所有的读写操作都在内存(RAM)中完成,那么必然能大幅提高 Xcode 的工作效率。问题是,怎么实现?</p>    <h2>实现方法</h2>    <p>方法的思路很简单,大概可以分两步:</p>    <ol>     <li>配置 RAM。在内存中专门开出一块让 Xcode 使用。</li>     <li>连接 Xcode。让 Xcode 连接到我们开辟出来的专属内存空间。</li>    </ol>    <p>下面就是见证奇迹的时刻。</p>    <p>第一步, <strong>创建 .sh 文件</strong> 。代码如下。</p>    <pre>  #!/bin/bash  RAMDISK=”ramdisk”  SIZE=1024        #size in MB for ramdisk.  diskutilerasevolumeHFS+ $RAMDISK \      `hdiutilattach -nomountram://$[SIZE*2048]`  </pre>    <p>第二步, <strong>运行 .sh 文件</strong> 。在命令行中敲下。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/3bacee4aa6e9bfe3db029134fe45bedf.png"></p>    <p>之后你会发现你会多出一个叫 ramdisk 的内存空间,有大概 1 GB 大小。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/fc3e9e1da802a8aa221cc2d06d0a9562.png"></p>    <p>第三步,连接 Xcode。Xcode -> Preferences -> Locations -> Locations Tab,配置 DerivedData。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/2c430cb30bb2ad4d9665b245ae10750a.png"></p>    <p>Advanced… 也要配置成下图所示</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/c59338d35b39f5d7abbd8af4ebf86f9f.png"></p>    <p>以上就是全部步骤。这时候你就可以享受飞一般的开发了。现在 Project 中所有文件都在内存中,相比于 SSD,理论上是要快上一个数量级。</p>    <h2>注意事项</h2>    <ul>     <li><strong>合理分配内存空间</strong> 。我这里分配了 1GB 的内存当硬盘使,是因为我电脑本身有 16GB 内存空间。假如你电脑内存只有 4GB,我不建议你使用这个方法,或者建议只分配 256M 空间给 Xcode。总之, <strong>注意内存不足或溢出</strong> 的情况。</li>     <li><strong>只把 DerivedData 放在 Ram Disk 中</strong> 。为了极限速度,你当然可以把 App 相关所有的文件都放在内存空间中。但是要知道,我们创造的 Ram Disk 本质是内存,当关机或重启的时候,在 Ram Disk 中的数据是会丢失的。而 DerivedData 是可以重新生成的,所以放在 Ram Disk 中可以最大限度的提高 Xcode 开发中的读取速度,且十分安全。</li>    </ul>    <h2>参考</h2>    <ul>     <li><a href="/misc/goto?guid=4959748192122503949" rel="nofollow,noindex">Performance Considerations for macOS/iOS Development in the “New Frontier”</a></li>     <li><a href="/misc/goto?guid=4959748192202923272" rel="nofollow,noindex">Cache In Your Pocket: Use a RAM disk for Xcode</a></li>    </ul>    <p> </p>    <p> </p>    <p>来自:http://ios.jobbole.com/93171/</p>    <p> </p>