JavaScript的最大函數參數長度和最大棧深度檢測

一般代碼或許不會涉及最大參數長度和最大棧深度,但某些特殊場合,檢測這兩個參數還是有必要的。例如:用遞歸計算斐波那契數列的第n個值,不瞭解最大棧深度,難免顯得膚淺。又例如:將一串charCode轉成String,不瞭解最大參數長度,採用字符串拼接的方式,效率提不上,特別是在串較長的情況下。

以下兩個方法分別實現了JavaScript運行環境的 最大函數參數長度檢測 和 最大棧深度檢測。

不同瀏覽器的測試結果不同,同一款瀏覽器在不同機器測試結果不同,甚至某些瀏覽器連續測試時先後結果會有不同。

function getMaximumSupportedArgumentsLength(){
	var args={length:0};
	function noop(){}
	function test(n){
		args.length=n;
		try{noop.apply(null,args);}catch(e){return false;}
		return true;
	}
	function getNum(upTo){
		if(test(upTo)){
			return upTo;
		}
		var min=1,max=upTo,mid=Math.floor((min+max)*0.5);
		while(min<max){
			if(test(mid)){
				min=mid;
			}else{
				max=mid;
			}
			mid=Math.floor((min+max)*0.5);
			if(mid==min){
				break;
			}
		}
		return min;
	}
	return getNum(0xFFFFFFFF);
}
function getMaximumCallStackSize(){
	var size=0;
	function test(){
		size++;
		test();
	}
	try{
		test();
	}catch(e){
		return size;
	}
}

//Maximum Supported Arguments Length
//CH34 124782
//FF29 500000
//SF7  65536

//Maximum Call Stack Size
//CH34 20926 in <script>, 20804 in console
//FF29 21###(varies) in <script>, 49993 in console
//SF7  43517 in <script>, 43509 in console


發佈了45 篇原創文章 · 獲贊 21 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章