Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Clojure中的快速随机字符串生成器_Java_Performance_Clojure - Fatal编程技术网

Java Clojure中的快速随机字符串生成器

Java Clojure中的快速随机字符串生成器,java,performance,clojure,Java,Performance,Clojure,我想知道是否有一种方法可以在Clojure中生成固定长度的随机字符串 快速搜索的结果是: 查看VisualVM CPU配置文件数据后,我意识到is消耗了大量CPU: 我决定重写它,使其与我以前使用的Java函数类似: (defn rand-str2-slow ^String [^Long len] (let [leftLimit 97 rightLimit 122 random (Random.) stringBuilder (String

我想知道是否有一种方法可以在Clojure中生成固定长度的随机字符串

快速搜索的结果是:

查看VisualVM CPU配置文件数据后,我意识到is消耗了大量CPU:

我决定重写它,使其与我以前使用的Java函数类似:

(defn rand-str2-slow
  ^String [^Long len]
  (let [leftLimit 97
        rightLimit 122
        random (Random.)
        stringBuilder (StringBuilder. len)
        diff (- rightLimit leftLimit)]
    (dotimes [_ len]
      (let [ch (char (.intValue (+ leftLimit (* (.nextFloat random) (+ diff 1)))))]
        (.append stringBuilder ch)))
        (.toString stringBuilder)))
这导致了更慢的代码,但是堆栈跟踪的深度要小得多:

我注意到它有很多Reflector.getMethods。有没有办法键入提示函数以避免这种情况

更新1:

相关微基准:

兰德街

(with-progress-reporting (quick-bench (rand-str 5000) :verbose))

      Execution time sample mean : 1.483232 ms
             Execution time mean : 1.483547 ms
Execution time sample std-deviation : 31.161960 µs
    Execution time std-deviation : 31.651732 µs
   Execution time lower quantile : 1.441678 ms ( 2.5%)
   Execution time upper quantile : 1.531289 ms (97.5%)
                   Overhead used : 14.598226 ns
rand-str2-slow

(with-progress-reporting (quick-bench (rand-str2-slow 5000) :verbose))

      Execution time sample mean : 17.637256 ms
             Execution time mean : 17.647974 ms
Execution time sample std-deviation : 523.527242 µs
    Execution time std-deviation : 528.559280 µs
   Execution time lower quantile : 17.322583 ms ( 2.5%)
   Execution time upper quantile : 18.522246 ms (97.5%)
                   Overhead used : 14.598226 ns
rand-str2快速

(with-progress-reporting (quick-bench (rand-str2 5000) :verbose))

      Execution time sample mean : 84.362974 µs
             Execution time mean : 84.355379 µs
Execution time sample std-deviation : 3.496944 µs
    Execution time std-deviation : 3.674542 µs
   Execution time lower quantile : 80.911920 µs ( 2.5%)
   Execution time upper quantile : 89.264431 µs (97.5%)
                   Overhead used : 14.598226 ns

让我回答我自己的问题:

(defn rand-str2
  ^String [^Long len]
  (let [leftLimit 97
        rightLimit 122
        random (Random.)
        stringBuilder (StringBuilder. len)
        diff (- rightLimit leftLimit)]
    (dotimes [_ len]
      (let [ch (char (.intValue ^Double (+ leftLimit (* (.nextFloat ^Random random) (+ diff 1)))))]
        (.append ^StringBuilder stringBuilder ch)))
        (.toString ^StringBuilder stringBuilder)))

让我回答我自己的问题:

(defn rand-str2
  ^String [^Long len]
  (let [leftLimit 97
        rightLimit 122
        random (Random.)
        stringBuilder (StringBuilder. len)
        diff (- rightLimit leftLimit)]
    (dotimes [_ len]
      (let [ch (char (.intValue ^Double (+ leftLimit (* (.nextFloat ^Random random) (+ diff 1)))))]
        (.append ^StringBuilder stringBuilder ch)))
        (.toString ^StringBuilder stringBuilder)))

是的,避免装箱/拆箱和键入提示通常是一种方法。遗憾的是,第一个版本不能再优化了。是的,惯用的Clojure非常慢。这就是价格。是的,避免装箱/拆箱和键入提示通常是一种方法。遗憾的是,第一个版本不能再优化了。是的,惯用的Clojure非常慢。这就是价格。