LINUX.ORG.RU

История изменений

Исправление Nervous, (текущая версия) :

Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается

Единственное, что пока более-менее помогло — это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):

;; using transducers

(def line->measurement
  "Transforms a reducing function to coerce its input values from
  strings to measurements (vectors of a station name and a
  floating-point value)."
  (comp
   (map #(s/split % scsv-split-regex))
   (map #(update % 1 parse-double))))

(defn transducing-stats
  "Returns the map of station stats keyed by station names, obtained by
  transducing (reducing with transformation of the reducing function)
  the sequence of lines."
  [lines]
  (transduce line->measurement update-total-stats lines))


(comment

  ;; 10^6 lines: ~1 sec
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))

  ;; 10^9 lines: ~1000 sec (~17 min)
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))

)

Кстати, на этой задаче можно реально ощутить разницу в производительности между компилируемой кложей и интерпретируемой бабашкой — 5-8 раз не в пользу бабашки.

Исправление Nervous, :

Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается

Единственное, что пока более-менее помогло — это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):

;; using transducers

(def line->measurement
  "Transforms a reducing function to coerce its input values from
  strings to measurements (vectors of a station name and a
  floating-point value)."
  (comp
   (map #(s/split % scsv-split-regex))
   (map #(update % 1 parse-double))))

(defn transducing-stats
  "Returns the map of station stats keyed by station names, obtained by
  transducing (reducing with transformation of the reducing function)
  the sequence of lines."
  [lines]
  (transduce line->measurement update-total-stats lines))


(comment

  ;; 10^6 lines: ~1 sec
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))

  ;; 10^9 lines: ~1000 sec (~17 min)
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))

)

Кстати, на этой задаче можно ощутить разницу в производительности между компилируемой кложей и интерпретируемой бабашкой — 5-8 раз не в пользу бабашки.

Исправление Nervous, :

Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается

Единственное, что пока более-менее помогло — это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):

;; using transducers

(def line->measurement
  "Transforms a reducing function to coerce its input values from
  strings to measurements (vectors of a station name and a
  floating-point value)."
  (comp
   (map #(s/split % scsv-split-regex))
   (map #(update % 1 parse-double))))

(defn transducing-stats
  "Returns the map of station stats keyed by station names, obtained by
  transducing (reducing with transformation of the reducing function)
  the sequence of lines."
  [lines]
  (transduce line->measurement update-total-stats lines))


(comment

  ;; 10^6 lines: ~1 sec
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))

  ;; 10^9 lines: ~1000 sec (~17 min)
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))

)

Исходная версия Nervous, :

Когда пытаюсь тут что-то пооптимизировать, результат обычно только ухудшается

Единственное, что пока более-менее помогло, это трансдьюсеры для разбора строк вместо threading macros (процентов на 15-20, с 20 мин до 17):

;; using transducers

(def line->measurement
  "Transforms a reducing function to coerce its input values from
  strings to measurements (vectors of a station name and a
  floating-point value)."
  (comp
   (map #(s/split % scsv-split-regex))
   (map #(update % 1 parse-double))))

(defn transducing-stats
  "Returns the map of station stats keyed by station names, obtained by
  transducing (reducing with transformation of the reducing function)
  the sequence of lines."
  [lines]
  (transduce line->measurement update-total-stats lines))


(comment

  ;; 10^6 lines: ~1 sec
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements1M.txt"))))

  ;; 10^9 lines: ~1000 sec (~17 min)
  (time (format-stats (transducing-stats (read-file "dev/resources/measurements.txt"))))

)