JavaScript(V8)ã§é¿ããã¹ã(ã ã£ã?)ã¯ãã¼ã¸ã£ã®ä½¿ãæ¹
Grokking V8 closures for fun (and profit?) ã«ãã»ãã®å°ãã ã触ãããã¦ãã話ãªãã§ããã
ããæè¿ã¾ã§ V8 ã«ã¯ããªãã¸ã§ã¯ããªãã©ã«ã®ä¸ã§é¢æ°ãªãã©ã«ã使ã£ãå ´åã«é常ã«é ããªã(ã¨ãããGCãå¤çºãã)åé¡ããã£ãã
ãã¨ãã°ã
function doit() { for (var i = 0; i < 1000; ++i) { for (var j = 0; j < 1000; ++j) { var o = { f: function () { return i + j; } }; } } } doit();
ã¨ããã³ã¼ãã node-0.6.19 ã§å®è¡ããã¨ã以ä¸ã®ããã« mark-sweep GC ã大éã«çºçãã¦å¦çã«æéãããã£ã¦ãããã¨ãåããã
$ time /usr/local/node-0.6.19/bin/node --trace-gc ~/tmp/closure-leak.js Scavenge 2.3 -> 1.9 MB, 0 ms. Scavenge 2.7 -> 2.0 MB, 0 ms. Mark-sweep 3.1 -> 1.7 MB, 1 ms. Scavenge 4.0 -> 2.2 MB, 0 ms. (ä¸ç¥) Mark-sweep 11.7 -> 1.6 MB, 3 ms. Mark-sweep 19.8 -> 1.6 MB, 4 ms. Mark-sweep 19.8 -> 1.6 MB, 5 ms. Mark-sweep 19.8 -> 1.6 MB, 4 ms. Mark-sweep 19.8 -> 1.6 MB, 4 ms. Mark-sweep 19.8 -> 1.6 MB, 4 ms. real 0m0.892s user 0m0.871s sys 0m0.026s
ã¡ãªã¿ã«ææ°ã® V8 ã§ã¯ããã®ã³ã¼ããå®è¡ããã®ã« 30ms ç¨åº¦ãããããã¾ããã30åã®é«éåwww
ææ°çã§ä¿®æ£ããã¦ããã¨ã¯è¨ãããã©ã¦ã¶ãã¢ãããã¼ããããªã Android ã§ã¯ãJavaScript ã³ã¼ãå´ã§ã®å¯¾å¿ãå¼ãç¶ãå¿ è¦ãªæ¡ä»¶ã®ã²ã¨ã¤ã§ããã以ä¸ã®ããã«æ¸ããã¨ã§åé¡ãåé¿ãã¾ãããã
function doit() { for (var i = 0; i < 1000; ++i) { for (var j = 0; j < 1000; ++j) { var f = function () { return i + j; }; var o = { f: f }; } } } doit();
20:54追è¨: free variable ã®æç¡ã«é¢ä¿ãªã話ãªã®ã§ãä¾ãããã¾ãã