- 浏览: 100152 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sevk:
require 'digest'
Digest::MD5. ...
ruby中MD5和SHA1加密方法 -
rogerer:
paginate 这个是哪里来的?
Ruby 多文件上传并写入数据库 -
joinall:
都没有取到手机号码
request.env -
mengwade:
清除cookie
引发CGI::Session::CookieStore::CookieOverflow异常 -
stmadman:
如何解决呢?
引发CGI::Session::CookieStore::CookieOverflow异常
优化ActionController
使用components会对ActionController的性能造成较大的影响,我的建议是没有特别的理由,不要使用components,因为调用render_component会引发一个新的请求处理循环。大部分情况下,component都可以使用helper 或者partials代替。
优化ActionView
对于每一个请求,Rails都会创建一个controller和view实例,并会将controller的action中创建的实例变量通过 instance_variable_get和instance_variable_set传递给view,因此不要在action中创建view中用不到的实例变量。
优化helper
首先是pluralize,可以看一下pluralize的实现,如果不给出最后一个参数,它会创建一个Inflector实例,因此不要写pluralize(n, ‘post’),应该写成pluralize(n, ‘post’, ‘posts’)。
其次是link_to与url_for,由于需要查找路由策略,因此link_to与url_for可以说是最慢的helper方法,没有特别的需要,不要使用这两个函数。
<a href=“/recipe/edit/<%=#{recipe.id}%>”class=“edit_link”>
look here for something interesting
</a>
会比下面这段同样结果的代码快许多:
<%= link to “look here for something interesting” ,{ :controller => “recipe”, :action => edit, :id => @recipe.id },{ :class => “ edit link” } %>。
优化ActiveRecord
访问AR对象的关联对象相对而言会比较慢,可以使用:include提前获取关联对象
class Article
belongs to :author
end
article.find ( :all, :include => :author)
或者使用piggy backing指定要获取的关联对象的某些字段,关于piggy backing的介绍请参看[2]
class Article
piggy back :author name, :from => :author, :attributes => [:name]
end
article = Article . find ( :all, :piggy => :author)
puts article .author name
另外需要注意的是,从数据库中获取的字段值一般来说都是String类型,因此每次访问可能都需要进行类型转换,如果你在一个请求处理过程中需要进行多次转换,那么最好对转换后的值进行缓存。
还有,根据我对一个应用的分析,大约有30%的时间花在了字符处理上,另外30%时间花在了垃圾收集,还有10%用于URL识别,因此在数据库中缓存格式化后的字段可以大大减小字符处理的开销。
优化Ruby代码
前面,我们的优化策略主要是针对Rails框架本身进行,现在我们将精力集中到Ruby语言本身上来。
首先,Ruby语言中的各种元素由于算法的不同,访问时间也各不相等,比如局部变量采用数组索引,在解析时进行顶问,因此访问代价总是O(1),而实例变量和和方法调用由于使用Hash访问,因此只能保持理论上的O(1)访问,也就是没有冲突的情况下,同时调用方法时如果不能在子类找到这个方法,则还需要沿继承树向上回溯查找。
因此,应该尽量避免不必要的多态继承,同时应该尽量使用局部变量,比如下面这段代码的效率就不如修改后的高:
def submit to remote(name, value, options = {})
options[ :with ] ||= ’Form.serialize( this .form)’
options[:html ] ||= {}
options[:html ][ :type ] = ’button’
options[:html ][nclick ] = ”#{remote function(options)}; return false ; ”
options[:html ][ :name] = name
options[:html ][ :value] = value
tag(”input” , options[:html ], false )
end
修改后:
def submit to remote(name, value, options = {})
options[ :with ] ||= ’Form.serialize( this .form)’
html = (options[:html ] ||= {})
html[:type ] = ’button’
html[:onclick ] = ”#{remote function(options)}; return false ; ”
html[:name] = name
html[:value] = value
tag(”input” , html, false )
end
其次,对于经常用到的数据,应该进行缓存,避免每次用到时再进行计算,比如:
def capital_letters
( ”A” .. ”Z” ). to a
end
写成下面这样会更好:
def capital letters
@capital letters ||= ( “A” .. “Z” ). to a
end
当然对于上面这种情况,如果所有类需要的数据都相同,那么完全可以将它定义成class级变量:
@@capital letters = (“A” .. “Z” ). to a
def capital letters
@@capital letters
end
当然,除了效率也要注意优美,下面这段代码就不够优美:
def actions
unless @actions
# do something complicated and costly to determine action’s value
@actions = expr
end
@actions
end
改成这样会更好一些:
def actions
@actions ||=
begin
# do something complicated and costly to determine action’s value
expr
end
end
另外,使用常量对效率也有一定提升。
def validate_find_options (options)
options.assert valid keys( :conditions , :include , :joins , :limit ,ffset ,
rder , :select , :readonly, :group, :from )
end
上面这段代码进行如下修改会更好一些:
VALID FIND OPTIONS = [
:conditions , :include , :joins ,:limit ,:offset ,:order , :select ,:readonly,:group,:from ]
def validate find options (options)
options.assert valid keys(VALID FIND OPTIONS)
end
同时,应该尽可能的使用局部变量。
sql << ” GROUP BY #{options[:group]} ” if options[:group]
上面这种方式明显不如以下两种:
if opts = options[:group]
sql << ” GROUP BY #{opts} ”
end
opts = options[:group] and sql << ” GROUP BY #{opts} ”
当然,能够写成这样是最好的:
sql << ” GROUP BY #{opts} ” if opts = options[:group]
但是目前版本的Ruby还不支持这样做。
另外,还有一些小技巧:
logger.debug ”args: #{hash.keys.sort.join ( ’ ’ )}” if logger
这段代码的问题在于,不管logger.level是否为DEBUG,hash.keys.sort.join(’ ’) 都会被执行,因此,应该写成这样:
logger.debug ”args: #{hash.keys.sort.join ( ’ ’ )}” if logger && logger.debug?
还有就是关于ObjectSpace.each_object的,在production模式最好不要使用这个方法。
ObjectSpace.each object(Class) {|c| f(c) }
事实上这跟下面的代码是相等的:
ObjectSpace.each object {|o| o.is a?(Class) && f(o) }
它会对堆上的每一个对象都进行检查,这会对性能造成极大损耗。
使用components会对ActionController的性能造成较大的影响,我的建议是没有特别的理由,不要使用components,因为调用render_component会引发一个新的请求处理循环。大部分情况下,component都可以使用helper 或者partials代替。
优化ActionView
对于每一个请求,Rails都会创建一个controller和view实例,并会将controller的action中创建的实例变量通过 instance_variable_get和instance_variable_set传递给view,因此不要在action中创建view中用不到的实例变量。
优化helper
首先是pluralize,可以看一下pluralize的实现,如果不给出最后一个参数,它会创建一个Inflector实例,因此不要写pluralize(n, ‘post’),应该写成pluralize(n, ‘post’, ‘posts’)。
其次是link_to与url_for,由于需要查找路由策略,因此link_to与url_for可以说是最慢的helper方法,没有特别的需要,不要使用这两个函数。
<a href=“/recipe/edit/<%=#{recipe.id}%>”class=“edit_link”>
look here for something interesting
</a>
会比下面这段同样结果的代码快许多:
<%= link to “look here for something interesting” ,{ :controller => “recipe”, :action => edit, :id => @recipe.id },{ :class => “ edit link” } %>。
优化ActiveRecord
访问AR对象的关联对象相对而言会比较慢,可以使用:include提前获取关联对象
class Article
belongs to :author
end
article.find ( :all, :include => :author)
或者使用piggy backing指定要获取的关联对象的某些字段,关于piggy backing的介绍请参看[2]
class Article
piggy back :author name, :from => :author, :attributes => [:name]
end
article = Article . find ( :all, :piggy => :author)
puts article .author name
另外需要注意的是,从数据库中获取的字段值一般来说都是String类型,因此每次访问可能都需要进行类型转换,如果你在一个请求处理过程中需要进行多次转换,那么最好对转换后的值进行缓存。
还有,根据我对一个应用的分析,大约有30%的时间花在了字符处理上,另外30%时间花在了垃圾收集,还有10%用于URL识别,因此在数据库中缓存格式化后的字段可以大大减小字符处理的开销。
优化Ruby代码
前面,我们的优化策略主要是针对Rails框架本身进行,现在我们将精力集中到Ruby语言本身上来。
首先,Ruby语言中的各种元素由于算法的不同,访问时间也各不相等,比如局部变量采用数组索引,在解析时进行顶问,因此访问代价总是O(1),而实例变量和和方法调用由于使用Hash访问,因此只能保持理论上的O(1)访问,也就是没有冲突的情况下,同时调用方法时如果不能在子类找到这个方法,则还需要沿继承树向上回溯查找。
因此,应该尽量避免不必要的多态继承,同时应该尽量使用局部变量,比如下面这段代码的效率就不如修改后的高:
def submit to remote(name, value, options = {})
options[ :with ] ||= ’Form.serialize( this .form)’
options[:html ] ||= {}
options[:html ][ :type ] = ’button’
options[:html ][nclick ] = ”#{remote function(options)}; return false ; ”
options[:html ][ :name] = name
options[:html ][ :value] = value
tag(”input” , options[:html ], false )
end
修改后:
def submit to remote(name, value, options = {})
options[ :with ] ||= ’Form.serialize( this .form)’
html = (options[:html ] ||= {})
html[:type ] = ’button’
html[:onclick ] = ”#{remote function(options)}; return false ; ”
html[:name] = name
html[:value] = value
tag(”input” , html, false )
end
其次,对于经常用到的数据,应该进行缓存,避免每次用到时再进行计算,比如:
def capital_letters
( ”A” .. ”Z” ). to a
end
写成下面这样会更好:
def capital letters
@capital letters ||= ( “A” .. “Z” ). to a
end
当然对于上面这种情况,如果所有类需要的数据都相同,那么完全可以将它定义成class级变量:
@@capital letters = (“A” .. “Z” ). to a
def capital letters
@@capital letters
end
当然,除了效率也要注意优美,下面这段代码就不够优美:
def actions
unless @actions
# do something complicated and costly to determine action’s value
@actions = expr
end
@actions
end
改成这样会更好一些:
def actions
@actions ||=
begin
# do something complicated and costly to determine action’s value
expr
end
end
另外,使用常量对效率也有一定提升。
def validate_find_options (options)
options.assert valid keys( :conditions , :include , :joins , :limit ,ffset ,
rder , :select , :readonly, :group, :from )
end
上面这段代码进行如下修改会更好一些:
VALID FIND OPTIONS = [
:conditions , :include , :joins ,:limit ,:offset ,:order , :select ,:readonly,:group,:from ]
def validate find options (options)
options.assert valid keys(VALID FIND OPTIONS)
end
同时,应该尽可能的使用局部变量。
sql << ” GROUP BY #{options[:group]} ” if options[:group]
上面这种方式明显不如以下两种:
if opts = options[:group]
sql << ” GROUP BY #{opts} ”
end
opts = options[:group] and sql << ” GROUP BY #{opts} ”
当然,能够写成这样是最好的:
sql << ” GROUP BY #{opts} ” if opts = options[:group]
但是目前版本的Ruby还不支持这样做。
另外,还有一些小技巧:
logger.debug ”args: #{hash.keys.sort.join ( ’ ’ )}” if logger
这段代码的问题在于,不管logger.level是否为DEBUG,hash.keys.sort.join(’ ’) 都会被执行,因此,应该写成这样:
logger.debug ”args: #{hash.keys.sort.join ( ’ ’ )}” if logger && logger.debug?
还有就是关于ObjectSpace.each_object的,在production模式最好不要使用这个方法。
ObjectSpace.each object(Class) {|c| f(c) }
事实上这跟下面的代码是相等的:
ObjectSpace.each object {|o| o.is a?(Class) && f(o) }
它会对堆上的每一个对象都进行检查,这会对性能造成极大损耗。
发表评论
-
ror集成FCKEditor
2009-04-16 14:04 940FCKEditor是一个开源的,功能强大的富文本编辑器,在官方 ... -
Rails里如何结合ExceptionNotification配置gmail账户发邮件
2009-02-19 15:24 16061,安装ExceptionNotification ruby ... -
request.env
2009-02-13 11:10 3023@client_ip = request.env[" ... -
Ruby 多文件上传并写入数据库
2009-02-05 17:47 2245一:建立表(用Ruby的 scri ... -
引发CGI::Session::CookieStore::CookieOverflow异常
2009-02-03 15:41 2271在rails2.1开始默认使用cookie保存session后 ... -
ActiveRecord(一)--基础
2009-01-05 15:31 1951这一篇主要讲:如何连接到数据库,如何映射表,以及如何处理 ... -
rails版本的改变(二)——rails的介绍
2009-01-05 15:13 1606Rails 2.2 新特性提示 10月24日,Rails发 ... -
rails版本的改变(一)——rails的介绍
2009-01-05 12:10 1136Rails框架首次提出是在2004年7月,它的研发者是26岁的 ... -
rails
2008-12-29 16:35 1851Rails框架首次提出是在2004年7月,它的研发者是26岁的 ... -
windows搭建ruby on rails 的开发环境
2008-12-29 16:23 13931,安装ruby解释器 在 http://rubyfo ... -
用ror开发的无忧换书网,大家看看给点意见
2008-11-12 18:39 1669自己用ror开发的一个用于发布二手书买卖信息的网站(www.5 ... -
校内api
2008-10-17 16:06 2040controller: @user = params[:x ... -
安装ruby的数据库适配器
2008-08-20 15:04 1290源码安装数据库mysql之后启动项目报错:Can't conn ... -
ruby中MD5和SHA1加密方法
2008-08-14 13:55 9195MD5加密方式: require 'md5' puts MD5 ... -
ruby/rails中的中文处理
2008-08-13 16:35 1302ruby/rails中的中文处理 原文:http://www ... -
rails2.0下的file_column和imagick
2008-05-11 11:15 1789由于rails2.0下的file_column 和rma ... -
分页插件will_paginate(提供下载包)
2008-01-10 13:35 2365分页插件(will_paginate)是非常好用的,但 ... -
rails插件列表
2008-01-08 15:43 3304rails的插件列表 http://agilewebdeve ... -
ruport中文乱码
2008-01-08 13:41 1140def index table = Ruport ... -
ruport应用
2008-01-07 17:16 15081, install: gem install ruport ...
相关推荐
8. **Testing**: 对于Rails应用,测试是必不可少的一部分。本书会教读者如何使用RSpec、Cucumber和FactoryGirl等工具进行单元测试、集成测试和行为驱动开发测试。 9. **Deployment**: 最后,书中还会介绍如何将开发...
这些知识对于深入理解和优化Rails应用至关重要。 #### 5. Models, Views, and Controllers(模型、视图和控制器) MVC是Rails的核心架构之一,这一章节将详细介绍这三个组件的作用和相互关系。模型负责与数据库...
8. **安全与性能**:如何防止SQL注入、XSS攻击,以及优化Rails应用以提高性能。 9. **部署**:如何将Rails应用部署到如Heroku或AWS等云平台,以及配置Nginx或Apache作为前端服务器。 通过学习《应用Rails进行敏捷...
其次,尽管Rails在提高开发效率方面做得很好,但它在性能优化方面可能不如某些竞争对手,对于大型或性能要求极高的应用,可能需要额外的优化工作。 Rails框架的成功原因之一在于它采用了“一站式”解决方案。不像...
- **集成Facebook API**:详细讲解如何将Facebook API集成到Rails应用中,实现用户登录、数据同步等功能。 ##### 3. 成功策略:营销与优化 - **增长黑客**:分享关于如何利用增长黑客技巧增加应用用户数量的方法。...
- **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:读者已经具备一定的Ruby编程基础,并对Web开发有一定的了解。 #### 二、什么是Rails...
10. **部署与优化**:讲解如何将Rails应用部署到各种服务器环境(如Heroku、AWS),并提供了性能调优的建议。 《Rails 3 in Action》不仅覆盖了Rails 3.1的核心概念和技术,还涵盖了从开发到部署的全过程,是Rails...
综上所述,Rails Recipes是一本全面而深入的Rails指南,它不仅可以作为程序员解决具体问题的工具书,还可以作为提升 Rails 开发技能的进阶读物。无论是Rails新手还是经验丰富的开发者,都能从中获益,学会如何像大厨...
8. **部署**:将Rails应用部署到生产环境,如Heroku或AWS。 9. **性能优化**:缓存策略、数据库优化和其他提高应用性能的方法。 10. **错误和调试**:如何追踪和修复常见的Rails问题。 通过这本书,读者不仅可以...
3. **易于维护**:良好的设计模式和清晰的代码结构使得Rails应用易于维护和扩展。 4. **强大的生态系统**:Rails拥有庞大的社区支持和丰富的插件资源,这为开发者提供了极大的便利。 #### 四、读者群体与应用场景 ...
- **代码优化技巧**:提供了多种方法来优化Rails应用程序的性能,如缓存策略、数据库查询优化等。 - **测试与调试**:讲解了如何有效地进行单元测试、集成测试及端到端测试,并提供了调试技巧。 - **安全性**:讨论...
1. **创建应用**:首先按照常规方式创建您的Rails应用,您会发现新创建的应用中包含一个名为`vendor`的目录。 2. **下载并解压代码**:访问指定链接(http://media.pragprog.com/titles/rails2/code/rails.zip),...
- **HAS_ONE支持增强**:虽然文档未详细说明HAS_ONE支持的具体增强内容,但可以推测Rails 2.1对此进行了优化或增加了新的功能选项。 综上所述,《RAILS2.1的中文版资料》为Ruby on Rails开发者提供了丰富的资源和...
Rails API 4.0.0是Ruby on Rails框架的一个版本,专门针对构建应用程序接口(APIs)进行了优化。Ruby on Rails是由David Heinemeier Hansson创建的开源Web应用框架,遵循MVC(模型-视图-控制器)架构模式,以其简洁...
《Agile Web Development with Rails》是一本经典的Rails开发指南,中文版的出版使得更多的中国开发者能够深入理解并应用敏捷开发方法与Ruby on Rails框架。这本书是Rails开发者的必备参考资料,它详细介绍了如何...
对于更高级的主题,例如部署到服务器、性能优化、安全性和API开发,本书也会提供基础的引导,帮助读者了解实际生产环境下的Rails应用运维。 总的来说,《Ruby on Rails入门权威经典》是一本内容丰富、实践性强的...