各ブラウザのJSランタイムがどこまで再帰できるか試してみた、という。
誰でも一度は試すと思うんだけどV8がなんかtailcall最適化してそうで気になったのでためしてみました!
Windows上の各ブラウザしかしらべてません。完全にへたれです。
試したやつ
- Firefox (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1)
- Safari (Mozilla/5.0 (Windows; U; Windows NT 5.1; ja-JP) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.1 Safari/525.17)
- Internet Explorer (Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727))
- Opera (Opera/9.52 (Windows NT 5.1; U; ja))
- Chrome (Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13)
つかったコード
1秒おきに再帰した回数が表示されるというだけです。深さ制限があると途中で数字の増加が止まるはず。
<html> <head> <title>tailcall</title> <script type="text/javascript"> var c = 0; function doit() { c++; doit(); } window.onload = function() { setInterval(function() { document.body.innerHTML += c + "<br />"; }, 1000); doit(); }; </script> </head> <body> </body> </html>
結果
Firefox | 3000 |
Safari | 499 |
Internet Explorer | 2552*1 |
Opera | 9998 |
Chrome | 21838 |
Chromeだけ異常に突出していますが、それにしてもこの半端な数字はなんなのでしょうねー。
ちなみに実装的にはIEが一番まともだと思った。サイレントに再帰を中止するなんてありえないと思うのですが。
*1:「スタック領域が不足しています」というエラーが発生