Javascript 铬:如何解决;超过最大调用堆栈大小;Math.max.apply(数学,数组)上的错误
我必须找到非常大的数组的最大值和最小值。我用这个Javascript 铬:如何解决;超过最大调用堆栈大小;Math.max.apply(数学,数组)上的错误,javascript,google-chrome,optimization,Javascript,Google Chrome,Optimization,我必须找到非常大的数组的最大值和最小值。我用这个 Math.max.apply(Math, my_array); Math.min.apply(Math, my_array); 它在Firefox和IE上运行得很好,但在Chrome上,我总是得到超过最大调用堆栈大小的错误。。。我当前的数组有221954个元素,这不是我最大的数组 有人知道如何在Chrome上解决这个错误吗?如何优化最大值和最小值的搜索 对于那些不相信的人,请在Chrome控制台中尝试以下内容: var xxx = [] for
Math.max.apply(Math, my_array);
Math.min.apply(Math, my_array);
它在Firefox和IE上运行得很好,但在Chrome上,我总是得到超过最大调用堆栈大小的错误。。。我当前的数组有221954个元素,这不是我最大的数组
有人知道如何在Chrome上解决这个错误吗?如何优化最大值和最小值的搜索
对于那些不相信的人,请在Chrome控制台中尝试以下内容:
var xxx = []
for(var i=0; i<300000; i++){
xxx.push(Math.random());
}
Math.max.apply(Math, xxx);
var xxx=[]
对于(var i=0;i RangeError:最大调用堆栈大小超过了对我来说,错误不应该来自对Math.min/max的调用,它看起来像是使用递归的结果,我无法相信Chrome会使用递归来实现这些函数
它们是否嵌入到递归代码中
您可以轻松地滚动自己的最小/最大代码,以避免Chrome中的问题。var a=[];
var a=[];
for(var i=0;i<1125011;i++){
a[i] = i;
}
function maxIterate(arr){
var max = arr[0];
for(var i = 1;i< arr.length; i++){
(max < arr[i]) && (max = arr[i])
}
return max;
}
console.log(maxIterate(a));
对于(var i=0;i您正在达到函数参数大小限制。它是OK。
函数应该只接受几个参数,因为其他参数是代码气味
如果您有一组项目?-使用数组。您正在使用通过的.apply()
比如:fun(1,2,3,4,5,6…)
并达到极限。这是一种糟糕的做法
问题是-Math.max()
只能这样工作,因此最好的选择是迭代搜索函数。但这是另一个主题,因为性能和算法可能会有所不同,例如,如果您首先对数组排序。此问题与Math.max和Math.min没有任何关系
Function.prototype.apply只能接收长度有限的数组作为其第二个参数
在本地,我使用Chrome进行了测试:
function limit(l) {
var x = []; x.length = l;
(function (){}).apply(null, x);
}
在本地,极限(l)正好以l=124980崩溃。在金丝雀,这是另一个数字,但也是~125k
这是一个解释为什么会发生这种情况的示例:(在其他JS引擎中也可以重复,例如MDN提到了这个问题:(以“但是小心…”开头),在WebKit bugzilla中指出了这个问题:)。据我所知,为什么在V8中抛出RangeError:
V8在汇编中实现Function.prototype.apply。在调用函数之前,它应该在调用javascript函数之前将所有函数调用参数(例如thisArg)和第二个arg数组的所有成员逐个放置到堆栈上。但是堆栈的容量有限,如果达到该限制,则会出现RangeError
这是我在V8源代码(IA-32 assembly,builtins-ia32.cc)中发现的:
请检查!!添加注释以解释我如何理解它
这是APPLY_OVERFLOW函数,用JS编写(同样是V8源代码,runtime.JS):
编辑:在您的情况下,我想:
var max = -Infinity;
for(var i = 0; i < arr.length; i++ ) if (arr[i] > max) max = arr[i];
var max=-无穷大;
对于(var i=0;imax)max=arr[i];
你可能想看看这个问题:我看到了。从那里我复制了我的两行。但是我的问题没有什么…试着向下滚动:这个答案在FF中效果很好,但在chrome中会崩溃…使用这个时,我会遇到很多jQuery错误!顺便说一句:他们提到只有在有~10行时才需要使用这个⁷ 元素,但我之前有一个问题:/On Chrome这对我很有用:for(var a=[],I=0;I<99999;++I)a[I]=Math.random()+1;a.min();
无论如何,问题与Function.prototype.apply有关-试试这个:for(var a=[],i=0;我在Chrome中调试时,它总是停在“Math.max.apply”这一行,我也不敢相信,但这是事实……我在这段代码中没有任何递归。这两行是在一个只调用一次的init函数中。什么?(maxfunction max(arr){return Math.max.apply(null,arr);}
function APPLY_OVERFLOW(length) {
throw %MakeRangeError('stack_overflow', []);
}
var max = -Infinity;
for(var i = 0; i < arr.length; i++ ) if (arr[i] > max) max = arr[i];