Size: a a a

Clojure — русскоговорящее сообщество

2020 January 10

DF

Dima Fomin in Clojure — русскоговорящее сообщество
на втором месте так
источник

DF

Dima Fomin in Clojure — русскоговорящее сообщество
ну и классика на третьем
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
ответ какой должен получиться?
источник

DF

Dima Fomin in Clojure — русскоговорящее сообщество
Кстати, видали fibers в Jave? Project Loom. Крутая будет штука - миллион тредов делает в полпинка. Вот только CAS от этого ничуть лучше не становится :(
источник

DF

Dima Fomin in Clojure — русскоговорящее сообщество
Sergey Trofimov
ответ какой должен получиться?
Какой ответ? Ну я подумал, может кто-то решал проблему с thread contention и знает способ получше LongAdder/DoubleAdder.
У меня проблема еще и в том, что сейчас приложение на Java 1.7, а там их еще не было
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dima Fomin
Привет всем!
А какой самый быстрый способ параллельного суммирования (reduce)  на сотне ядер?
У меня выходит, что DoubleAdder, и на втором месте - DoubleAdder однотредово.
у тебя же в примерах не суммирование, а инкремент
он разве распараллеливается?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dima Fomin
ну и классика на третьем
  (time
   (let [c (atom 0)
         n (int 1e8)]
     (dotimes [_ n]
       (swap! c inc))
     @c))

 (time
   (let [c (volatile! 0)
         n (int 1e8)]
     (dotimes [_ n]
       (vswap! c inc))
     @c))

 (time
   (let [c (volatile! 0)
         n (int 1e8)]
     (dotimes [_ n]
       (vswap! c unchecked-inc-int))
     @c))
"Elapsed time: 1831.561 msecs"
=> 100000000
"Elapsed time: 1238.6742 msecs"
=> 100000000
"Elapsed time: 953.5168 msecs"
=> 100000000
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dima Fomin
на втором месте так
ну то есть это одного порядка
  (time
   (let [c (volatile! 0)
         n (int 1e8)]
     (dotimes [_ n]
       (vswap! c unchecked-inc-int))
     @c))
источник
2020 January 11

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Dima Fomin
вот я поигрался, у меня получилось, что вот так быстрей всего на 4 домашних ядрах
простой цикл в основном потоке быстрее 😊
(time
   (loop [i (int 0)
          n (int 1e8)]
     (if (pos? n)
       (recur (unchecked-inc-int i) (unchecked-dec-int n))
       i)))
"Elapsed time: 127.8603 msecs"
=> 100000000
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Sergey Trofimov
простой цикл в основном потоке быстрее 😊
(time
   (loop [i (int 0)
          n (int 1e8)]
     (if (pos? n)
       (recur (unchecked-inc-int i) (unchecked-dec-int n))
       i)))
"Elapsed time: 127.8603 msecs"
=> 100000000
даже просто
(time
   (loop [i (int 0)
          n (int 1e8)]
     (if (pos? n)
       (recur (inc i) (dec n))
       i)))
"Elapsed time: 98.6391 msecs"
=> 100000000
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
Почему nth работает медленнее на lazy-seq, чем на векторе?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
Ilya Pomaskin
Почему nth работает медленнее на lazy-seq, чем на векторе?
потому что на векторе по индексу, а в последовательности перебором от начала
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
Каждый раз?
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
При последовательном вызове результат предыдущего nth не кешируется?
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
не кэшируется
 "Returns the value at the index. get returns nil if index out of
 bounds, nth throws an exception unless not-found is supplied.  nth
 also works for strings, Java arrays, regex Matchers and Lists, and,
 in O(n) time, for sequences."
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
Хм
источник

IP

Ilya Pomaskin in Clojure — русскоговорящее сообщество
Понял, спасибо
источник

ST

Sergey Trofimov in Clojure — русскоговорящее сообщество
источник

DF

Dima Fomin in Clojure — русскоговорящее сообщество
Sergey Trofimov
ну то есть это одного порядка
  (time
   (let [c (volatile! 0)
         n (int 1e8)]
     (dotimes [_ n]
       (vswap! c unchecked-inc-int))
     @c))
О! Спасибо! Не знал про операторы volatile! и vswap!
Правда в мультитреде с vswap! фигня получается, написано что он не атомарный :(
источник

DF

Dima Fomin in Clojure — русскоговорящее сообщество
Sergey Trofimov
даже просто
(time
   (loop [i (int 0)
          n (int 1e8)]
     (if (pos? n)
       (recur (inc i) (dec n))
       i)))
"Elapsed time: 98.6391 msecs"
=> 100000000
ну это то да, в одном треде это понятно. И если сделать 100 таких тредов, тоже будет в 100 раз быстрее. Но мне то надо собрать значения из 100 тредов :/
Попробую еще из 100 тредов слать в неблокирующую очередь в один тред и в нем суммировать.
источник