SlideShare a Scribd company logo
1 of 28
Ruby 的快与慢 
薄荷 谢文威 2014.11.01
介绍 
• 关于我 
• 谢文威,薄荷科技联合创始人,CTO,中国 
最早一批 Ruby 程序员 
• 关于薄荷 
• 中国最大最活跃的减肥网站和减肥 app,核 
心系统完全基于 Ruby 构建
要点 
• Ruby 的快:快速开发 
• 慢一点,适当控制开发节奏 
• Ruby 的慢:缓慢的性能 
• 如何获得高性能,高并发
简洁的 Ruby 
• 弱类型,duck type 
• 人性化、自然的语法 
• 纯粹的面向对象,致命的一致性
简洁的 Ruby 
class Sample 
attr_accessor :age, :name 
end 
sample = Sample.new 
sample.age = 18 
sample.name = 'Sample' 
puts "age: #{sample.age}. name: #{sample.name}" 
class Sample { 
private int age; 
private String name; 
public int getAge() { 
return this.age; 
} 
public void setAge(int value) { 
this.age = value; 
} 
public String getName() { 
return this.name; 
} 
public void setName(String value) { 
this.name = value; 
} 
public static void main(String[] argv) { 
Sample sample = new Sample(); 
sample.age = 18; 
sample.name = "Sample"; 
System.out.println("age: " + sample.age + " name: " + sample.name); 
} 
}
灵活的 Ruby 
• 强大的元编程 
• DSL 能力,代码块 
• 胶水语言,强大的粘合力 
• 万能的控制台
丰富的类库,性感的框架 
• Ruby on Rails 
• Rails 带来 web 开发领域的革命,现在依然 
引领潮流 
• Sinatra 
• 轻量,灵巧,高效
快乐编程 
• 为了乐趣编程 
• nice 的 Ruby 社区
少即是多 
每个程序员平均产生代码的行数是固定的, 
和语言无关,越有表现力的语言越有效率
为什么要慢一点 
• 一次典型的苦逼开发经历 
• 软件 = 编程 + 工程
单元测试 
• 单元测试是 Ruby 一种基础文 
化 
• 避免重复劳动 
• 促进更好的设计 
• 没必要百分百覆盖
代码走查 Code Review 
• 发现和解决问题同时进行 
• 监督和提醒 
• 促进交流分享 
• 降低人员流动风险
在离产生问题越近的地方发现问题,或者 
越早的发现问题,问题产生的代价越小
重构 Refactor,重建 
Rework 
• 技术负债如影随形,重构可 
以减轻负担 
• 允许你一开始犯错,通过重 
构依然能获得良好的设计 
• 如果实在无可救药,那就重 
建吧
如何搞垮一个 Rails 系统 
• 产品特性不断增加,变化 
• 没有及时重构,划分子系统
如何处理日益增加的复杂度 
• 模块化,让单个模块复杂度可控 
• 分离 gem,Rails engine,SOA 化
要快,但不要裸奔,欲速不达。 
适当控制节奏,让你拥有更高质量代码, 
更健壮的系统。 
适当控制节奏,让你拥有更高质量代码, 
更健壮的系统。
Ruby 常见的 3 个月经贴 
• 编程语言排行榜 
• Ruby 性能好差 
• Rails 性能好差
Ruby 为什么慢 
• 动态语言的劣势 
• 解析器 VM,垃圾收集 GC 
• 全局锁 GIL
适合 Ruby 的项目类型 
• 性能不敏感的应用 
• IO 密集型应用 
• 选择合适的并发模型
最简单优化:加硬件 
• 时间比钱更宝贵 
• 硬件很便宜,人很贵 
• 性能优化容易让人上瘾
准备工具 
• 识别性能瓶颈 profile 
• 效果评估 benchmark
最有效策略:缓存 
• 缓存是最有效的方法,立竿见影 
• 缓存的种类 
• 页面 
• 片段 
• 对象
异步任务队列 
• 避免长时间的处理阻塞普通请求 
• 常见的异步任务:发邮件,文档处理等 
• 工具:如DelayedJob,Resque,Sidekiq
粘合服务 
• 有些 Ruby 真不擅长做的事情就交给别 
人吧 
• 适合分离的服务 
• 数据分析统计处理 
• 全文检索服务 
• 图像处理...
提升性能和并发量方法 
• 加硬件 
• 并发模型 
• 利用缓存 
• 异步任务队列 
• 利用外部服务 
• GC调优,减少对象生成...
总结 
• Ruby 是一种简洁、灵活的语言,具有非常高的 
开发效率,但是要有意识的控制节奏,这会让 
你拥有更高质量的代码,更健壮的系统 
• Ruby 语言本身性能的确比较差,解析器 VM 
性能不高,高并发方面有诸多限制,当你认清 
并理解她的劣势,通过一些策略改进,依然可 
以获得很棒的性能
Thank you & QA 
• ruby-china: vincent 
• http://xiewenwei.github.com 
• 微信:booheeok

More Related Content

Similar to Ruby 的快与慢

The clean coder
The clean coderThe clean coder
The clean coderAndy Cheng
 
A brief introduction to Machine Learning
A brief introduction to Machine LearningA brief introduction to Machine Learning
A brief introduction to Machine LearningWen-Tien Chang
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Wen-Tien Chang
 
敏捷自动化测试中的教训 45min 中文
敏捷自动化测试中的教训 45min   中文敏捷自动化测试中的教训 45min   中文
敏捷自动化测试中的教训 45min 中文Shuyong Lin
 
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探美团点评技术团队
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合Qiangning Hong
 
我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術Li Hsuan Hung
 
Debug Your Kubernetes Network
Debug Your Kubernetes NetworkDebug Your Kubernetes Network
Debug Your Kubernetes NetworkHungWei Chiu
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?Kirk Chen
 
Simple Rule Agile China 2009
Simple Rule   Agile China 2009Simple Rule   Agile China 2009
Simple Rule Agile China 2009JohnnLi
 
李成银:前端编译平台
李成银:前端编译平台李成银:前端编译平台
李成银:前端编译平台taobao.com
 
前端编译平台
前端编译平台前端编译平台
前端编译平台Welefen Lee
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updatedPaul Chao
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨Wen-Tien Chang
 
2012 China 软件测试大会
2012 China 软件测试大会2012 China 软件测试大会
2012 China 软件测试大会mayun1688
 
Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Mu-Fan Teng
 
Running a Service in Production without Losing Your Sanity
Running a Service in Production without Losing Your SanityRunning a Service in Production without Losing Your Sanity
Running a Service in Production without Losing Your SanityPoga Po
 
廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰Paul Chao
 

Similar to Ruby 的快与慢 (20)

The clean coder
The clean coderThe clean coder
The clean coder
 
A brief introduction to Machine Learning
A brief introduction to Machine LearningA brief introduction to Machine Learning
A brief introduction to Machine Learning
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛
 
敏捷自动化测试中的教训 45min 中文
敏捷自动化测试中的教训 45min   中文敏捷自动化测试中的教训 45min   中文
敏捷自动化测试中的教训 45min 中文
 
W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探W3CTech美团react专场-React Native 初探
W3CTech美团react专场-React Native 初探
 
Ruby基础培训
Ruby基础培训Ruby基础培训
Ruby基础培训
 
RSpec & TDD Tutorial
RSpec & TDD TutorialRSpec & TDD Tutorial
RSpec & TDD Tutorial
 
合久必分,分久必合
合久必分,分久必合合久必分,分久必合
合久必分,分久必合
 
我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術我要活下來 - Ruby Junior 工程師的存活術
我要活下來 - Ruby Junior 工程師的存活術
 
Debug Your Kubernetes Network
Debug Your Kubernetes NetworkDebug Your Kubernetes Network
Debug Your Kubernetes Network
 
網站上線了,然後呢?
網站上線了,然後呢?網站上線了,然後呢?
網站上線了,然後呢?
 
Simple Rule Agile China 2009
Simple Rule   Agile China 2009Simple Rule   Agile China 2009
Simple Rule Agile China 2009
 
李成银:前端编译平台
李成银:前端编译平台李成银:前端编译平台
李成银:前端编译平台
 
前端编译平台
前端编译平台前端编译平台
前端编译平台
 
企業導入微服務實戰 - updated
企業導入微服務實戰 - updated企業導入微服務實戰 - updated
企業導入微服務實戰 - updated
 
⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨⼤語⾔模型 LLM 應⽤開發入⾨
⼤語⾔模型 LLM 應⽤開發入⾨
 
2012 China 软件测试大会
2012 China 软件测试大会2012 China 软件测试大会
2012 China 软件测试大会
 
Eventmachine Websocket 實戰
Eventmachine Websocket 實戰Eventmachine Websocket 實戰
Eventmachine Websocket 實戰
 
Running a Service in Production without Losing Your Sanity
Running a Service in Production without Losing Your SanityRunning a Service in Production without Losing Your Sanity
Running a Service in Production without Losing Your Sanity
 
廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰廣宣學堂: 企業導入微服務實戰
廣宣學堂: 企業導入微服務實戰
 

Ruby 的快与慢