如何确保在拆分后获得一个长度大于1的数组?

3
我目前正在进行一个大项目(所谓的大项目是指包含许多过程),每节省一毫秒的时间都非常宝贵(从长远来看),因此我想确保我正在正确地做这件事。
那么,保证数组长度大于1的最佳方法是什么?
a) 使用indexOf(),如果结果不等于-1,则使用split()
b) 分裂(无论字符是否存在),然后只有当数组长度大于1时才进行操作
c) 另一种未上述的方法

3
每一毫秒?你把数据“保存”在哪里? - Jared Farrish
1
最好的方法是在Chrome/Safari开发者工具、IE8,9开发者控制台、Firefox/Firebug中进行性能分析。 - Michael Berkowski
Jared Farrish,我的意思是,那些毫秒(经过几千个循环后)会变成“秒”。 - ajax333221
2
首先,摆脱“成千上万的循环”怎么样? ;) - c69
4
想要找到答案,唯一的方法是对不同的方式进行基准测试(http://jsperf.com/)。虽然我并不认为它有太大的差异,但我会选择第二种方法。 - Felix Kling
显示剩余3条评论
3个回答

0
使用jsPerf,似乎在超过500,000次迭代中省略.indexOf()比包含它要高效约23%(每秒11.67次操作 vs. 8.95次操作): 没有indexOf()
var str = "test";
for (var i = 0; i < 500000; i++) {
    var test = str.split('.');
}

使用 .indexOf() 方法:

var str = "test";
for (var i = 0; i < 500000; i++) {
    if (str.indexOf('.')) {
        var test = str.split('.');
    } else {
        var test = str;
    }
}

http://jsperf.com/split-and-split-indexof

编辑

嗯... 如果以下行是:

if (str.indexOf('.') > -1)

http://jsperf.com/split-and-split-indexof-with-indexof-check

或者其他的比较,看起来它会快很多(大约快69%)。

我能想到的唯一原因是,在每个变量上运行.split()将对每个值执行两个功能(查找,然后分离),而不是仅在必要时执行一个。请注意,最后这部分只是一个猜测。


使用像你这样的IndexOf是非常聪明的。我也会开始像你那样使用它(因为我认为由于你的声望分数,这种使用方式是安全的)。感谢你教我这种新方法(即使你没有打算这样做):) - ajax333221
不知道你的确切用例,我会说你真的不需要.indexOf(),而且调用它会有开销(尤其是如果你有一个很长的字符串值)。既然你无论如何都会得到一个数组.split(),我不明白为什么你不能省略.index() - Jared Farrish
@ogps92 - 请看我的编辑。令人困惑的是,一旦我实际测试了.indexOf()值与另一个值(例如> -1)进行比较,使用.indexOf()会更快一些。 - Jared Farrish
请查看此链接以获取更接近我所需功能的版本:http://jsperf.com/split-and-split-indexof-with-indexof-check/2(请注意,如果您使用“split”和“indexOf”来按字符拆分字符串,而该字符在“str”中不存在,则性能会发生变化) - ajax333221
@ogps92 - 看看这个:http://jsperf.com/split-and-split-indexof-with-indexof-check/4 你可能需要通过真实世界的数据来检查,才能得出一个“明确”的答案。 - Jared Farrish

0
我们可以看到,即使有东西需要分割,最好的结果也是通过对值进行indexOf测试得出的。但是改进仍然不如100%的项目不需要分割的情况。因此,随着需要拆分的项目数量的增加,测试的收益会减少(这是可以预料的)。因此,这真的取决于用例,因为额外的代码会占用内存并使用资源。

http://jsperf.com/split-and-split-indexof/2


-1
(b) 显然比(a)更高效,因为split使用与indexOf相同的逻辑,如果确实有超过2个元素,则不需要重复该逻辑。我想不到更有效的方法。

使用.indexOf()可能会更加快速: http://jsperf.com/split-and-split-indexof-with-indexof-check - Jared Farrish
“.length” 是一个属性,我认为它不总是被更新,所以它并不是很可靠。 - vol7ron
@vol7ron - 这个答案中提到了.length吗?还是你指的是其他什么东西? - Jared Farrish
@JaredFarrish:b) split(无论字符是否存在),然后仅在 array.length 大于1时执行操作 - vol7ron
@vol7ron - 哦,我明白了。我认为这是因为原帖太具体了(因为他们不一定需要.length)。 - Jared Farrish
忽略 jsperf 测试驳斥我的答案 - 它的唯一测试字符串仅涵盖不分割的情况。原帖的代码将遇到两种类型的示例,即可以分割成多个字符串和无法分割的字符串。我推荐使用(b)的答案考虑了这两种情况。对于可以分割成多个字符串的情况,不使用 indexOf() 显然会更好。净收益取决于各种因素(也许 jsperf 爱好者可以提供一个混合这两种类型的良好测试用例);我的经验是在整体上不使用 indexOf。 - necromancer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接