【问题标题】:JavaScript String split: fixed-width vs. delimited performanceJavaScript 字符串拆分:固定宽度与分隔性能
【发布时间】:2020-04-18 02:12:24
【问题描述】:

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

https://jsperf.com/string-split-fixed

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

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

【问题讨论】:

  • 我建议将您的代码放在function 中,以更好地提示优化器。但它仍然是just a microbenchmark
  • @Bergi - 所以你是说这个问题没有真正的答案,除非我在我的真实世界代码的上下文中使用最大的合理数据集进行一次运行测试?真实世界的总体性能差异可能真的可以忽略不计,但我想看看。这个 jsperf 使用了一个小而真实的数据集,所以它看起来像是一个看似有用的测试。我只是把东西放在函数里面,结果基本上是一样的。
  • 我在想of something like this,它还修复了i < data.length 应该是i < array.length 的错误 - 这将性能提高了 16 倍 :-) 不过仍然有很大的不同。跨度>
  • @Bergi - 在 Firefox 中,您的错误修复使 fixed(data) 成为赢家,因此值得称赞。但在这方面,Firefox 总体上比 Chrome 慢得多。这是另一个子拆分变体,它也显示slice()split() 快。这不是一个微基准,因为我确实循环遍历字符串数组并拆分每个字符串:jsperf.com/ss-split-vs-slice

标签: javascript arrays string performance split


【解决方案1】:

String.prototype.split() 是一个内置的 JavaScript 函数。期望它针对特定的 JS 引擎进行高度优化,并且不是用 JavaScript 而是用 C++ 编写的。

因此,您无法将其性能与纯 JavaScript 代码相提并论也就不足为奇了。

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

【讨论】:

  • "整个字符串仍然需要至少遍历一次(以复制分隔的片段)" - 这取决于字符串表示,这可能只创建引用的字符串对象相同的底层缓冲区,具有不同的偏移量。
  • 感谢您的回答。我不一定感到惊讶,但我想知道。如果您查看我原来的问题的 cmets,您会看到其中的一些变化。在 Windows 上的 Firefox 中,修改后的固定宽度 javascript 代码运行得更快,但比 Chrome 慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 2019-06-14
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多