0.19.0 add x/time
This commit is contained in:
parent
9e542d9d00
commit
e9361072c1
3 changed files with 71 additions and 6 deletions
20
README.md
20
README.md
|
|
@ -11,7 +11,7 @@ Aggregators generally only make sense in the context of a higher-order transduce
|
||||||
In `net.cgrand.xforms`:
|
In `net.cgrand.xforms`:
|
||||||
|
|
||||||
* regular ones: `partition` (1 arg), `reductions`, `for`, `take-last`, `drop-last`, `sort`, `sort-by`, `wrap`, `window` and `window-by-time`
|
* regular ones: `partition` (1 arg), `reductions`, `for`, `take-last`, `drop-last`, `sort`, `sort-by`, `wrap`, `window` and `window-by-time`
|
||||||
* higher-order ones: `by-key`, `into-by-key`, `multiplex`, `transjuxt`, `partition` (2+ args)
|
* higher-order ones: `by-key`, `into-by-key`, `multiplex`, `transjuxt`, `partition` (2+ args), `time`
|
||||||
* aggregators: `reduce`, `into`, `without`, `transjuxt`, `last`, `count`, `avg`, `sd`, `min`, `minimum`, `max`, `maximum`, `str`
|
* aggregators: `reduce`, `into`, `without`, `transjuxt`, `last`, `count`, `avg`, `sd`, `min`, `minimum`, `max`, `maximum`, `str`
|
||||||
|
|
||||||
In `net.cgrand.xforms.io`:
|
In `net.cgrand.xforms.io`:
|
||||||
|
|
@ -228,6 +228,24 @@ Evaluation count : 24 in 6 samples of 4 calls.
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### 0.19.0
|
||||||
|
|
||||||
|
`time` allows to measure time spent in one transducer (excluding time spent downstream).
|
||||||
|
|
||||||
|
```clj
|
||||||
|
=> (time ; good old Clojure time
|
||||||
|
(count (into [] (comp
|
||||||
|
(x/time "mapinc" (map inc))
|
||||||
|
(x/time "filterodd" (filter odd?))) (range 1e6))))
|
||||||
|
filterodd: 61.771738 msecs
|
||||||
|
mapinc: 143.895317 msecs
|
||||||
|
"Elapsed time: 438.34291 msecs"
|
||||||
|
500000
|
||||||
|
```
|
||||||
|
|
||||||
|
First argument can be a function that gets passed the time (in ms),
|
||||||
|
this allows for example to log time instead of printing it.
|
||||||
|
|
||||||
### 0.9.5
|
### 0.9.5
|
||||||
|
|
||||||
* Short (up to 4) literal collections (or literal collections with `:unroll` metadata) in collection positions in `x/for` are unrolled.
|
* Short (up to 4) literal collections (or literal collections with `:unroll` metadata) in collection positions in `x/for` are unrolled.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
(defproject net.cgrand/xforms "0.18.2"
|
(defproject net.cgrand/xforms "0.19.0"
|
||||||
:description "Extra transducers for Clojure"
|
:description "Extra transducers for Clojure"
|
||||||
:url "https://github.com/cgrand/xforms"
|
:url "https://github.com/cgrand/xforms"
|
||||||
:license {:name "Eclipse Public License"
|
:license {:name "Eclipse Public License"
|
||||||
:url "http://www.eclipse.org/legal/epl-v10.html"}
|
:url "http://www.eclipse.org/legal/epl-v10.html"}
|
||||||
:dependencies [[org.clojure/clojure "1.8.0"]
|
:dependencies [[org.clojure/clojure "1.8.0" :scope "provided"]
|
||||||
[org.clojure/clojurescript "1.9.293"]
|
[org.clojure/clojurescript "1.9.293" :scope "provided"]
|
||||||
[net.cgrand/macrovich "0.2.0"]])
|
[net.cgrand/macrovich "0.2.0"]])
|
||||||
|
|
@ -5,7 +5,9 @@
|
||||||
[net.cgrand.macrovich :as macros]
|
[net.cgrand.macrovich :as macros]
|
||||||
[net.cgrand.xforms :refer [for kvrf let-complete]])
|
[net.cgrand.xforms :refer [for kvrf let-complete]])
|
||||||
:clj (:require [net.cgrand.macrovich :as macros]))
|
:clj (:require [net.cgrand.macrovich :as macros]))
|
||||||
(:refer-clojure :exclude [some reduce reductions into count for partition str last keys vals min max drop-last take-last sort sort-by])
|
(:refer-clojure :exclude [some reduce reductions into count for partition
|
||||||
|
str last keys vals min max drop-last take-last
|
||||||
|
sort sort-by time])
|
||||||
(:require [#?(:clj clojure.core :cljs cljs.core) :as core]
|
(:require [#?(:clj clojure.core :cljs cljs.core) :as core]
|
||||||
[net.cgrand.xforms.rfs :as rf])
|
[net.cgrand.xforms.rfs :as rf])
|
||||||
#?(:cljs (:import [goog.structs Queue])))
|
#?(:cljs (:import [goog.structs Queue])))
|
||||||
|
|
@ -737,6 +739,51 @@
|
||||||
([xforms-map coll]
|
([xforms-map coll]
|
||||||
(transduce (transjuxt xforms-map) rf/last coll)))
|
(transduce (transjuxt xforms-map) rf/last coll)))
|
||||||
|
|
||||||
|
(macros/replace
|
||||||
|
[#?(:cljs {(java.util.concurrent.atomic.AtomicLong.) (atom 0)
|
||||||
|
(System/nanoTime) (system-time)
|
||||||
|
(.addAndGet at (- t (System/nanoTime))) (swap! at + (- t (system-time)))
|
||||||
|
(.addAndGet at (- (System/nanoTime) t)) (swap! at + (- (system-time) t))
|
||||||
|
.size .getCount})]
|
||||||
|
|
||||||
|
(defn time
|
||||||
|
"Measures the time spent in this transformation and prints the measured time.
|
||||||
|
tag-or-f may be either a function of 1 argument (measured time in ms) in which case
|
||||||
|
this function will be called instead of printing, or tag-or-f will be print before the measured time."
|
||||||
|
([xform] (time "Elapsed time" xform))
|
||||||
|
([tag-or-f xform]
|
||||||
|
(let [pt (if (fn? tag-or-f)
|
||||||
|
tag-or-f
|
||||||
|
#(println (core/str tag-or-f ": " % " msecs")))]
|
||||||
|
(fn [rf]
|
||||||
|
(let [at (java.util.concurrent.atomic.AtomicLong.)
|
||||||
|
rf
|
||||||
|
(fn
|
||||||
|
([] (rf))
|
||||||
|
([acc] (let [t (System/nanoTime)
|
||||||
|
r (rf acc)]
|
||||||
|
(.addAndGet at (- t (System/nanoTime)))
|
||||||
|
r))
|
||||||
|
([acc x]
|
||||||
|
(let [t (System/nanoTime)
|
||||||
|
r (rf acc x)]
|
||||||
|
(.addAndGet at (- t (System/nanoTime)))
|
||||||
|
r)))
|
||||||
|
rf (xform rf)]
|
||||||
|
(fn
|
||||||
|
([] (rf))
|
||||||
|
([acc]
|
||||||
|
(let [t (System/nanoTime)
|
||||||
|
r (rf acc)
|
||||||
|
total (.addAndGet at (- (System/nanoTime) t))]
|
||||||
|
(pt #?(:clj (* total 1e-6) :cljs total))
|
||||||
|
r))
|
||||||
|
([acc x]
|
||||||
|
(let [t (System/nanoTime)
|
||||||
|
r (rf acc x)]
|
||||||
|
(.addAndGet at (- (System/nanoTime) t))
|
||||||
|
r)))))))))
|
||||||
|
|
||||||
#_(defn rollup
|
#_(defn rollup
|
||||||
"Roll-up input data along the provided dimensions (which are functions of one input item),
|
"Roll-up input data along the provided dimensions (which are functions of one input item),
|
||||||
Values of interest are extracted from items using the valfn function and are then summarized
|
Values of interest are extracted from items using the valfn function and are then summarized
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue