我们假设我想要一个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的组合是否能够更快地进行像素转换,还是应该选择不同的语言/环境?
如果我在代码中做了一些奇怪的事情,也请告诉我。我还是新手。
提前致谢。
答案 0 :(得分:3)
你所采取的时间并不是特别有意义,因为代码还不热。你需要"热身"代码,以便JVM将JIT编译它,并且当你应该开始看到良好的速度时。您应该查看How to benchmark functions in Clojure?(您应该使用Criterium。)
至于你的代码,你正在使用数组,所以这应该会给你带来良好的性能。风格方面,你所拥有的两个]
非常奇怪。也许那只是一个格式化错误?消除尽可能多的重复代码通常很好,所以我也改变了这个
(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))