3

ocr アルゴリズムを書きたいとしましょう。したがって、バイナリイメージを作成したいと思います。私が思いついたclojureとquilを使用して:

(defn setup []

  (load-pixels)

  (let [pxls (pixels)
             ]
    (letfn [(pxl-over-threshold? [idx] (if (> (red (aget pxls idx)) 128) true false))
            ]
           (time (dotimes [idx 25500] (aset pxls idx (color (rem idx 255)))))

           (time (dotimes [idx 25500] (if (pxl-over-threshold? idx)
                                          (aset pxls idx (color 255))
                                          (aset pxls idx (color 0)))))))
  (update-pixels))

(defn draw [])

(defsketch example
  :title "image demo"
  :setup setup
  :draw draw
  :size [255 100]
  :renderer :p2d)

;"Elapsed time: 1570.58932 msecs"
;"Elapsed time: 2781.334345 msecs" 

コードはグレースケールを生成し、その後、すべてのピクセルを繰り返し処理して黒または白に設定します。要求された動作を実行しますが、そこに到達するまでに約 4.3 秒かかります (1.3 デュアル コア)。4.3秒を文脈に入れるための参照はありません。しかし、より大きな画像を処理することを考えると、これは信じられないほど遅くなるに違いありません。

私は何かひどく間違ったことをしていますか、それとも物事を固定する方法はありますか? clojure と quil の組み合わせは、ピクセル変換をより高速に実行できますか、それとも別の言語/環境を選択する必要がありますか?

また、コードで奇妙なことをしている場合はお知らせください。私はまだclojureに慣れていません。

前もって感謝します。

4

1 に答える 1

3

コードはまだウォームではないため、実行したタイミングは特に意味がありません。JVM がコードを JIT コンパイルできるように、コードを「ウォームアップ」する必要があります。Clojure で関数をベンチマークする方法を参照してください。( Criteriumを使用する必要があります。)

コードに関しては、配列を使用しているため、パフォーマンスが向上するはずです。スタイルに関しては、]あなたが持っている 2 つの吊り下げは本当に奇妙です。多分それはただのフォーマットエラーですか?通常は、重複するコードをできる限り排除することをお勧めします。そのため、これも変更します。

(if (pxl-over-threshold? idx)
  (aset pxls idx (color 255))
  (aset pxls idx (color 0)))

これに

(aset pxls idx (color (if (pxl-over-threshold? idx) 255 0)))

わかりにくい/複雑すぎると感じた場合 (私は、読みにくいと考えるかどうかについて、私はちょっと正しいと思います)、代わりに次のいずれかの方法でそれを書くことができます:

(let [c (if (pxl-over-threshold? idx) 255 0)]
  (aset pxls idx (color c)))

(->> (if (pxl-over-threshold? idx) 255 0) color (aset pxls idx))
于 2013-09-18T05:34:27.127 に答える