More AR performance patches requested for review

Hi,
I can't remember whether I promised more performance patches, but anyways here
they are :wink:

http://dev.rubyonrails.org/ticket/11108
By rewriting string callbacks to symbol callbacks in AR associations we can
get significant performance improvement because there's no need to create
extra Binding object for each string callback to be evaluated with eval().
The performance improvement is tangible even for individual model operations,
not saying anything about loops (I saved 50M memory and 700ms because of this
change).

http://dev.rubyonrails.org/ticket/11109
This change is quite controversial, but it also has effect. method_missing is
often called for AR associations to pass method calls to underlying array but
method missing has &block parameter and thus requires Ruby to create Proc
object and Binding along with it. This allocates noticeable amount of memory
and can be avoided replacing each call like
    def foo(&block)
        bar(&block)
    end
with
    def foo
        bar { |*block_args| yield(*block_args) if block_given?
    end

I've explained the problem and performance gains in more details in ticket
descriptions and also in the blog:
http://blog.pluron.com/2008/02/rails-faster-as.html

http://dev.rubyonrails.org/ticket/11110
The idea of this small performance improvement is that most likely people will
not subclass from BigDecimal's and Rails' type_cast method will always get
BigDecimal's. Therefore we can save a couple of milliseconds when checking if
the value is already BigDecimal using class equality instead of #is_a?
method.

http://dev.rubyonrails.org/ticket/11111
This is the simplest change. AR::Base#attributes_with_quotes likes to call
AR::Base#connection methods. By cashing the return value of the #connection
method we can save a couple of milliseconds.

Great work, Alexander!

It's wonderful seeing our memory footprint shrink, bit by bit.

Best,
jeremy