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

上个月参加了一场西雅图当地的线下 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= // 分配给 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 开发中的读取速度,且十分安全。

如何让 Xcode 在读写上提速100倍?的更多相关文章

  1. Xcode 在读写上提速100倍

  2. 转载:四两拨千斤:借助Spark GraphX将QQ千亿关系链计算提速20倍

    四两拨千斤:借助Spark GraphX将QQ千亿关系链计算提速20倍 时间 2016-07-22 16:57:00 炼数成金 相似文章 (5) 原文  http://www.dataguru.cn/ ...

  3. 优化临时表使用,SQL语句性能提升100倍

    [问题现象] 线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用率达到100%, 执行时间长达7s左右.SQL语句如下:SELECT DISTINCT g.*, cp. ...

  4. 转--优化临时表使用,SQL语句性能提升100倍

    转自:http://www.51testing.com/html/01/n-867201-2.html [问题现象] 线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用 ...

  5. 王家林 Spark公开课大讲坛第一期:Spark把云计算大数据速度提高100倍以上

    王家林 Spark公开课大讲坛第一期:Spark把云计算大数据速度提高100倍以上 http://edu.51cto.com/lesson/id-30815.html Spark实战高手之路 系列书籍 ...

  6. MySQL 5.7 优化SQL提升100倍执行效率的深度思考(GO)

    系统环境:微软云Linux DS12系列.Centos6.5 .MySQL 5.7.10.生产环境,step1,step2是案例,精彩的剖析部分在step3,step4. 1.慢sql语句大概需要13 ...

  7. 修改一行SQL代码 性能提升了100倍

    在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用 EXPLAN ANAL ...

  8. 一行代码让python的运行速度提高100倍

    python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. “一行代码让python的运行速度提高100倍”这绝不是哗众取宠的 ...

  9. 提速1000倍,预测延迟少于1ms,百度飞桨发布基于ERNIE的语义理解开发套件

    提速1000倍,预测延迟少于1ms,百度飞桨发布基于ERNIE的语义理解开发套件 11月5日,在『WAVE Summit+』2019 深度学习开发者秋季峰会上,百度对外发布基于 ERNIE 的语义理解 ...

随机推荐

  1. 关于js中的回调函数callback

    来源于:http://www.jianshu.com/p/6bc353e5f7a3 前言 其实我一直很困惑关于js 中的callback,困惑的原因是,学习中这块看的资料少,但是平时又经常见,偶尔复制 ...

  2. javascript基础 思维导图2

    来源于:http://www.cnblogs.com/xianyulaodi/p/5886128.html 1.javascript数据类型 2.javascript数组 3.javascript运算 ...

  3. 一个正则表达式,只含有汉字、数字、字母、下划线,下划线位置不限【Z】

    1.一个正则表达式,只含有汉字.数字.字母.下划线不能以下划线开头和结尾: ^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$ 其中: ^ 与字符串开始的地方匹配 ( ...

  4. mysql中日志的配置与分析

    默认情况下,如果日志没有配置,则只记录错误日志,记录到syslog,配置文件 /etc/mysql/conf.d/mysqld_safe_syslog.cnf (ubuntu下) [mysqld_sa ...

  5. [转载]Error starting Sun's native2ascii:

    原文地址:Error starting Sun's native2ascii:作者:大一吧浪 Error starting Sun's native2ascii: at org.apache.tool ...

  6. Ubuntu 13.04下安装WPS for Linux

    [日期:2013-06-03]   有人说Linux下不是有open office 和libre office么?是啊,可是将windows下的doc文档或者ppt放到Libreoffice上打开的时 ...

  7. Python中的两种路径

    Java中有两种路径,一种是操作系统的路径path,另一种是类路径classpath. Python中也是如此,一种是操作系统环境变量中的path,另一种是PYTHONPATH. 当import xx ...

  8. libevent终于编译通过了

    在网上找了个例子,其实libevent本身带了很多测试用例,不过这是第一次编译成功,尼玛 各种高性能IO库都是在linux下的,win32果断被bs了,还好有libevent对win32支持的比较好. ...

  9. 谈谈选用技术的原则,技术学习方法技巧,阅读代码的技巧及其它 MSF的一点心得

    谈谈技术原则,技术学习方法,代码阅读及其它(正文) 这篇文章是前一阵在水木BBS上和别人讨论中偶自己发言的摘编,是偶这几年开发过程完全经验式的总结.完全个人经验,供批判. 一.选用技术的原则 比较规范 ...

  10. 指尖下的js ——多触式web前端开发之二:处理简单手势(转)

    这篇文章将描述多触式网页开发中对手势(Gesture)事件的处理.     水果设备中的Gesture,广义的说包括手指点击(click),轻拂(flick),双击(double-click),两只手 ...