Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript字符串拆分:固定宽度与分隔性能_Javascript_Arrays_String_Performance_Split - Fatal编程技术网

JavaScript字符串拆分:固定宽度与分隔性能

JavaScript字符串拆分:固定宽度与分隔性能,javascript,arrays,string,performance,split,Javascript,Arrays,String,Performance,Split,我正在构建一个字符串,通过JavaScript将其解析为数组。我可以将其分隔,也可以将字段设置为固定宽度。为了测试它,我使用一个数据字符串构建了这个jsperf测试,其中字段都是固定宽度和逗号分隔的: 我只在使用Firefox和Chrome的Windows上进行过测试,所以请在其他操作系统和浏览器上运行测试。我的两个测试结果很清楚:String.prototype.split()以很大的优势获胜 是我的固定宽度代码效率不够高,还是内置的字符串拆分函数更优越?有没有一种方法可以对其进行编码,从而

我正在构建一个字符串,通过JavaScript将其解析为数组。我可以将其分隔,也可以将字段设置为固定宽度。为了测试它,我使用一个数据字符串构建了这个jsperf测试,其中字段都是固定宽度和逗号分隔的:

我只在使用Firefox和Chrome的Windows上进行过测试,所以请在其他操作系统和浏览器上运行测试。我的两个测试结果很清楚:
String.prototype.split()
以很大的优势获胜

是我的固定宽度代码效率不够高,还是内置的字符串拆分函数更优越?有没有一种方法可以对其进行编码,从而使固定宽度解析成功?如果这是C/C++,那么正确编写的固定宽度代码将是明显的赢家。但是我知道JavaScript是一个完全不同的野兽。

是一个内置的JavaScript函数。期望它对于特定的JS引擎高度优化,而不是用JavaScript编写,而是用C++编写。 因此,您不能将其性能与纯JavaScript代码相匹配也就不足为奇了


拆分分隔字符串之类的字符串操作本质上是内存受限的。因此,知道分隔符的位置并没有多大帮助,因为整个字符串仍然需要至少遍历一次(以复制分隔的片段)。对于超过D-cache大小的字符串,固定位置拆分可能会更快,但您的字符串只有13KB长,因此多次遍历它并不重要。

我建议将代码放入
函数中
,以便更好地提示优化者。但是它仍然是。@Bergi-所以你是说这个问题没有真正的答案,除非我在我的真实世界代码的上下文中用最大的可信数据集进行测试?真实世界的总体性能差异可能真的可以忽略不计,但我想看看。这个jsperf使用了一个小但真实的数据集,所以它看起来似乎是一个非常有用的测试。我只是把东西放在函数中,结果基本上是一样的。我在想,这也修复了
I
应该是
I
-这将性能提高了16倍:-)但仍然是一个巨大的差异。@Bergi-在Firefox中,你的错误修复使
fixed(data)
成为赢家,所以这是值得称赞的。但是Firefox在这方面比Chrome慢得多。下面是另一个子拆分变体,它还显示
slice()
split()
更快。这一个并不是一个微基准,因为我确实在字符串数组上循环并分割每个字符串:“整个字符串仍然需要至少遍历一次(以复制分隔的片段)”-这取决于字符串表示,它可能只创建引用相同基础缓冲区的字符串对象,有不同的补偿。谢谢你的回答。我不一定感到惊讶,但我想知道。如果你看一下对我最初问题的评论,你会发现其中有些变化。在Windows上的Firefox中,修改后的固定宽度javascript代码运行得更快,但比Chrome慢得多。