在对这个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);
}
西蒙的改进算法(较慢):
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);
}
最佳答案
除了基准问题,
一个初始读数显示,在Simon的算法中出现了更多的算法。
在每个循环中,修改后的DocJar都有:
1布尔表达式
3个减法运算。
2原语声明
4个阵列查找
4个作业
西蒙的算法有:
列表项
1布尔表达式
一师
1添加
1原始声明
4减法运算
4个阵列查找
3个作业。
如果您想进一步微观优化您的版本,可以将2个字符声明放在for循环之外(即使任何一个好的编译器都会为您这样做,但它并不能保证)