【问题标题】:How can I optimize my code for generating a pseudorandom String for high speed in Java?如何优化我的代码以在 Java 中生成高速伪随机字符串?
【发布时间】:2014-06-17 21:59:07
【问题描述】:

我的目标是从一小部分字符中生成一个由 500000 个字符组成的伪随机字符串。这是我向字符串添加字符的循环:

String alphabet="ABCD";
Random r = new Random();
for (int i = 0; i < 500000; i++) {
    this.setCode((this.getCode() == null ? "" : this.getCode())
    alphabet.charAt(r.nextInt(alphabet.length())));
}

不出所料,这非常慢,所以我正在寻找方法让它执行>最慢

【问题讨论】:

    标签: java loops optimization random


    【解决方案1】:

    使用StringBuilder 来构造您的字符串。预先分配 500000 个字符以加快速度:

    StringBuilder sb = new StringBuilder(500000);
    for (int i = 0; i < 500000; i++) {
        sb.append(alphabet.charAt(r.nextInt(alphabet.length())));
    }
    String res = sb.toString();
    

    【讨论】:

    • 这在不需要额外库的情况下产生了惊人的变化。
    • 根据您对 Random 使用的实现类型,您可能能够获得更好更快的结果,如果您不关心同步,并且速度确实是一个因素,您可以改用 MersenneTwisterFast.java。 cs.gmu.edu/~sean/research/mersenne/MersenneTwisterFast.java
    • 当你预先知道长度时不要使用StringBuilder,而是使用新的char[50000]。使用ThreadLocalRandom 以获得更快的速度。
    • 感谢这些提示 - 使用字符数组可以进一步提高速度。
    【解决方案2】:

    如果您愿意使用第三方库,请查看 Apache Commons RandomStringUtils

    int count = 500000;
    String alphabet = "ABCD";
    String randomString = RandomStringUtils.random(count, alphabet);
    

    在我的笔记本电脑(MacBook Pro)上,生成一个 500K 的字符串大约需要 20 毫秒。

    【讨论】:

      【解决方案3】:

      使用StringBuilder 会有所帮助,但如果您将初始大小声明为预期输出的实际长度,则更是如此。这避免了在运行时调整 StringBuilder 的内部数组的大小。此外,直接访问 String 的 char 数组比在 String 上使用 charAt(int) 快一点——引用是直接的,而不是对数组进行方法引用。

       public static String getRandomString(String characterSet){
          final char[] chars = characterSet.toCharArray();
          final int size = 500000;
          StringBuilder sb = new StringBuilder(size);
          Random rand = new Random();
          for(int i=0;i<size;i++){
              sb.append(chars[rand.nextInt(chars.length)]);
          }
          return sb.toString();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 2013-10-10
        • 2014-11-22
        • 1970-01-01
        相关资源
        最近更新 更多