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.