From: "charliesome (Charlie Somerville)" Date: 2013-02-10T21:58:01+09:00 Subject: [ruby-core:52107] [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 charliesome (Charlie Somerville). Thanks for the feedback nobu. > * RCLASS_INHERITED flag should go to internal.h. I think it should stay in include/ruby/ruby.h where all the other flags are defined. This way if someone adds a new class flag, they do not accidentally also pick FL_USER5 because they did not see it already in use. > * Class#has_subclass? is not only useless but harmful, it mimics users when subclasses are removed. Fair enough, I'll update my patch and remove it. > * RubyVM.state_version seems useless also, and should be hidden. I don't think it is useless. It will be useful for performance tuning. Right now there is no way to tell if the method caches have been cleared, which makes profiling and tuning harder. > * why rb_method_entry() ignores the cache for an undefined method? Here is an example: class Foo unless method_defined?(:bar) def bar end end end If cache entries for undefined methods were not ignored, 'bar' would be defined, but calling it would raise NoMethodError, because the global cache thinks it is not defined. > * what are extra parens around RB_TYPE_P() in rb_method_entry_make(). Whoops, this is my mistake. > * what's inst in .gitignore. Ditto, I use './configure --prefix=`pwd`/inst', but I forgot to stash before creating the patch. ---------------------------------------- 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-36124 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/