観å¯æ¥è¨ 2011-07-15
Macä¸ã§ã®ãã³ããã¼ã¯çµæéå ±
http://www.atdot.net/sp/readonly/nfbnnl_kosaki0
Macä¸ã§ã®ãã³ããã¼ã¯çµæéå ±
ããã¯ãã¼ã¨
ä¸çªä¸ã ãè¦ãã°ããã®ã
ã¯ã
åºæ¬çã«ã¯ãè¥å¹²æªåãã¦ãããã¨ã
ç¨ã«éããªã£ã¦ãã®ããããªã
vm_thread_mutex3 ã¯ãªãã
ãã¨ãvm3_clearmethodcache ããªãã
cleanmethodcacheã¯ããã ãããã¡ã½ãããã£ãã·ã¥ãããã£ã¨å¤ããå½±é¿
vm_thread_mutex3ã¯ï¼ï¼ï¼ï¼ã¹ã¬ãããï¼ã¤ã®mutexã奪ãåããã³ã
é ãã£ã¤ã£ã¦ããã ã¼ã¶ã許ããç¯å²ã ã¨æãã¾ãã§ãã
vm_thread_mutex3hã¯çããã®åªåã®ææãã
ã§ãã
ã»ã¨ãã©ã®ãã³ãã¯ã·ã³ã°ã«ã¹ã¬ãããªã®ã§ããã®ã¸ãã ãã193ã®ææ
...
çããã¦æ¸¬å®çµæãç¡æå³ã«ãªã£ã¦ããã³ãå ¨é¨ã«ã¼ãåæ°ãµãããã£ã
ããã¯ããã¤
{znz_v} biff: [ruby-changes:20308] kosaki:r32356 (trunk): * benchmark/bm_app_erb.rb: increase loop count. too short - http://mla.n-z.jp/?ruby-changes=20308
Linuxã§ã®çµæ
app_answer ã¯ã¸ã§ã¼ã¯ãã³ããã¼ã¯ãªã®ã§
æ¶ããæ¹ãããããããã¾ãã
ã¹ã¬ããï¼ã¤ã®æã«é ãã®ã¯lazy timer threadã®å½±é¿ããããããããªãã®ã§ã調ã¹ãã
app_answerã¯æ¶ããããããã§æ§è½è² ããã¨è ¹ããã¤ãã©ããã³ãã®ã½ã¼ã¹ã³ã¼ãèªãã¨ç´ãç¨ããªãã¨ããçµè«ã«ãªã£ã¦äºéã«è ¹ããã¤ã¨ãã
vm_thread_create_join ãæ§è½è½ã¡ã¦ãã®ãããã¾ã身ã«è¦ããªããã ãã©ãããã ããä½ãæãã¤ãã¾ãï¼
Linuxã§ã®çµæãã§ãããã
paste>
{ko1_ndk} http://www.atdot.net/sp/readonly/39pnnl_kosaki0
å¦å®ã«æªåãã¦ããªã
å°ãã¾ããªã
ãã¼ããthread_mutex2ãé ãã®ã¯ãlazy timer thread㨠gvl_yield ã大å¤ç¸æ§ãæªãã¨ããçµè«ã«ãªãã¤ã¤ãã
観測äºå®ã¨ãã¦ã¯context switchããããå¢ãã¦ããã®ã¨ãruby-192ã§CPU 99%使ç¨ãtrunkã¯150%
ãããã³ããã¼ã¯
ãªããæ¬å½ã«ããã 1.9.3 é ãã
vm1_rescue* 0.111 -0.193
ãã¤ãã¹
ãã®çµæãããã¡ãã£ã¨è¦ããããªãããããã
vm3_clearmethodcache 4.957 1.159
vm3_gc 2.176 5.464
ãã㯠whileloop1 ã®çµæãå¼ãã¨ããè¨è¨ãªã®ã§ãå¤ãå°ãããªããããã¨èª¤å·®ã§ä½è£ã«ãã¤ãã¹ã«çªå ¥ãã
ãã®è¾ºã¯èå³æ·±ã
vm3_gcã¯nari3ã«ã¿ã¦ã£ã¦ãã£ãï¼ ãã
loop_whileloop ããããªã«é ããªã£ã¦ãã¨ã
column -tã§
ã¤ã³ãã³ãããªãã ãã©ãç®ã§æ°å¤æ¯è¼ããããªã
æ¯çãèªåè¨ç®ã£ã¦ã§ãããã ããã
ããããã®é度ä½ä¸ã¯åå ããããªãéã blocker ã¨å¼ã³ããã¬ãã«ã ãª
ç¹ã«ã©ããåé¡ã«ãã¦ãã¾ãï¼
å ¨ä½çã«ãã£ãããã¦ãã®
ç®ã§æ°å¤æ¯è¼ããå°è±¡ã ããæ¬å½ã«å ¨ä½çã«é ããªã£ã¦ããã®ãã¯ããããããªã
æåã®æ¹ã«é ããªã£ã¦ãã®ãå¤ãã ãï¼
ãããå ¨ä½çã«é ã
åå ãäºæ³ããã
ããããã³ãããããã¨ãã¯ãèªåã®å¤æ´åå¾ããæ¯è¼ãã¦ãªãã£ãããæ°ã¥ãã¦ãªãã£ã
1. GC
ã·ã³ã°ã«ã¹ã¬ããã§ãé ãã®ã¯GVLãã¿ã¤ãã¼ã¹ã¬ããã¯ç¡ç½ªã£ã½ã
thread_mutex2ã®ã¤ã¥ããgvl_acquireããã®rb_thread_wakeup_timer_thread() ã§ã¿ã¤ãã¼ã¹ã¬ãããèµ·ãããã¾ãã£ã¦ãã®ã¯ç¢ºå®ãtimer_thread_functionã¯ã¨ã©ã¤æ°å¼ã°ãã¦ããgvl_yieldãããã»ã©å¼ã°ãã¦ãªãã®ã¯main threadãæ¾ããªããããinterrupt_flagç«ã¦ã¾ãã£ã¦ããããããããããã¯ãªããã
é度å£åã¯ãã£ã¡ã§ãåç¾ããã£ã½ããªã
ã¾ã ããããéä¸ã ãã©
vm_thread_mutex3 84.002 2.766
http://www.atdot.net/sp/readonly/kgtnnl
ãã¡ã§ã®çµæ
ãã£ã±ãå ¨è¬çã«193ãé ããª
strace ããã write(4, "!", 1) ã¨ãã§ã¦ãã®ã¯ã¿ã¤ãã¼ã¹ã¬ããããã
ã·ã°ãã«ãããã¨ãã¨ãGVLå¾ ã¡ã¹ã¬ãããï¼ããï¼ã«å¤åããã¨ãã«writeãã¦ã¾ã
ã§ãããã¼
ãªã«ãåç¾ããªããªã£ã
ãï¼ > åç¾
å ¨ãä½ãå¤ãã¦ããªãããã©åç¾ããªããªã£ã
benchmark/bm_app_mandelbrot.rb ãç´æ¥å®è¡ãã¦ã¿ã¦ããã ãã©ã
é度ä½ä¸ãï¼ ããã¨ãããããããã°ï¼
é度ä½ä¸ãã
ããããä¸æè°ã
benchmark/bm_app_mandelbrot.rb 以å¤ã§ã¯åç¾ãããã¤ãããã®ããª
å make benchmark ä¸
http://www.atdot.net/sp/readonly/5qunnl
ãããªã«é¡èãªå·®ã¯è¦ã¦åããªããªã£ãããããªæ°ããã
ãªããx86_64ã®ã»ããå·®ãã§ããæ°ããã
io_file_read ã¯ç¢ºå®ã«é ããªã£ã¦ããæ°ããã
ãããããªããdo_selectã§rb_fdset_t対å¿ããããªãã£ãã®ãç´ãããã¤ãããã§æ¯åmallocããããã«ãªã£ã¦ãã¾ã£ãã®ã§ã»ã»ã»
æé©åãããã¤ããã
max = 200_000; len = 1000 ã
max = 20_000; len = 10000 ã«å¤ãã㨠trunk ã®æ¹ãã ãã¶éããªã£ã
ã©ããããã¨ã ãã
^^;;;;
maxãæ¸ããã¨éãã¨ããã®ã¯ããã£ã±ãreadãã®ãã®ãé ããã ããª
lenã¯stringæä½ã«ãããã§ããé¨åã ãããã ãããstringãæé©åãã
io ã®åå¦çãå¾å¦çãé ããªã£ã¦ãèªã¿è¾¼ã¿é¨åãéããªã£ã
blocking_region ã¨ãé¢ä¿ãªããã
ãã
gvl_acquireããã¾ã¾ã§ãpthread_mutex_lockã ã£ãã®ããmutex_lock, unlockã®äºæé ã«ãªããgvl_releaseãåã
ãªã®ã§ãgvl ãåã£ããé¢ããããç¹°ãè¿ãIOç³»ãã³ãã¯ãããã¯è² ããã®ã¯äºæ³ã§ãã
ã§ããreadã¨writeã§è½ã¡æ¹ãåããããªãããã«è¦ããã®ã§
ããã¡ãã£ã¨èãã
write ã¯å¥ã«å½±é¿ãªãæ°ã§ãã
ãããããããã¡ãããããã¯ãããä½ã£ãã¨ãã«ç´åã®ã³ãããã¨æ§è½æ¯è¼ãããã ã£ããruby-dev:43465 ã®æ·»ä»ãè¦ãã¨readãwriteãã¡ãã£ã´ãè½ã¡ãç¨åº¦ã®æ°å¤ã«ãªã£ã¦ã
åå 㯠rubygems
åå 㯠rubygems ã®ããã§ã
$ time ./ruby --disable-gems benchmark/bm_io_file_read.rb
real 0m4.069s
$ time ./ruby benchmark/bm_io_file_read.rb
real 0m4.970s
rubygems ãä½è¨ãª (ãã©ããã¯ããããã©) Array ããã£ã±ãä½ã£ã¦ãããã§
ãã®ãã㧠GC ãé ããªã£ã¦ãã
$ ./ruby --disable-gems -e 'GC.start; p ObjectSpace.count_objects[:T_ARRAY]'
18
$ ./ruby -e 'GC.start; p ObjectSpace.count_objects[:T_ARRAY]'
597
ããããã¨ãã«ãªãã¸ã§ã¯ãã®çæå ç¥ããããª
ç¥ãããã£ããã¼
r27016
{unak_away} http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27016
ããã®ãã㧠attr ãã¨ã«é åãã§ããããã«ãªã£ã¡ãã£ã¦ã
ãã㧠597 -> 527 ã«ãªã£ã
ãããæ¶ããã
ã¨ãããããã® ary ã¯çã§ã¿ãããã¾ããäºæããã
ããããå¤ãã£ã¦ããã© vm_method.c ã®å¤æ´ãéè¦
å測å®ãã¦ããã©ã--disable-gemsã¤ããã192ã¨trunkã¯ã ãããäºè§ã®æ§è½ã£ã½ã
ããããããæ°ã¥ãã¾ãããããããã¼
GC::Profiler ããã®ããã
1. GC ã¨äºè¨ããã¨ããã§ã¯ãã£ã
ã§ã rubygems ã®äººãã¡ã«é åãããã·ã¥ãä¿æãããªã£ã¦è¨ã£ã¦ãèããªãã ãããª
ããã1.9.2 ã®ã¨ã㯠gem_prelude ããã£ãããã
preludeãªãã¦ãæ§è½ã«å½±é¿ãªãã£ã¦è¨ã£ãããããããããããªãã£ããã
Array ãåå ãã¯ããããªããã©ãªãã¸ã§ã¯ãæ°ãåå¢ãã¦ããããª
ä¸ä»£å¥ GC ã§ãã¦ãªã以ä¸ããã¤ã¯ããã³ããã¼ã¯ã«ã¯ã¯ãªãã£ã«ã«ã«å½±é¿ãããã
ãã¤ã¯ããã³ããã¼ã¯ä»¥å¤ã«å½±é¿ãªãã¨ããããããããªæ°åãããªãã¨æããã ã
1.9.2 ã§ã rubygems 使ã£ã¦ãå ´åã¯ãããªããã ã£ã
ã¨ãããã¨ã«ãªããã ã¨æã
ãããã©ããæ¬çªã§ã¯gemã¤ããã§ããï¼ã£ã¦äº
ã¤ã¾ãã¼ãã®ãã㪠ProjectEuler ãã人ã¨ããå°ãããã
ãã¾ããï¼
声ããããã¹ãã§ã
ProjectEuler ç¨ã®ã©ã¤ãã©ãªã gem ã«ã¾ã¨ãããã¨ãã¦ããã¨ããã§æ²ãã
gem ã C ã§æ¸ãç´ããã
rubygems ã C ã§æ¸ãç´ããã
æ¦ãç¸æã Ryan ã«ãªãããã ããªã
ããã¦GCã¸
GC å´ã§ãªãã¨ãããããã¨ããã®ãæ£ããã¨ã¯ã¼ããæã
ä¸ä»£å¥ GC å°å ¥ãããªãã¨æãã
ããã¦ããã«ã¯å ¨æ¡å¼µã©ã¤ãã©ãªã§ã®å¯¾å¿ãå¿ è¦
Ruby ããã
ãªã¯ã¿
æ¡å¼µã©ã¤ãã©ãªãã¤ããããªã
ãã£ã±ãä¸ä»£å¥ GC ãããã°è§£æ±ºã§ãããã
ä¸ä»£å¥ GC 対å¿ããã°ä¸¦åãã¼ãã³ã°ãå¯è½ã«ãªãã®ã§
G1GCãã±ããã
Ruby ã®æªæ¥ãèããã¨å ¨æ¡å¼µã©ã¤ãã©ãªãä¸æ¦æ¨ã¦ãé¸æè¢ãã¾ããã«èããã¹ããªã®ãããããªã
äºææ§ã¶ã£å£ãã®ã¯ãããã ãã©ã
ä¸ä»£å¥ã¨ä»ã¿ãããªæ¡å¼µã©ã¤ãã©ãªã£ã¦ä½µåã§ããã®?
ã¡ã³ããã³ã¹ããã¦ãªãæ¡å¼µã©ã¤ãã©ãªã¯åãæ¨ã¦ã¦è¯ãã¨æãã¾ãã
VALUE ãã¤ã³ããã¯ã¹ãªããVALUE ãç¹æ®ãªä½¿ãæ¹ãã¦ããªããã°å¤§ä¸å¤«ãªããããªãã£ãã£ã
ãããããã
ä»ã¿ãããªã£ã¦ï¼
ãã¤ã³ã¿ãã®ã¾ã¾å¤ã«æã£ã¦ãã
ä¸ä»£å¥ãããªãã¦ã³ãã¼/ã³ã³ãã¯ã·ã§ã³ã
ãã¼ã
åç §ã¯ã§ããããããããã©æ¸ãæãã¯å¤åãã¡
ãªãã¸ã§ã¯ãã® mark å ãå¤ãããããªå¤æ´ãããæã«
å ·ä½çã«ã¯ RARRAY_PTR(ary)[idx] = elem; ã¨ã
å¤æ´ãããã¼ã£ã¦ãã¨ã GC ã«æãã¦ãããããã«ããªãã¨ãããªã
ãããVALUE ãéä¸ã§å¤ãããã£ã¦å¿é ã
ããã£ã
æªå¯¾å¿ã®æ¡å¼µã©ã¤ãã©ãªã«ãªãã¸ã§ã¯ãã渡ãã¨æ±æããããã©ã°ã¨ã
æªå¯¾å¿ã®æ¡å¼µã©ã¤ãã©ãªã«æ¸¡ã£ããã©ããåããã®ããª
æªå¯¾å¿ã¨ããããã¾ã対å¿ãã¦ãæ¡å¼µã©ã¤ãã©ãªã¯ã©ãæ¯ãèãã°ããã®
ãã£ãè¨ã£ãããã«ã©ã¤ãããªã¢ãå®è£ ãã
ã§ãã¤ã³ãã¯ã¹ãªã大ä¸å¤«ã£ã¦ã¯ãªãã
ãããã§æ¸ã¾ãªãããªãã
æ±æããããªãã¸ã§ã¯ãããåç §ããããªãã¸ã§ã¯ããä¸æ°ã«æ±æããããã¨ã«ãªã
ãã¨ã°ãã¼ãã«ã«åç §ã§ãããªãã¸ã§ã¯ãã
ãã¶ãã»ã¨ãã©æ±æ
ãã¤ã³ã¿ã®ããã ã¨å ¥ããVALUEã®å ãå¥ã®å ´æã«è¡ã£ãããã¡ã«
VALUE ãã¤ã³ããã¯ã¹ã«ããããå ¨ä½çã«é ããªãã¨æãã®ã ãã©ãã©ã®ãããé ããªãã®ãæ°ã«ãªã
ã¤ã³ããã¯ã¹ã«ããªãã¦ãããã¨æãã
移åãããªããã°ãããæ§è½åä¸ã®éã¯æ¸ããã©
ã§ã RObject ã«ãã¤ã³ã¿ 1 ã¤ã 2 ã¤ããããªãã¨ãã¡ã ã£ããã
移åãããåæã§ã©ãããããããã£ã¦è¨ã話ã ã£ãã®ã§ï¼ãããã¯ï¼
移åããããã
ããããããã¯é¢ãããããªã
ã¨ããã£ã¦ãã¾ã
ã¼ããé¢ãããããªã
Ruby ããã
ç¾å®è«ã§è¨ãã°ç§»åããªãã®ã妥å½ãªã®ã¯ã¾ãããããã£ã¦ã¦ã
ãã¨ã nari ããã®ããããã«ããã£ã¦ãã
ã¼ãã移åãããããã ã¨æã£ã¦ã
ããããã¨æ¯è¼ç夢ã®ãªãæ³¥èã話ã«ãªãã®ã§ãã¾ãã¾ãé¢ãããããªã
ããã£ã¨å¤ãããªãèå³ããªãããã§ããªããã¨ãããããæã
slap ã§å®é¨ããã
GC ãªãã¦å ã æ³¥èãã¨æã
agree
é ãã¨æå¥ã¯è¨ããããéãã¨è¤ãããããã¨ã¯æ» å¤ã«ç¡ã
é¢ãã人ã®æ°ããããªã (ã
ä½ã£ããªãã¸ã§ã¯ããä¾ãã°RARRY_PTR(hoge)[n]ã¨ãã«å ¥ã£ããã©ãããåãããªãã¨ãã©ããã¦ãéããªãããããªã
ã ãã hoge ãå¤æ´ããããã¨ãç¥ã£ãã
hoge ãå¤æ´ãããã¨ã¨ GC ã«éç¥ããã
preludeãã§ã¼ãºãçµãã£ãã¨ããã§ä¸åº¦GCããã¦ãããã§çãæ®ã£ããã¤ãã¯ãã£ã¨markãã£ã±ãªãã¨ãã«ããã¨ã
GC 㯠hoge ã®å ããã§ãã¯ããªããã¦ããã
å¤ãä¸ä»£ã®ãªãã¸ã§ã¯ãããåç §ãããæ°ããä¸ä»£ã®ãªãã¸ã§ã¯ãã¯å¼·å¶çã«å¤ãä¸ä»£ã«ãªã£ãããã
ã¦ããããRubyã®VALUEã®å ã£ã¦ãµã¤ãºæ±ºã¾ã£ã¦ããã ããã
ã³ã³ãã¯ã·ã§ã³ã¯å¿ è¦ãªã ï¼å®
RVALUEã¨ãã
ãããã
ã¹ããããååã§ããã®ã¨ã§ããªãã®ã®å¤§ããªéãã¯ãã
Ruby ã§ã¯ heap ã¨ãããã ã£ã
ã³ã³ãã¯ã·ã§ã³ãããªã VALUE ã¯ã¤ã³ããã¯ã¹ã«ãªãã
ä½ãæã¯ãªãããã
ãããã«
JNIã ã¨ã©ããã¦ãã ã£ã
ã§ããã¤ã³ããã¯ã¹ã«ããã«ãã¦ããã³ã³ãã¯ã·ã§ã³ã®ã¢ã«ã´ãªãºã ã¯é£ããã ãããªã
ã³ãã¼ GC ãªãã³ãã¼ããã ãã ããåççã«ã¯åç´ã ã
å®éã®å®è£ ãã©ã®ãããé£ãããã¯ããã
Javaã®ãªãã¸ã§ã¯ãããã®ã¾ã¾è¦ãããããããªããã¾ãããã ãª
ã³ãã¼ãã¦ã¢ãã¬ã¹ãå¤ãã£ãã¨ããå ¨é¨æ¸ãæããªãã¨è¡ããªãããããªã?
ã£ã¦åæèªãã¦ãªãã£ã
ã¤ããã ãï¼ãããã¤ã³ããã¯ã¹è©°ããªãã¨è¡ããªããããª
GCæ¬èªãã
ã¤ã³ãã¯ã¹ã¨ãã©ãå®è£ ãããã ãã
hash ã¿ããã«ãªããããª
ã ã¨ããã£ã
ã¹ã¼ãã¼é ããã ãª
åã®ã¤ã¡ã¼ã¸ã§ã¯ãåºå®ãµã¤ãºã¹ãããå ã®ã¤ã³ããã¯ã¹ãæããã¦ãã³ã³ãã¯ã·ã§ã³ããã¨ãã¯åãã¤ã³ããã¯ã¹ã§ç©ºãã¦ããå ´æã«ç§»åããäºãèãã¦ãã
ããã ã¨ãã©ã°ã¡ã³ãã¼ã·ã§ã³è§£æ±ºããªãããã ãã
ã³ãã¼ GC ããæå³ãæ¸ãããã ã
ããããã©ã°ã¡ã³ãã¼ã·ã§ã³ã®è§£æ±ºãã¨ã¦ãé£ããã
ã©ã®ãããæ¸ããã¯ãããªã
å®éã«ä½ã£ã¦è©ä¾¡ãã¾ãããããªãã
ãããããããããªãã
給æåºããªããã
300 åæããã 3 æ¥ã§ãã®ã
><
711ã®ãããã
æ給1000åã¨ãã¦ã
3æ¥ã§72æéã
1 æéã§ãã®ã
ãã®åºã§ä¸çªããGCããã®ã
tweet ããã£ã¦ããããããããªã @nari3 次第ã«ãªã£ã
è¤æ°ã¾ããtweetã¯ãããè² ãã ã¨æã£ã¦ã
ãããè² ãã
http://www.fireproject.jp/feature/jni/class-object/reference.html
ãJVMã¯ãã¤ãã£ãã³ã¼ãã«æ¸¡ããåç §ã«é¢ããæ å ±ããã¼ãã«ã«ä¿æãã.ããã«ãã,JVMã¯ããã¤ãã£ãã³ã¼ãã§ãã®åç §ã使ç¨ããã¦ããããGCã®ã¨ãã«æ³¨æããªããã°ãªããªã(åé¤ã移åããã¦ã¯ãããªã)ããã¨ããããã
ããã©ããã
ãããããã¨ã¯å¯è½ãªã®ã ãª
ã¾ãã§ããã³ã¢é¨åã ãã§ãåå
VALUE ãå¤ãããããªãã¦ã®ã«ã¯èããããªãã¨æã
æã ãã
ã§ãå¤ããã®ã£ã¦GCã¾ããã ã¨ãã ãã ãã
ã©ãã ã£ã
VALUE str=rb_str_new(); VALUE ary=rb_ary_new() /* ããã§GCï¼ */; rb_p(str) //=> SEGV
ããã
Java ã®ã³ã¢ã¯ã©ããã£ã¦æ¸ããã¦ããã ï¼
ã³ã¢ã£ã¦JVMï¼ããã¶ããï¼
JVM
C++ã£ã¦ãã£ã¦ããããª
ä¸ã®ãããªç¾è±¡ãçºçããã¨ãããã¾ã¨ãã«ããã°ã©ã æ¸ããªããã
ã ãã Java ã¯ã»ã¨ãã© Java ã§ããã¦ãé¢ãããã®ããª
ãªã®ããªã
strã¯ãã¼ãã«ç»é²ããã¦ã¦åãããã«SEGVããªãããããï¼
ãã¤ãã¼ãã«ç»é²è§£é¤ããããã ãã
ã ã¨ããã¨ãã»ã¼å ¨ã¦ãã¼ãã«ç»é²ããã¦ãæ°ããã
å¤ã«æãããï¼
大å¤ã§ããªã
returnããã解é¤ãããã
Rubyã¯Ob(ry
return ããããã¨ã C++ ã§ã§ããã ããã
解é¤ããé¢æ°ãæ示çã«å¼ã¶ããããªãããã
ããã¦è§£é¤æ¼ã
解é¤æ¼ããã¦ãæ»ã«ã¯ããªãããª
äºå®ä¸ã®ã¡ã¢ãªãªã¼ã¯ã ããª
å¼ã¶å´ãããã¼ãã«ä½æãå¼ã³åºããåé¤ ããã£ã¦ããã¨æãããã
å¤é¨ã©ã¤ãã©ãªãå¼ã¶é¨åã¯ã
ãã£ãã® str ã¯ã³ã¢å é¨ã®è©±
å é¨ã§ãåæ§ã«ããã®ããª
vm_call_hogeãããã
å é¨ã¯ã©ããããã ããªãï¼
ãã ãã¹ã¿ãã¯ã«ä¹ã£ã¦ãVALUEãã©ããããããããããã©
ã¾ãããã
http://d.hatena.ne.jp/spider-man/20080309/p1
ã¨ããããString#equalsã¯Javaã§ãããã¦ããããã
http://blog.goo.ne.jp/muraokasemi/e/bdd3472b362941971ce13f6cd1eab3f7
ãµã
é ããµã£ã¨âãã¦ãã
Java ã¯ç¸å½ãªã¨ããã¾ã§ Java ã§æ¸ããã¦ããã
å®æã«ãC åãã¦é«éåããªãã¦èããªããªãã®ã§ããé¸æã¨è¨ãããããããªã
çµè«: ãã£ã±ãæ代ã¯JRuby
Java ã£ã¦ã©ããªããã ãã
ä¸å¿ã¡ããã¨æè³ããããããªãã§ããããããããã«
ã¾ããããããã³ãã¼GCãã³ã³ãã¯ã·ã§ã³ã¯æ¡å¼µã©ã¤ãã©ãªä»¥åã«ã
俺ããæ»ã¬ã¨ããç¥è¦ãå¾ã
çµè«: Ruby ã«æªæ¥ã¯ãªã
IronRubyããã£ã¦ãããã»ã»ã»ï¼
IronRuby 㯠JRuby 以ä¸ã«çµãã£ã¦ãªãã£ãã£ã
ä¸å¿éçºç¶ãã¦ãã
å¥ã« JRuby ã¯çµãã£ã¦ãªãã
å°ãªãã¨ãæ°æ¥ã«1éãã¼ã¹ãããã§ã¡ã¼ã«ãæµãã¦ããããã
YARVã®é«éå
YARVã®ãã¤ãã³ã¼ãããã£ã¨ã¢ã°ã¬ãã·ãã«æé©åãããããªã
æ¢ã«ç¨æããã¦ããæé©åãªãã·ã§ã³ãåãããã«ã¡ã³ãããã¨ããã
ãªã«ãå¹ãã¦ä½ãå¹ãã¦ãªããã ã
see vm_opts.h
æ«å°¾å¼ã³åºãæé©åã0ã
ã¾ããååã¸ã§ã¼ã¯ã§ããããã
æ«å°¾ Proc#call ãæé©åãããã§ãã
ã¨ãããããå®è¡ãããããã°ã©ã ã«ãã£ã¦ç¹åå½ä»¤ãå¤ãã¦ã
å°ç¨ã®YARVã§åããã¨ããããããªãã§ãããï¼
æ«å°¾æé©å㯠set_trace_func ã¨ããããããã¡
opt_helloããã¯ãããã
opt_eular_1ãã
ããã ï¼
set_trace_funcãããã¨ãªããã¡ãªã®ã
常ã«Cã¨ã»ã¼åé度ã§ã
def foo; set_trace_func; end
ã¨ããã¨ãã« foo ã® return ãåããªã
trace å¼ã³åºããã¯ãã¾ãããæ«å°¾ã«ãªããªã
ãã¨ããã¯ãã¬ã¼ã¹ãèªã¿ã«ãããªãã
Scheme ã®ããã¯ãã¬ã¼ã¹ã¯ãã¤ãèªããªã
ã¾ããããã¯ãC 㧠omit-frame-pointer ããã®ã¨ä¸ç·ã§ãã
ãã®ã¨ãã¯-O0ã§
æé©åé¨åã«ãã°ããã£ã¦æ³£ã
ããã¯ãããããã¨
ãããªã Ruby çã«ã¯ããã©ã«ã -O0 ã ãã
Rails ãªã容赦ãªã -O6 ãããã§åãããã¨ãã¦æ²¢å±±ãã°ã¬ãã¼ãåºãã¦ããããã
ããããã°link time optimizationã§ã¶ã£ãããã¦ããª
-O6ãã©ã®è¾ºããåãããªããã©ãåä½ä¿è¨¼ããªããã°ãªãªã¼ã¹ã«ã¯åé¡ãªãw
Rails ã£ã¦ RubyVM::InstructionSequence.compile_option= ã¨ãããã£ã¦ãï¼
ãããã«ããã¯ã»ã»ã»ã©ãã ãã
ãããã«ãã£ã¦ãªãã§ãããã
容赦ãã
æ¬å½ã«ãã£ã¦ãªããããããã©
ããããããã£ã¦å¹æãããããããã
OPT_INSTRUCTIONS_UNIFICATION ã¨ãã¯ãããªããããªããããªããããª
Railsã§ä½ããããã¤ãã³ã¼ãã§çµ±è¨ã¨ã£ã¦ã
ç¹ãå½ä»¤ãoperands/insns unificationãæ´åããã°ã ãã¶
Railsãããªãã¦eularã§ããã¨ãããã§ãã