说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何让Ruby项目速度提升10倍

HTML文档下载 WORD文档下载 PDF文档下载
如何把一个Ruby项目的运行时间从20秒优化到1.5秒?值得开发者注意的是,在Ruby中调用方法很影响速度,所以作者对代码进行了模块化处理和重复使用。

作者详细描述了他是如何把一个Ruby项目的运行时间从20秒优化到1.5秒。值得开发者注意的是,在Ruby中调用方法很影响速度,所以作者对代码进行了模块化处理和重复使用。下面是笔者对原文的翻译:

这篇文章主要介绍了我是如何把ruby gem contracts.ruby速度提升10倍的。

contracts.ruby在我项目里用来添加代码合约(code contracts)到Ruby中。看起来差不多是这样的:

Contract Num, Num => Numdef add(a, b)  a + bend
只要add方法被调用,参数和返回值都会被检查。

20秒

本周末,我对该库进行了测试,发现其性能非常糟:

                                   user     system      total        realtesting add                      0.510000   0.000000   0.510000 (  0.509791)testing contracts add           20.630000   0.040000  20.670000 ( 20.726758)
这是在随机输入下,运行1000次以后的结果。

所以,当给一个函数加入合约功能后,运行速度明显下降(约40倍这样),对此,我进行了深入的研究。

8秒

我取得了较大的进展,当传递合约时,我调用success_callback函数,该函数是个空函数,下面是这个函数的整个定义:

def self.success_callback(data)end  

原来函数调用在Ruby中是非常昂贵的,仅删除这个调用,就节省了8秒钟:

                                  user     system      total        realtesting add                     0.520000   0.000000   0.520000 (  0.517302)testing contracts add           12.120000   0.010000  12.130000 ( 12.140564)
删除其它一些附件函数的调用,时间花费开始从9.84-> 9.59-> 8.01秒,该库的速度马上提升到以前的两倍了。

现在,事情变的有点复杂了。

5.93秒

这里有许多年种定义一个合约的方式:匿名(lambdas)、类 (classes)、简单旧数据(plain ol’ values)等。 我有个很长的case语句,用来检测合约的类型。在此合约类型基础之上,我可以做不同的事情。通过把它改为if语句,我节约了一些时间,但每次调用这个函数时,我仍然耗费了不必要的时间在仔细检查这个判定树上面:

if contract.is_a?(Class)  # check argelsif contract.is_a?(Hash)  # check arg...

当定义合约和构建lambda时,对树只做一次检查:

if contract.is_a?(Class)  lambda { |arg| # check arg }elsif contract.is_a?(Hash)  lambda { |arg| # check arg }

然后,我将完全绕过逻辑分支,通过将参数传递给预计算的lambda来进行验证,这样就节约了1.2秒时间。

                                  user     system      total        realtesting add                      0.510000   0.000000   0.510000 (  0.516848)testing contracts add            6.780000   0.000000   6.780000 (  6.785446)
预计算一些其它的If语句,差不多又节省了1秒时间:

                                   user     system      total        realtesting add                      0.510000   0.000000   0.510000 (  0.516527)testing contracts add            5.930000   0.000000   5.930000 (  5.933225)
5.09秒

将.zip转换为.times又为我节省了1秒时间:

                                   user     system      total        realtesting add                      0.510000   0.000000   0.510000 (  0.507554)testing contracts add            5.090000   0.010000   5.100000 (  5.099530)
结果证明:

args.zip(contracts).each do |arg, contract|
上面的代码要比下面这个慢:

args.each_with_index do |arg, i|
要比下面这个更慢:

args.size.times do |i|
.zip要花费不必要的时间复制和创建新的数组。而我认为,.each_with_index之所以慢,是因为它受制于背后的.each,所以它涉及到两个限制而不是一个。

4.23秒

下面再看些细节的东西,contracts库在工作时,它会为每一个方法添加class_eval(class_eval要比define_method快)的新方法,这个新方法里有一个对老方法的引用,当调用新方法时,它会检查参数,然后根据参数调用老方法,然后再检查返回值,并且返回值。所有这些都会调用Contract class的check_args和check_result两个方法。我取消了这两个方法的调用,并且对新方法进行正确检查,结果又节省了0.9秒:

                                   user     system        total        realtesting                          0.530000   0.000000   0.530000 (0.523503)testing contracts add            4.230000   0.000000   4.230000 (  4.244071)

2.94秒

在上面,我已经解释了如何基于Contract类型创建lambda,然后使用这些来检验参数。现在,我换了种方法,用生成代码来替代,当我使用class_eval创建新方法时,它就会从eval中获得结果。一个可怕的漏洞,但它避免了一大堆方法调用,并且节省了1.25秒:

                            user    system     total   real    testing add            0.520000 0.000000 0.520000 ( 0.519425)    testing contracts add  2.940000 0.000000 2.940000 ( 2.942372)

1.57秒

最后,我改变了调用重写方法的方式,我先前是使用引用:

# simplificationold_method = method(name)= method(name)class_eval %{%{    def #{name}(*args)def #{name}(*args)        old_method.bind(self).call(*args).bind(self).call(*args)    endend}}
我进行了修改,并使用alias_method方法:

alias_method :"original_#{name}", name:"original_#{name}", nameclass_eval %{%{    def #{name}(*args)def #{name}(*args)        self.send(:"original_#{name}", *args)self.send(:"original_#{name}", *args)      endend}}

惊喜,又节省了1.4秒。我不知道为什么aliaa_method会如此地快,我猜是因为它跳过了一个方法的调用和绑定到.bindbind。

                                 user     system      total        realtesting add                      0.520000   0.000000   0.520000 (  0.518431)testing contracts add            1.570000   0.000000   1.570000 (  1.568863)

结果

我们成功的将时间从20秒优化到1.5秒,我不认为还有比这更好的结果的了。我所编写的 这个测试脚本表明,一个被封装过的add方法要比常规的add方法慢3倍,所以这些数字已经足够好了。

想要验证上面的结论很简单,大量的时间花在调用方法上是只慢3倍的原因,这里有个更现实的例子:一个函数读一个文件100000次:

                                  user     system      total        realtesting read                     1.200000   1.330000   2.530000 (  2.521314)testing contracts read           1.530000   1.370000   2.900000 (  2.903721)

稍微慢了点!add函数是个例外,我决定不再使用alias_method方法,因为它污染了命名空间,并且这些别名函数会到处出现(文档、IDE的自动完成等)。

其它原因:

  1. 在Ruby中调用方法很慢,我喜欢将代码模块化和重复使用,但或许是时候将更多的代码进行内联了。
  2. 测试你的代码!删掉一个简单的未使用的方法时间从20秒缩短到了12秒。

其它尝试

1.方法选择器

Ruby 2.0里缺少方法选择器这一特性,否则你还可以这样写:

class Foo Foo  def bar:beforedef bar:before    # will always run before bar, when bar is called# will always run before bar, when bar is called  endend  def bar:afterdef bar:after    # will always run after bar, when bar is called# will always run after bar, when bar is called    # may or may not be able to access and/or change bar's return value# may or may not be able to access and/or change bar's return value  endendendend
这样可能会更加容易编写decorator,并且运行速度也会加快。

2.关键字old

Ruby 2.0里缺乏的另一特性是引用重写方法:

class Foo Foo  def bardef bar    'Hello''Hello'  endendend end class Fooclass Foo  def bardef bar    old + ' World'+ ' World'  endendendendFoo.new.bar # => 'Hello World'Foo.new.bar # => 'Hello World'
3.使用redef重新定义方法:

Matz曾说过:

为了消除alias_method_chain,我们引入了Module#prepend,prepend前面加#号,这样就没机会在语言里加入冗余特性。

所以如果redef是冗余特征,也许prepend可以用来写decorator?

4.其它实现

目前为止,这些都已经在YARV做过测试。

来自:adit.io

改变按钮的文本颜色-VB资料 功能强大的增强列表框 ――VB6控件LISTVIEW使用指南 关闭MDI窗体中所有的子窗体-VB资料 规范设计Windows应用软件菜单-VB资料 VB建立可滚动的视区 -VB资料 VB建立可下拉选择的属性 -VB资料 VB建立无模式窗口 -VB资料 将VB5中的ToolBar变成平面的 将程序从任务列表中隐藏 -VB资料 将我自已的命令加入窗体的控制菜单栏-VB资料 VB利用 UnloadMode 来控制窗体的卸载? VB利用Form_QueryUnload询问使用者是否关闭窗口 利用VB的图片框实现屏幕的滚动 利用VB动态改变Windows显示模式的两种方法 利用VB控制窗口显示风格 利用VB实现浮动按钮 VB利用子类处理技术限制窗体的大小 奇形怪状的窗体 -VB资料 强制ComboBox弹出下拉框 -VB资料 强制和防止窗口重画 -VB资料 巧用“关于”对话框-VB资料 请问在VB中如何关闭别的应用程序窗口 确定屏幕分辨率-VB资料 让VB5支持动画光标 让窗口拒绝接受键盘和鼠标事件 -VB资料 让窗体处于最前面 -VB资料 让窗体居中 -VB资料 让所有的控件都动起来 -VB资料 让最大化和最小化按钮消失-VB资料 任意多边形的窗口-VB资料 如 何将「拒 绝 被 盖 住 的 窗 口 」还 原-VB资料 三戒,有请~~~ 谁知道websphere的试用版怎么做掉? 打印DataReport时怎样用API改变系统的纸型,急急急急急急急急急!!!! 新来的~~来报到了~~只能送20分~~希望大家不嫌弃~~ 请成功使用JBuilder5的朋友指教!! 激情放送 五位QQ号,100块,你会要吗? 555~~~~挂了PASCAL挂了,5555~~~~我学不好DELPHI 了5555谁帮我呀!!! 有编过游戏修改器的高手吗? jinesc领分~~~ 如何使UpDown每次增加或减少0.5? 有个问题很困惑,请教 上傳后,服務器端如何接收? 各位高手好!现在有谁是正在使用 LINUX 上网的.报一下好吗!!!!!! 我快神经了,求救 各位高手好!现在有谁是正在使用 LINUX 上网的.报一下好吗!!!!!!!! 别笑我傻,又有简单问题 各位高手好!现在有谁是正在使用 LINUX 上网的.报一下好吗!!!!!!! 各位高手好!现在有谁是正在使用 LINUX 上网的.报一下好吗!!!!!!!!!!!! 各位高手好!现在有谁是正在使用 LINUX 上网的.报一下好吗!!!!!!!!! 大家都谈谈建立什么样的目录结构能更好的管理硬盘里的东东 lilo 如何设置??请赐教!! 各位高手好!现在有谁是正在使用 LINUX 上网的.报一下好吗!!!!!!!!!!!1 mts是什么? mts是什么?? 学习汇编要什么基础,要看什么样的书,有没有好的汇编的电子参考书下载呢? 腾讯的qq怎么不好用了? 有CCNA,Scjp2,高程的计算机本科生能卖多少?(答者有分,只能给33分,没办法) word的表格问题 如果开另外一个线程来进行注册码检验,是否比较难CRACK? 请问高程考试考试的难度 怎么让程序启动的时候接受参数? mts是什么??? 我也调查:这里有多少冠名以“独孤”的,为何独孤???? 菜鸟SOS 个人论:编写程序方法论(原作者,huangbeyond) 向流版主学习,戒网!戒网!成天在网上瞎转,不如下去加强学习,碰到问题再上网寻求答案,天天在网上泡得久了,看到各大PB网站的编程技巧都有些视而不见了.....到PB论坛很多人都象到自己喜爱的聊天室了,到论坛好象就是来聊天一样.....戒网!戒网! 如何编写一个集成Ms Word的控件,能够处理WEB上的文件排版 怎么不能下载呢? 我是女孩,有人信吗??嘻嘻~~ 谁知道关于用vc编游戏的书,请各位大虫们介绍介绍好吗?谢谢了!!!!!!!!!! 有关sql server不能显示中文啊?? 关于B/S动态刷新问题 想不到,摩机三年今天居然栽了 beginpaint函数有什么用? 在PowerBuilder中怎么才能得到当前程序运行的路径? Sybase PowerDesigner v7.5 的中文学习材料谁有? 哪位大虾能够作一个查看游戏图片的辅助工具 请问casl汇编和asm有什么不同??谢谢!!!!!!!!!!111 Activex Document下载问题 kingxing(在江湖上混口饭吃) 能不能让程序一直运行哪一段呢?? 英语翻译 虞世南的咏风译文? 英语翻译National laws shall always take precedence over International guidelines.Cases made to International courts are likely to give precedence to a combination of the OECD Recommendation and either the European Data Privacy Directive or APEC P 王勃故事 文言文 急 英语翻译A star has 5ends;A squar has 4 ends; a triangle has 3ends; A linehas 2 ends; Aends;lifehasoneend.Butl hope our friendahip 英语翻译请帮忙翻译这段话:The $47.3 fee is a DHL charge for Quarantine processing carried out by Department of Agriculture,Fisheries and Forestry(DAFF).When shipments are inspected ,DAFF charges DHL for the quarantine inspection services 文言文 王勃故事 哪位好心人帮我把以下英文翻译成汉字Cat and rat live in a forest. Every summer, there is an animalrace in the forest. Cat ang rat join the race. Rat says toCat“I know a path. You can follow me.”So Cat runssays, “Let’s have a r 英语翻译If boy wizard(巫师) Harry Potter uses his magic to capture(迷住) the hearts of millions of teenagers,high school students Gabriella and Troy have charmed American boys and girls with their stories of campus life.They are the leading c 文言文 王勃故事 的题 几句英语翻译 急!好心人帮忙!吃太多的甜食容易使人发胖.(likely)饭后散一会儿步有益健康.(do good to ) 大量砍伐树木已经对生态平衡带来了严重影响.(upset) 照看婴儿是一项很累的活.(task) 听 英语翻译The discovery,development,and clinical use of antibiotics during the 20th century have decreased substantially the morbidity and mortality from bacterial infections.The antibiotic era started with the therapeutic application of sulfonamid 《王勃作》译文我不要滕王阁序的译文,我要的是《王勃作》这篇的译文,是写王勃在写《滕王阁序》的过程等等的那篇古文啊~OK? 英语翻译Hello seller,My Name is Mrs Jessica Morris,I want to make an urgent purchase of your item pasted on Yahoo Auctions for my Uncle in Nigeria,i will offer you the sum of $1,500.00 USD including the shipping cost via EMS SPEED POST.kindly get 英语翻译The DCS 968 series Auto start Controller is designed for use in applications involving control and safety monitoring of stationary engines.The use of the controller increases reliability and simplifies wring of the control panel. 《唐才子传》王勃的译文?开头是:勃子子安,太原人,王通之孙也.百度上的那个不一样的~不要复制过来,请看清楚了再回答! 英语翻译It is the rarest thing in the world to hear a rational discussion of vivisection.Those who disapprove of it are commonly accused of “sentimentality,” and very often their arguments justify the accusation.They paint pictures of pretty 英语翻译The following is an e-mail sent to you by an administrator of "Channel [v]Thailand".If this message is spam,contains abusive or other comments youfind offensive please contact the webmaster of the board at the followingaddress:webmaster@c 王勃故事(简短) 英语翻译Such development are possible .mobilizing the power of information technology ,some firms(eg,Moskowitz Jacob ,inc)have developed design labs that obtain consumers’ reactions to concepts and products and provide immediate,direct and 英语翻译I helped out a women several years ago that made mens underwear.She would send me samples to try on an I would send pic or video back to her so she could see the fitting.Would not have a problem offering you that help if you are intereste 王勃故事 现代科学研究发现:人除了头部大脑外,还有一个大脑藏在肚子里,称为“腹脑”.换句话说,你再也不能像过去那样将肚子简单地视为“酒囊饭袋”了.它是你的“第二大脑”.那么,造 英语翻译 英语翻译The old lady pulled her spectacles down and looked over them about the room .Then she put them up and looked out under them.She seldom or never looked through them for so samll a thing as a boy.They were her fancy pair,the pride of her he 英语翻译王勃著《腾王阁序》,时年十四.都督阎公之不信,勃虽在座,而阎公意属子婿孟学士者为之,已宿构矣. 英语翻译So i want to tell me if you have the previous selection in your stock on the right SIZES that i ask you atd those three new selection.and i want to tell me do you have all the others in follow sizes? 英语翻译Make a periscopeHave you ever been in a crowd at a football match and wished you were much taller?Don't worry about it now.A Home-made periscope could be the answer to your wish.This is what you do...1.Look at the diagram and draw the sha 英语翻译王勃著《滕王阁序》,时年十四.都督阎公不之信.勃虽在座,而阎公意属子婿孟学士者为之,已宿构矣.及从纸笔巡让宾客,勃不辞让.公大怒,拂衣而去,专会人伺其下笔.第一报云:‘南昌 英语翻译请你原谅我的失误,你所购买的产品已经缺货,现在我提供一些相似产品的照片供你选择.我希望能够在星期一把你的货发出去. 英语翻译Since detention of a ship is a serious matter involving many issues,it may be in the best interest of the PSCO to act with other interested parties. 求王勃《滕王阁序》的原文以及翻译 英语翻译1.Like many people,I have no clear idea about heroes.At some point,we all wonder if we need a hero and what a hero really is.2.A hero does something worth talking about.A hero has a special story to tell and people think highly of it.But 英语翻译lazy.I wasn't surprised to find that my worst report was from my science teacher.it's just that i find science really difficult.that‘s about all the news i have for now.send their love. 英语翻译看见机 英语翻译中文,要人工翻译You can see that we are ordering nearly every two weeks so I want you to give me good prices. I want you to send me links for women and babies with long sleeves. My wife and my daughter are waiting for your response 英语翻译AVL techniques have widely been perceived as useful technologies in many APTS areas,such as automatic vehicle location,vehicle component monitoring,automatic passenger counters,electronic fare boxes,timed transfers,traffic signal preempti 英语翻译求翻译:滕王高阁临江渚,佩玉鸣鸢罢歌舞.画栋朝飞南浦云,珠帘暮卷西山雨.闲云潭影日悠悠,物换星移几度秋.阁中帝子今何在?栏外长江空自流. 英语翻译Sales volumeMarket shareProfitDealer ordersComplaintsCompetitors 英语翻译用机器翻译的话麻烦也稍微修改一下,意思大概正确,语句通顺即可The two factors (dependent variables) considered for this research study were the systems integration complexity (systems integration process complexity 王勃展才 翻译 英语翻译Open the Front cover,then replace the Toner carthidge Witna New one 英语翻译用机器翻译的话麻烦也稍微修改一下,意思大概正确,语句通顺即可 Fig.7 illustrates improvements at five different levels in the systems integration process complexity on the vertical axis as a result of the requireme 诗歌鉴赏王勃《咏风》的答案 英语翻译Please note that the transcript of records should include information on the grading scale used at the institution.The document explaining the grading scale should preferably be issued by the awarding institution and be officially certifi 英语翻译Out of the night that covers me,Black as the pit from pole to pole,I thank whatever gods may beFor my unconquerable soul.In the fell clutch of circumstanceI have not winced nor cried aloud.Under the bludgeonings of chanceMy head is bloody 《咏风》王勃.这首诗整体上运用了什么表现手法,表达了诗人怎样的情感如题 英语翻译由于上海正在举办世博会,出于安全措施,对液体【香水属于液体】稽查的的特别严格,我为了能够让您早点收到货物,已经重新发货给您,并且绕道另一个城市【广州】出关.由于发送液 英语翻译Dear Mark,New York is finally getting a real sales manager.Congratulations on your new promotion.Your marketing ability has put you well above everyone else in the company,and probably everyone else in the industry.The company will benefi 《咏风》 王勃 鉴赏 要短一点的,100来字左右,要短一点的,查到的都太长!100字就够了!答得好有的加分! 英语翻译The sun goes downThe stars come outAnd all that countsIs here and nowMy universe will never be the sameI'm glad you came... 英语翻译HappinessHappiness means different things to different people.For example,some students believe that if they have much money or a large number of possessions,they will be happy.They believe that they will be able to do anything they want 以下英文翻译成中文这是啥意思giankangshenghuoyacheengde? 咏风 王勃此诗的余味 英语翻译如果你想得到商品,请您支付我50USD的运费,或者购买不低于100USD的商品. 英语翻译1.One pair of platinum and diamond jewelery2.a surprise gift3.A group of special envoy4.A mysterious lucky5.A beautiful story,a love song for some exciting6.Wearing a white wedding the bride7.She is the world's most beautiful bride8.At th 《咏风》王勃这首诗的“诗眼”是哪两个字?请简要分析. 英语翻译提示信息尊敬的EMS客户:首先非常感谢您选择和信任EMS.最近因欧美部分地区受降雪、冰冻等灾害天气影响,导致航班延误或者取消,甚至地面交通瘫痪.受影响较严重的国家和地区有: 英语翻译Ofcourse,in a company that’s grown from three employees to 10,000 and from zerovalue to hundreds of billions of dollars in about five years,it may bequibbling to talk about “problems”,but there’s no doubt that such rapid growthdoe 《咏风》王勃 (1)这首诗写“风”,主要用了什么修辞手法?请简要分析其表达作用. 英语翻译货物已经发出,航空小包是无跟踪查询信息的.前一段时间由于欧美出现雪灾.导致一些邮件延误.现在情况已经好转,相信你很快就会收到货,请您耐心等待.我已经到邮局做书面查询,结
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn