`
ybffnst
  • 浏览: 13751 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何写出有效率的 Ruby Code

    博客分类:
  • Ruby
阅读更多
如何寫出有效率的 Ruby Code

Ruby 是個很慢的語言,但有些作法應用得當,還是會有不錯的改善。不過要知道程式碼的可讀性跟執行效率有時候是衝突的,這點還需拿捏,尤其 software life cycle 一開始可讀性比較重要。有句最佳化的經典名言一定要引一下:

未成年就這麼優,是一切邪惡的根源
Premature optimization is the root of all evil

這裡紀錄一些看到有趣的事情,PDF 裡有更詳盡的 example code。


INSTANCE VARIABLES VERSUS ACCESSORS
@attrubute 比 self.attrbute 快(method call 比較貴),如果你不需要 public method 或有 sub-class 的需求,請考慮不要用 attr_accessor 等方式來建立 read/write method。

LOCAL VARIABLES ARE CHEAP
method 中傳進來的參數若常用,可以先存成 Local Variables 再來多次使用。

INTERPOLATED STRNGES
方法一 s = “:#{a}.#{b}” 比方法二 s = “:” << a.to_s << “.” << b.to_s 快多囉!! 不需要多用 << method call。另外單引號跟雙引號沒有效率上的差別。

IN-PLACE UPDATES
直接修改比複製一份快: gsub! 比 gsub 快,merge! 比 merge 快。例如這個範例 s.gsub().gsub!().gsub! 而不是 s.gsub.gsub.gsub

不過要小心,Ruby 對於 ! 版本的方法回傳值有時候不是自己(得查 API 確定一下),因此沒辦法用串接寫法。

SET VERSUS ARRAY
如果你只用到 Array 的 uniq, |, %, – 等群集操作,請考慮改用 Set 會比較快,像是 include? 就可以在 O(1) 做完。而 Hash 又比 Array 貴。

MAKE DECISIONS AT LOAD TIME
注意到在 module 或 class 的 definition scope 也是可以執行程式的,而且只有第一次 require source code 時會執行編譯一次。

class Foo
if C=’somesetting’
def A
…version 1
end
else
def A
…version 2
end
end
end

SELF-MODIFYING CODE
避免寫出自己修改自己定義的程式(也不好讀code吧),改用 singleton 方式來做 alias_method 跟 remove_method。

TEST MOST FREQUENT CASE FIRST
用 case 時把較常發生的放前面,若都差不多,把貴的操作的放後面。

OPTIMIZE ACCESS TO GLOBAL CONSTANTS
在 Constant 前面加上 namespace operator :: 會比較快,減少查詢時間

CACHING DATA IN INSTANCE VARIABLES
例如在 controller 裡面 def captial_letters { (“A”..”Z”).to_a } end 請改用 def captial_letters { @captial_letters ||= (“A”..”Z”).to_a } end

CACHING DATA IN CLASS VARIABLES
承上,如果 data 較大又持續存在,可以改用 @@capital_letter = (“A”..”Z”).to_a 然後定 def captial_letters { @@captial_letters } end。在 ActiveRecord 中也可以先把 DB 的資料讀出來當作 CONSTANTS,就不需要每次都查資料庫了:

class State < ActiveRecord::Base
NAMES_ABBR = self.find(:all).map do { |s| [s.name,s.abbr] }
end

CODING VARIABLE CACHING EFFICIENTLY
愛用 @var ||= begin …expr… end 而不是 @var = begin …expr… end unless @var,這樣只需查 @var 一次。但如果 @var要能吃 nil 或 false 就只能多一個 boolean 變數來幫忙了。

INITIALIZING VARIABLES WITH NIL
若沒有給值,就不需要初始成nil

USING .NIL?
如果要測試的值已知不是 Boolean,那就不需要用 .nil 多一個 method call,直接 if x 就好了而不是 if x.nil?

NIL? OR EMPTY? VERSUS BLANK?
ActionPack 有提供 x.blank?,不需要用 x.nil? || x.empty?

USING RETURN
雖然 Ruby 很聰明會自動回傳最後運算的值,但明確寫 return 會比較快 (Ruby 1.9有改善)

USING ANY?
用 empty? 來測試 string, array or hash 而不要用 any?,速度差個兩倍 (而且 Ruby 1.9 也拿掉 any?這個method了)

BLOCK LOCAL VARIABLES
在 Ruby 1.8 裡面,在 Block 裡面存取 Block 外面的 local variable 竟然比裡面的 local variable 還快!! 不過 Ruby 1.9 修正這個奇怪的事實就是了。

PARALLEL ASSIGNMENTS
很方便沒錯,但 a,b=1,2 運算還丟出來 Array [1,2] 是垃圾。(Ruby 1.9 修正了,改丟 true)

DATE FORMATTING
用 parse_date 把 String 變成 Date 是個非常昂貴的操作,建議你直接用字串操作(正規表示法)把 String(例如從DB撈出來的db_date) 變成你想要的格式,或是從中拆出你想要的年月日。(PDF 有 example code)

TEMPORARY DATA STRUCTURE CONSTANTS
如果用到一個暫時的資料結構(如Array)但接下來不會更改,可以改用 Constant 宣告,並避免複製。

OBJECTSPACE.EACH_OBJECT
DO NOT USE IT,你不會想在 per-request 下去執行的,很貴。

UNNECESSARY BLOCK PARAMETERS
def foo(bar, &block) 的 &block 若在函式內不需要用到(可以直接用 yield 使用的),請不要加。轉成 Proc 比單純 yield 的慢5倍!!

SYMBOL.TO_PROC
ActiveSupport 提供的 @var.map(&:name) 語法,雖然方便,但是用 inline block 的方法 @var.map{ |a| a.name| } 執行效率比較快。

REQUIRING FILES DYNAMICALLY
在 Rails 中若碰到一個未定義的常數,它會自動去 load source files 來載入定義。為了避免混淆 file-loading 機制,不需寫 require ‘client’ (這又是另一套 auto-loaded 機制),只要單單一行寫 Client 就好了。

INCLUDING MODULES VERSUS OPENING CLASSES
使用 module mix-in 會比打開 class 加入 method 還慢一些,如果你的 module 只針對一個 class 做 mix-in,那不如直接打開來加入 methods 就好了。
分享到:
评论

相关推荐

    Code Review&JRuby on Rails

    代码审查是软件开发过程中的一个关键环节,它旨在提高代码质量、降低错误率、提升团队协作效率。这份peepcode的Code Review部分可能涵盖了以下知识点: 1. **代码审查的意义**:解释为何进行代码审查,包括发现潜在...

    test-models-ruby

    5. **测试覆盖率**:为了确保测试的全面性,开发者会使用工具(如SimpleCov或CodeClimate)来测量测试覆盖率,即测试代码覆盖了多少源代码。 6. **持续集成(CI)**:在实际项目中,测试通常会集成到持续集成服务器上...

    php-test-reporter:已弃用PHP测试报告器

    从您PHP测试套件中收集测试覆盖率数据,并将其发送到Code Climate的托管自动代码审查服务。 代码气候-https: 重要说明:如果遇到涉及SSL证书的错误,请参阅下面的“已知问题:SSL证书错误”部分。重要FYI 在许多...

    adventofcode-2019

    《Ruby编程语言在Advent of Code 2019中的应用探索》 Advent of Code(AOC)是一项每年举办的在线编程挑战活动,旨在通过一系列趣味性的编程问题来庆祝圣诞节的到来。2019年的Advent of Code,即"Adventofcode-2019...

    javascript-test-reporter:JavaScript项目的不推荐代码气候测试报告器客户端

    codeclimate-test-reporter-[已弃用] 这些配置说明引用的是特定于语言的测试报告程序,为了支持我们的新统一测试报告程序客户端,... 注意:如果已将Code Climate配置为分析同一存储库中的多种语言(例如Ruby和JavaScri

    hadoop-course:从 code.google.comphadoop-course 自动导出

    - YARN(Yet Another Resource Negotiator):资源管理和调度器,取代了早期的JobTracker,提高了系统资源利用率。 - Hive:基于Hadoop的数据仓库,提供SQL-like查询语言,简化数据分析。 - Pig:数据流处理平台,...

    linecount代码统计工具

    这个工具在软件开发和项目管理中具有重要的作用,因为它能够帮助开发者和团队有效地了解项目的规模,跟踪代码的增长,以及在不同阶段进行性能评估。 在软件开发中,代码行数(LOC,Lines of Code)虽然不是衡量质量...

    awebarts1-11:源代码课程1-mvc source code

    在本课程"awebarts1-11:源代码课程1-mvc source code"中,我们将深入探索基于MVC(Model-View-Controller)架构的软件开发。MVC是一种广泛应用于Web应用程序设计的设计模式,它将业务逻辑、数据处理和用户界面有效地...

    dinner_dash:餐馆的在线商务平台,方便在线订购

    "dinner_dash"项目体现了现代Web应用开发的先进实践,包括利用Ruby构建功能丰富的在线商务平台,采用CI/CD确保快速迭代,通过版本控制实现团队协作,关注代码质量和测试覆盖率以保证软件质量,以及运用有效的工作...

    质量:质量代码报告

    1. **代码审查**:同行评审是发现和修复问题的有效途径,可以鼓励团队成员之间的交流,分享知识,并共同提高代码质量。 2. **自动化测试**:编写全面的单元测试、集成测试和端到端测试,可以确保代码的功能正确性,...

    Web设计师的50个超便利工具.pdf

    根据提供的文件内容,我们可以提炼出以下知识点,用于深入理解Web设计师在设计过程中会使用的50个超便利工具,以及这些工具的功能和作用。 1. Pencil Project: 这是一个开源的图形界面原型设计工具,它允许设计师在...

    软件工程中的代码质量管理与自动化测试策略探讨.pptx

    - **RSpec**:支持Ruby语言,专注于Ruby开发。 **3.6 单元测试框架比较** - **JUnit**:支持Java语言,广泛应用于企业级应用开发。 - **TestNG**:同样适用于Java,提供了更灵活的测试配置选项。 - **Pytest**:...

    FullStack:完整的堆栈开发文件

    - **RESTful API**:用于前后端通信的标准,定义了一组设计原则,使数据交换更有效率。 4. **数据库管理**: - **SQL与NoSQL**:SQL数据库(如MySQL、PostgreSQL)适用于结构化数据,NoSQL数据库(如MongoDB、...

Global site tag (gtag.js) - Google Analytics