字符串反转性能

时间:2015-01-25 14:16:43

标签: java string algorithm reverse

在被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);
}

1 个答案:

答案 0 :(得分:1)

除基准问题外,

初步读数表明Simon算法中出现了明显更多的算术运算。

在每个循环中,修改后的DocJar都有:

  • 1布尔表达式
  • 3次减法操作。
  • 2原始声明
  • 4个数组查找
  • 4个作业

Simon的算法有:

  • 列表项
  • 1布尔表达式
  • 1分部
  • 1加法
  • 1原始宣言
  • 4次减法操作
  • 4个数组查找
  • 3作业。

如果您想进一步微量优化您的版本,可以将2个char声明放在for循环之外。 (即使任何体面的编译器都会为你做这件事,但不保证)