Fork me on GitHub
#clojure-russia
<
2015-09-16
>
maxp01:09:55

в общем-то да, никто ведь не мешает использовать джавовские мутабельные объекты

maxp01:09:49

только StringBuilder вроде как идеологически более правильный, хотя говорят нынче между ними разница не заметна

maxp01:09:37

Другой вопрос - зачем нужен volatile, если он не быстрее, чем atom?

maxp02:09:34

(defn conj-n [s n]
    (let [r []]
        (dotimes [_ n]
            (swap! a conj s)    
        )
        (s/join " " @a)
    ))

(defn atom-conj-n [s n]
    (let [a (atom [])]
        (dotimes [_ n]
            (swap! a conj s)    
        )
        (s/join " " @a)
    ))

(defn volat-conj-n [s n]
    (let [v (volatile! [])]
        (dotimes [_ n]
            (vswap! v conj s)    
        )
        (s/join " " @v)
    ))


(defn sb-conj-n [s n]
    (let [sb (StringBuilder.)]
        (.append sb s)
        (dotimes [_ (dec n)]
            (.append sb " ")
            (.append sb s)
        )
        (.toString sb)
    ))


(time (atom-conj-n "123456" 1000))
"Elapsed time: 1.159103 msecs"

(time (volat-conj-n "123456" 1000)))
"Elapsed time: 1.148819 msecs"

(time (sb-conj-n "123456" 1000))
"Elapsed time: 0.239634 msecs"

maxp02:09:39

времена сильно скачут от раза к разу, но если усреднить по многим прогонам, то получается примерно так.

niquola05:09:33

StringBuilder не тредсэйф

maxp06:09:39

ну так тут как раз никаких тредов по определению, в том и поинт

ul07:09:27

https://github.com/cgrand/xforms тут есть трансдьюсер для сборки строк