与其他一些方法相比,使用 split() 速度较慢,尤其是在字符串足够大的情况下。
下面的测试是在我的计算机上针对 Neko 目标完成的,使用 Haxe 2.10 编译。让我们首先测试一个 6 个字符的字符串(“abcdef”)。
使用拆分/连接的实现 A大约需要(0.030 毫秒):
var s = "abcdef";
var a = s.split('');
a.reverse();
s = a.join('');
// s contains "fedcba"
实现 B的运行速度与解决方案 A(0.032 毫秒)差不多,甚至比解决方案 A 还要慢:
var s = "abcdef";
var s2 = "";
for (i in -s.length+1...1)
s2 += s.charAt(-i);
// s2 contains "fedcba"
实现 C比实现 A 快 5 倍(0.006 毫秒):
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.add(s.charAt(-i));
// s2.toString() contains "fedcba"
实现 D最快,比实现 A 快 16 倍(0.002ms):
import StringBuf;
using StringTools;
var s = "abcdef";
var s2 = new StringBuf();
for (i in -s.length+1...1)
s2.addChar(s.fastCodeAt(-i));
// s2.toString() contains "fedcba"
// if introducing var s3 = s2.toString() it then takes from 0.003 to 0.004ms total
// so this still seems the fastest on Neko.
用 6 个字符的字符串(从 500,000 次迭代计算并相应划分)对 Neko 的测量值进行回顾:
- 答:0.030ms
- B:0.032ms(最差)
- C:0.006ms(比A快5倍)
- D:0.002ms(最好,比 A 快 16 倍)
250 个字符串测量值(从 500,000 次迭代计算并相应划分):
- 答:0.996ms
- B:1.326ms(仍然最差)
- C:0.166ms(比A快6倍)
- D:0.044ms(最好,比 A 快 22 倍)
结果表明,随着字符串大小的增长,实现 A 相对于 D 变得越来越慢(这意味着它的复杂度函数 O(n) 更差)。
出于这些原因,我建议实施 D。