Javascript 在数组中处理空字符串。chrome中的排序(?)回调非常慢
在js中,我必须对很多数组元素进行排序(100k-1kk)。 İ在生产中可能有许多空白('')字符串 在我的排序函数中,我处理空值,所以这些值总是最后一个。。直到i在数据中有许多空值、未定义值或空白(“”)值 例如,如果数据有许多空值或空白字符串,则性能会非常慢。 最主要的是,这个片段在Chrome上的速度非常慢(至少是现在的最新版本49.0.2623.110米) firefox(45.0.1)运行得非常好(即使使用标准案例没有空数据,我的测试x10速度也会更快??) 只需使用chrome和firefox进行测试 另外,我知道jsperf更适合这样做Javascript 在数组中处理空字符串。chrome中的排序(?)回调非常慢,javascript,performance,google-chrome,sorting,is-empty,Javascript,Performance,Google Chrome,Sorting,Is Empty,在js中,我必须对很多数组元素进行排序(100k-1kk)。 İ在生产中可能有许多空白('')字符串 在我的排序函数中,我处理空值,所以这些值总是最后一个。。直到i在数据中有许多空值、未定义值或空白(“”)值 例如,如果数据有许多空值或空白字符串,则性能会非常慢。 最主要的是,这个片段在Chrome上的速度非常慢(至少是现在的最新版本49.0.2623.110米) firefox(45.0.1)运行得非常好(即使使用标准案例没有空数据,我的测试x10速度也会更快??) 只需使用chrome和fi
data=[]
var i=0;
(i++为了确保比较器始终为每对值返回逻辑答案,您必须添加两个值均为空的情况:
data.sort(function(a,b){
var anull = (a == '' || a == null), bnull = (b == '' || b == null);
if (anull && bnull)
return 0;
if (anull)
return 1;
if (bnull)
return -1;
return (parseInt(a) - parseInt(b));
})
请注意,您不需要对null
和undefined
进行显式比较;比较==null
与比较==null
和==undefined
完全相同
我确保您告诉排序算法,当两个值都为空时,它们可以被单独保留(通过返回0
),您可以避免在某些奇怪的情况下来回抖动
另一种可能会加快速度的方法是通过数组进行单次传递,将所有空条目转换为某个值(可能null
;无所谓),将所有非空条目转换为实际数字。这样,排序就不会付出将字符串反复转换为数字的代价(也就是说,对parseInt()
)的所有调用。如果您希望数组是字符串,则可以在随后的一次传递中将其转换回。如果您不发布代码,则不太可能有人能帮上忙。抱歉,发布代码:)问题是你的排序比较函数不一致,这可能会导致排序算法变得疯狂。对于相同的两个值,你的比较器必须总是返回完全相同的答案。哇,无论我怎么尝试,玩你的fiddle Chrome都比Firefox慢得多。这真的很奇怪。编辑哦,等等,不,我只是没有向下滚动,看到所有其他的.sort()
调用:)
data.sort(function(a,b){
var anull = (a == '' || a == null), bnull = (b == '' || b == null);
if (anull && bnull)
return 0;
if (anull)
return 1;
if (bnull)
return -1;
return (parseInt(a) - parseInt(b));
})