From: "funny_falcon (Yura Sokolov)" Date: 2013-02-16T19:32:14+09:00 Subject: [ruby-core:52300] [ruby-trunk - Feature #7816] Don't invalidate method caches when defining a new method on a class without subclasses Issue #7816 has been updated by funny_falcon (Yura Sokolov). charliesome (Charlie Somerville) wrote: > I have updated my patch to not clear the cache when a class is garbage collected. > > My reasoning is that if a class is garbage collected, then no objects of that class could possibly exist, so the method cache would never be hit. That is not the true: occasionally a new class could be placed at the same object slot. Then method cache item will be considered as cache-hit, but will point to wrong direction. ---------------------------------------- Feature #7816: Don't invalidate method caches when defining a new method on a class without subclasses https://bugs.ruby-lang.org/issues/7816#change-36342 Author: charliesome (Charlie Somerville) Status: Open Priority: Normal Assignee: Category: core Target version: next minor =begin Attached is a patch that avoids incrementing the VM state version when defining a method and these conditions are true: * The method is not a redefinition of an existing method in the same class or any superclass * The class has no subclasses * The class is not a module This means that defining singleton methods on objects no longer invalidates every method cache. This will significantly improve performance of code that defines singleton methods at runtime (eg. when using OpenStruct) In my testing, a fresh Rails app boots about 15% faster (~1.7 sec down to ~1.4 sec). This controller action can do ~440 requests per second with my patch, compared to ~320 requests per second without my patch. class HomeController < ApplicationController def index OpenStruct.new a: 1, b: 2 render text: "home" end end Of course these numbers will vary between apps, but I think this is a good start in improving the performance of a very common use case in Ruby. =end -- http://bugs.ruby-lang.org/