也许是一个简单的问题,但我们正在讨论使用这个sniper是否更好:
if %w(production staging).include?(Rails.env)
相对
if ["production","staging"].include?(Rails.env)
我们只想了解哪种方式最高效,忽略 Ruby 的语法。从我在网络上的内容来看, %w 文字似乎是提供的空白字符串上 string.split 的简写。
但实际上哪一个是最快的?
ps:答案的来源将不胜感激。
也许是一个简单的问题,但我们正在讨论使用这个sniper是否更好:
if %w(production staging).include?(Rails.env)
相对
if ["production","staging"].include?(Rails.env)
我们只想了解哪种方式最高效,忽略 Ruby 的语法。从我在网络上的内容来看, %w 文字似乎是提供的空白字符串上 string.split 的简写。
但实际上哪一个是最快的?
ps:答案的来源将不胜感激。
以下是直接取自(有遗漏)的内容%w
和操作:%W
parse.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;
考虑到它是在解析器级别实现的,我不会太担心性能。
我在我的 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