clojure-erlastic icon indicating copy to clipboard operation
clojure-erlastic copied to clipboard

Remove reflection warnings and use Protocols for encoding/decoding

Open ducky427 opened this issue 8 years ago • 0 comments

With these changes, encode & decode is about 4 times faster.

I testes this code using criterium.

(use 'criterium.core)
(require '[clojure-erlastic.core :as c])

(def conf {:str-detect :none :convention :elixir :str-autodetect-len 10})

(def encode #(c/encode % conf))
(def decode #(c/decode % conf))

(defn f
  []
  (-> :toto encode decode)
  (-> {:a :b :c :d} encode decode)
  (-> [:a :b :c :d] encode decode)
  (-> '(:a :b :c :d) encode decode)
  (-> #{:a :b :c :d} encode decode)
  (-> 4.3 encode decode)
  (-> true encode decode)
  (-> (byte-array (repeat 4 0)) encode decode)
  (-> nil encode decode)
  (-> \c encode decode)
  (-> "toto" encode decode)
  nil)
(bench (f))

Before:

Evaluation count : 893640 in 60 samples of 14894 calls.
             Execution time mean : 72.383461 µs
    Execution time std-deviation : 5.949103 µs
   Execution time lower quantile : 65.927145 µs ( 2.5%)
   Execution time upper quantile : 83.833648 µs (97.5%)
                   Overhead used : 6.592387 ns

After:

Evaluation count : 3893340 in 60 samples of 64889 calls.
             Execution time mean : 15.769601 µs
    Execution time std-deviation : 394.241150 ns
   Execution time lower quantile : 15.214134 µs ( 2.5%)
   Execution time upper quantile : 16.606512 µs (97.5%)
                   Overhead used : 6.282802 ns

ducky427 avatar Oct 20 '17 20:10 ducky427