【问题标题】:String reversal performance字符串反转性能
【发布时间】:2015-01-25 14:16:42
【问题描述】:

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

【问题讨论】:

  • 在我们深入之前,您究竟是如何对这些方法进行基准测试的?
  • 当然,由于我是该主题的业余爱好者,请随意提出任何更高级的基准测试方法
  • @AlexKoukoulas:我建议你先通读这篇文章。如果您的结果仍然相同,那么值得一看。 stackoverflow.com/questions/504103/…

标签: java string algorithm reverse


【解决方案1】:

除了基准测试问题,

初步阅读表明,西蒙的算法中出现了更多的算术。

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

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

西蒙的算法有:

  • 列表项
  • 1 个布尔表达式
  • 1 个部门
  • 1 增加
  • 1 原始声明
  • 4 次减法运算
  • 4 个数组查找
  • 3 个作业。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    相关资源
    最近更新 更多