在被question感兴趣之后,我试图复制用户Simon Nickerson建议的算法以及docjar提供的最佳答案的算法:docjar algorithm。
我测试了两个(希望我没有通过删除代理对来处理任何性能突破 - 交易部分)并且我发现docjar算法几乎比Simon的算法快四倍。任何人都可以指出这两种对速度产生影响的算法之间存在显着差异,因为我似乎无法自己解决这个问题。
干杯!
(更新)我使用System.nanoTime()进行了100次试验,我发现docjar的平均值约为4380纳秒,较慢的算法约为13684纳秒。
我修改过的docjar算法(快了4倍):
public static String fastReverse(String original)
{
char[] comps = original.toCharArray();
int n = comps.length - 1;
for(int j = (n - 1) >> 1 ; j >= 0; --j)
{
char temp = comps[j];
char temp2 = comps[n - j];
comps[j] = temp2;
comps[n - j] = temp;
}
return new String(comps);
}
Simon的修改算法(慢):
public static String reverse(String original)
{
char[] comps = original.toCharArray();
int n = comps.length;
for(int i = 0; i < n / 2; i++)
{
char temp = comps[i];
comps[i] = comps[n - i - 1];
comps[n - i - 1] = temp;
}
return new String(comps);
}
答案 0 :(得分:1)
除基准问题外,
初步读数表明Simon算法中出现了明显更多的算术运算。
在每个循环中,修改后的DocJar都有:
Simon的算法有:
如果您想进一步微量优化您的版本,可以将2个char声明放在for循环之外。 (即使任何体面的编译器都会为你做这件事,但不保证)