To take the focus off number of lines, let's take a look at bechmarks.
This was my benchmark script:

Benchmark::bm(12) do |x|
  x.report('attr') {100000.times {c = Class.new {attr :foo, :bar}}}
  x.report('attribute') {100000.times {c = Class.new {attribute :foo,
:bar}}}
end

And my results were:

                  user     system      total        real
attr          3.720000   0.000000   3.720000 (  3.724316)
attribute    25.750000   0.000000  25.750000 ( 25.790665)

It isn't that efficient, but I'd like to see how it compares.