2

也许是一个简单的问题,但我们正在讨论使用这个sniper是否更好:

if %w(production staging).include?(Rails.env)

相对

if ["production","staging"].include?(Rails.env)

我们只想了解哪种方式最高效,忽略 Ruby 的语法。从我在网络上的内容来看, %w 文字似乎是提供的空白字符串上 string.split 的简写。

但实际上哪一个是最快的?

ps:答案的来源将不胜感激。

4

2 回答 2

7

以下是直接取自(有遗漏)的内容%w和操作:%Wparse.y

case '%':
[snip]
  switch (c) {
    [snip]
    case 'W':
      lex_strterm = NEW_STRTERM(str_dword, term, paren);
      do {c = nextc();} while (ISSPACE(c));
      pushback(c);
      return tWORDS_BEG;

    case 'w':
      lex_strterm = NEW_STRTERM(str_sword, term, paren);
      do {c = nextc();} while (ISSPACE(c));
      pushback(c);
      return tQWORDS_BEG;

考虑到它是在解析器级别实现的,我不会太担心性能。

于 2012-06-25T09:57:27.837 回答
3

我在我的 c2d 上做了一些测试:

ruby -e "10000000.times { ['one', 'two'].include?('two')}"  
8.04s user 0.05s system 90% cpu 8.912 total

ruby -e "10000000.times { %w(one two).include?('two')}"  
8.03s user 0.05s system 93% cpu 8.608 total
于 2012-06-25T09:49:38.047 回答