Предпочитаете% w (...) для литерала?

При вводе простого литерального массива строк в RubyMine:

cols =
[
  "Col1",
  "Col2"
]

RubyMine жаловался, что я предпочитаю использовать %w над литеральным массивом:

cols = %w(Col1 Col2)

Он представил ссылку на руководство по стилю Ruby (здесь), в котором говорилось:

Предпочитайте% w для синтаксиса литерала, когда вам нужен массив строки.

# bad
STATES = ['draft', 'open', 'closed']

# good
STATES = %w(draft open closed)

Я вижу, как %w предоставляет потенциально более сжатый код. Помимо краткости, есть ли причина предпочесть один метод другому?

Ответ 1

Voila!, один контрольный показатель:

require 'benchmark'

n = 1_000_000
Benchmark.bm(11) do |b|
  b.report('%w') { n.times { %w[a b c d e f g h i j k l m n o p q r s t u v w x y z] } }
  b.report('explicit') { n.times { ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] } }
  b.report('numerics') { n.times { [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26] } }
end

                  user     system      total        real
%w            2.590000   0.000000   2.590000 (  2.591225)
explicit      2.590000   0.000000   2.590000 (  2.584781)
numerics      0.300000   0.000000   0.300000 (  0.309161)

                  user     system      total        real
%w            2.590000   0.000000   2.590000 (  2.591516)
explicit      2.590000   0.000000   2.590000 (  2.584155)
numerics      0.300000   0.000000   0.300000 (  0.308896)

                  user     system      total        real
%w            2.590000   0.000000   2.590000 (  2.592848)
explicit      2.590000   0.000000   2.590000 (  2.585558)
numerics      0.300000   0.000000   0.300000 (  0.308570)

Я добавил тест массива "число", потому что я подозревал, что %w быстрее, чем использование явных строк из-за тестирования на строгость. %w не нужно делать этого, потому что он предполагает, что все является строкой. После трехкратного запуска его мытье, касающееся струн. Правило чисел, слюни строк и все такое.


Предыдущие тесты были выполнены с использованием Ruby 1.9.3-p286 в моей системе на работе. Я проверил снова, используя свой старый MacBook Pro дома, используя Ruby 1.8.7-p358, поэтому следующие номера медленнее из-за различий в хостинговом оборудовании, плюс запуск более старого Ruby:

                user     system      total        real
%w           3.070000   0.000000   3.070000 (  3.080983)
explicit     3.100000   0.000000   3.100000 (  3.093083)
numerics     0.950000   0.040000   0.990000 (  0.990535)

                user     system      total        real
%w           3.080000   0.010000   3.090000 (  3.076787)
explicit     3.090000   0.000000   3.090000 (  3.089246)
numerics     0.950000   0.030000   0.980000 (  0.989579)

                user     system      total        real
%w           3.080000   0.000000   3.080000 (  3.073877)
explicit     3.090000   0.000000   3.090000 (  3.091576)
numerics     0.950000   0.030000   0.980000 (  0.989132)

В 1.8.7, %w был чуть-чуть быстрее, что, вероятно, приводило к роковым слухам.