diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-06-27 17:38:24 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-10-12 16:21:22 +0900 |
| commit | 639946a006c29f648551512af8aa0bb0cd969412 (patch) | |
| tree | 772fd60110e0492a42df513106d9e150b932645c | |
| parent | fb5e8ab6d5fa9b7ca08c7b66ac8038940534db70 (diff) | |
| download | mruby-639946a006c29f648551512af8aa0bb0cd969412.tar.gz mruby-639946a006c29f648551512af8aa0bb0cd969412.zip | |
Enable method cache by default.
Introduced `MRB_NO_METHOD_CACHE` which is inverse of `MRB_METHOD_CACHE`
that should be enabled intestinally. In addition, the default cache is
made bigger (128 -> 256).
| -rw-r--r-- | doc/guides/mrbconf.md | 8 | ||||
| -rw-r--r-- | include/mrbconf.h | 18 | ||||
| -rw-r--r-- | include/mruby.h | 10 | ||||
| -rw-r--r-- | include/mruby/class.h | 2 | ||||
| -rw-r--r-- | src/class.c | 8 | ||||
| -rw-r--r-- | target/appveyor.rb | 2 | ||||
| -rw-r--r-- | target/host-gprof.rb | 1 | ||||
| -rw-r--r-- | target/travis.rb | 2 |
8 files changed, 23 insertions, 28 deletions
diff --git a/doc/guides/mrbconf.md b/doc/guides/mrbconf.md index 1e1a5afcf..003c2b300 100644 --- a/doc/guides/mrbconf.md +++ b/doc/guides/mrbconf.md @@ -163,12 +163,12 @@ largest value of required alignment. * Default value is `128`. * Specifies initial capacity of `RString` created by `mrb_str_buf_new` function.. -`MRB_METHOD_CACHE` -* Improve performance for method dispatch. +`MRB_NO_METHOD_CACHE` +* Disable method cache to save memory. `MRB_METHOD_CACHE_SIZE` -* Default value is `128`. -* Ignored if `MRB_METHOD_CACHE` is not defined. +* Default value is `256`. +* Ignored if `MRB_NO_METHOD_CACHE` is defined. * Need to be the power of 2. `MRB_METHOD_T_STRUCT` diff --git a/include/mrbconf.h b/include/mrbconf.h index 2b1adb24e..81ab36977 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -31,10 +31,10 @@ /* exclude floating point numbers */ //#define MRB_WITHOUT_FLOAT -/* add -DMRB_METHOD_CACHE to use method cache to improve performance */ -//#define MRB_METHOD_CACHE +/* add -DMRB_NO_METHOD_CACHE to disable method cache to save memory */ +//#define MRB_NO_METHOD_CACHE /* size of the method cache (need to be the power of 2) */ -//#define MRB_METHOD_CACHE_SIZE (1<<7) +//#define MRB_METHOD_CACHE_SIZE (1<<8) /* add -DMRB_METHOD_T_STRUCT on machines that use higher bits of pointers */ /* no MRB_METHOD_T_STRUCT requires highest 2 bits of function pointers to be zero */ @@ -160,6 +160,10 @@ /* A profile for micro controllers */ #if defined(MRB_CONSTRAINED_BASELINE_PROFILE) +# ifndef MRB_NO_METHOD_CACHE +# define MRB_NO_METHOD_CACHE +# endif + # ifndef KHASH_DEFAULT_SIZE # define KHASH_DEFAULT_SIZE 16 # endif @@ -177,10 +181,6 @@ /* A profile for desktop computers or workstations; rich memory! */ #elif defined(MRB_MAIN_PROFILE) -# ifndef MRB_METHOD_CACHE -# define MRB_METHOD_CACHE -# endif - # ifndef MRB_METHOD_CACHE_SIZE # define MRB_METHOD_CACHE_SIZE (1<<10) # endif @@ -195,10 +195,6 @@ /* A profile for server; mruby vm is long life */ #elif defined(MRB_HIGH_PROFILE) -# ifndef MRB_METHOD_CACHE -# define MRB_METHOD_CACHE -# endif - # ifndef MRB_METHOD_CACHE_SIZE # define MRB_METHOD_CACHE_SIZE (1<<12) # endif diff --git a/include/mruby.h b/include/mruby.h index 27c428e85..c9425e8a7 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -188,11 +188,11 @@ struct mrb_context { }; #ifdef MRB_METHOD_CACHE_SIZE -# define MRB_METHOD_CACHE +# undef MRB_NO_METHOD_CACHE #else -/* default method cache size: 128 */ +/* default method cache size: 256 */ /* cache size needs to be power of 2 */ -# define MRB_METHOD_CACHE_SIZE (1<<7) +# define MRB_METHOD_CACHE_SIZE (1<<8) #endif /** @@ -218,7 +218,7 @@ typedef struct { } mrb_method_t; #endif -#ifdef MRB_METHOD_CACHE +#ifndef MRB_NO_METHOD_CACHE struct mrb_cache_entry { struct RClass *c, *c0; mrb_sym mid; @@ -264,7 +264,7 @@ typedef struct mrb_state { mrb_gc gc; -#ifdef MRB_METHOD_CACHE +#ifndef MRB_NO_METHOD_CACHE struct mrb_cache_entry cache[MRB_METHOD_CACHE_SIZE]; #endif diff --git a/include/mruby/class.h b/include/mruby/class.h index 94356d3b2..88e5915e5 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -92,7 +92,7 @@ void mrb_gc_mark_mt(mrb_state*, struct RClass*); size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*); void mrb_gc_free_mt(mrb_state*, struct RClass*); -#ifdef MRB_METHOD_CACHE +#ifndef MRB_NO_METHOD_CACHE void mrb_mc_clear_by_class(mrb_state *mrb, struct RClass* c); #else #define mrb_mc_clear_by_class(mrb,c) diff --git a/src/class.c b/src/class.c index c48229d8a..30f4a3e2f 100644 --- a/src/class.c +++ b/src/class.c @@ -292,7 +292,7 @@ mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super) } static mrb_value mrb_bob_init(mrb_state *mrb, mrb_value); -#ifdef MRB_METHOD_CACHE +#ifndef MRB_NO_METHOD_CACHE static void mc_clear_all(mrb_state *mrb); static void mc_clear_by_id(mrb_state *mrb, struct RClass*, mrb_sym); #else @@ -1404,7 +1404,7 @@ mrb_define_module_function(mrb_state *mrb, struct RClass *c, const char *name, m mrb_define_module_function_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec); } -#ifdef MRB_METHOD_CACHE +#ifndef MRB_NO_METHOD_CACHE static void mc_clear_all(mrb_state *mrb) { @@ -1456,7 +1456,7 @@ mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid) khiter_t k; mrb_method_t m; struct RClass *c = *cp; -#ifdef MRB_METHOD_CACHE +#ifndef MRB_NO_METHOD_CACHE struct RClass *oc = c; int h = kh_int_hash_func(mrb, ((intptr_t)oc) ^ mid) & (MRB_METHOD_CACHE_SIZE-1); struct mrb_cache_entry *mc = &mrb->cache[h]; @@ -1476,7 +1476,7 @@ mrb_method_search_vm(mrb_state *mrb, struct RClass **cp, mrb_sym mid) m = kh_value(h, k); if (MRB_METHOD_UNDEF_P(m)) break; *cp = c; -#ifdef MRB_METHOD_CACHE +#ifndef MRB_NO_METHOD_CACHE mc->c = oc; mc->c0 = c; mc->mid = mid; diff --git a/target/appveyor.rb b/target/appveyor.rb index 2336935c9..6a8dbbf4a 100644 --- a/target/appveyor.rb +++ b/target/appveyor.rb @@ -10,7 +10,7 @@ MRuby::Build.new('full-debug') do |conf| # include all core GEMs conf.gembox 'full-core' - conf.cc.defines += %w(MRB_GC_STRESS MRB_METHOD_CACHE MRB_ENABLE_DEBUG_HOOK) + conf.cc.defines += %w(MRB_GC_STRESS MRB_ENABLE_DEBUG_HOOK) setup_option(conf) conf.enable_test diff --git a/target/host-gprof.rb b/target/host-gprof.rb index c8a2f3b13..31b952920 100644 --- a/target/host-gprof.rb +++ b/target/host-gprof.rb @@ -5,7 +5,6 @@ MRuby::Build.new do |conf| # include the GEM box conf.gembox 'full-core' - conf.cc.defines = %w(MRB_METHOD_CACHE) conf.cc.flags << '-pg' conf.linker.flags << '-pg' diff --git a/target/travis.rb b/target/travis.rb index f4bef0a52..b8b04da18 100644 --- a/target/travis.rb +++ b/target/travis.rb @@ -5,7 +5,7 @@ MRuby::Build.new('full-debug') do |conf| # include all core GEMs conf.gembox 'full-core' conf.cc.flags += %w(-Werror=declaration-after-statement) - conf.cc.defines += %w(MRB_GC_STRESS MRB_METHOD_CACHE MRB_ENABLE_DEBUG_HOOK) + conf.cc.defines += %w(MRB_GC_STRESS MRB_ENABLE_DEBUG_HOOK) conf.enable_test end |
