packages feed

jsonifier 0.1.0.2 → 0.1.0.3

raw patch · 4 files changed

+121/−81 lines, 4 filesdep +buffer-builder

Dependencies added: buffer-builder

Files

README.md view
@@ -14,41 +14,38 @@ ## Benchmarks  Following are the benchmark results comparing the performance-of encoding typical documents using this library and "aeson".-The numbers after the slash identify the amount of objects in-the rendered JSON.+of encoding typical documents using this library, "aeson" and "buffer-builder".+Every approach is measured on Twitter API data of sizes ranging from roughly 1kB to 60MB. "lazy-aeson" stands for "aeson" producing a lazy bytestring, otherwise it's strict.+"buffer-builder" is another library providing an alternative JSON encoder.  ```-jsonifier/1                              mean 2.043 μs  ( +- 24.33 ns  )-jsonifier/10                             mean 12.60 μs  ( +- 139.3 ns  )-jsonifier/100                            mean 120.8 μs  ( +- 3.271 μs  )-jsonifier/1,000                          mean 1.275 ms  ( +- 13.45 μs  )-jsonifier/10,000                         mean 20.71 ms  ( +- 864.1 μs  )-jsonifier/100,000                        mean 195.2 ms  ( +- 15.26 ms  )-aeson/1                                  mean 6.400 μs  ( +- 40.03 ns  )-aeson/10                                 mean 31.40 μs  ( +- 760.1 ns  )-aeson/100                                mean 262.1 μs  ( +- 4.486 μs  )-aeson/1,000                              mean 3.413 ms  ( +- 83.81 μs  )-aeson/10,000                             mean 30.38 ms  ( +- 439.9 μs  )-aeson/100,000                            mean 275.8 ms  ( +- 5.646 ms  )-lazy-aeson/1                             mean 6.403 μs  ( +- 58.98 ns  )-lazy-aeson/10                            mean 30.30 μs  ( +- 447.1 ns  )-lazy-aeson/100                           mean 257.7 μs  ( +- 4.806 μs  )-lazy-aeson/1,000                         mean 2.485 ms  ( +- 24.07 μs  )-lazy-aeson/10,000                        mean 24.89 ms  ( +- 447.1 μs  )-lazy-aeson/100,000                       mean 245.4 ms  ( +- 1.571 ms  )+jsonifier/1kB          mean 2.087 μs  ( +- 260.0 ns  )+jsonifier/6kB          mean 12.33 μs  ( +- 222.2 ns  )+jsonifier/60kB         mean 118.3 μs  ( +- 1.991 μs  )+jsonifier/600kB        mean 1.270 ms  ( +- 38.92 μs  )+jsonifier/6MB          mean 20.53 ms  ( +- 1.042 ms  )+jsonifier/60MB         mean 194.9 ms  ( +- 15.04 ms  )+aeson/1kB              mean 6.542 μs  ( +- 199.2 ns  )+aeson/6kB              mean 31.25 μs  ( +- 494.5 ns  )+aeson/60kB             mean 261.7 μs  ( +- 8.044 μs  )+aeson/600kB            mean 3.395 ms  ( +- 114.6 μs  )+aeson/6MB              mean 30.71 ms  ( +- 701.0 μs  )+aeson/60MB             mean 277.1 ms  ( +- 4.776 ms  )+lazy-aeson/1kB         mean 6.423 μs  ( +- 83.69 ns  )+lazy-aeson/6kB         mean 30.74 μs  ( +- 607.0 ns  )+lazy-aeson/60kB        mean 259.1 μs  ( +- 4.890 μs  )+lazy-aeson/600kB       mean 2.511 ms  ( +- 18.71 μs  )+lazy-aeson/6MB         mean 24.92 ms  ( +- 95.36 μs  )+lazy-aeson/60MB        mean 248.6 ms  ( +- 736.6 μs  )+buffer-builder/1kB     mean 5.512 μs  ( +- 77.39 ns  )+buffer-builder/6kB     mean 30.29 μs  ( +- 459.9 ns  )+buffer-builder/60kB    mean 307.0 μs  ( +- 3.640 μs  )+buffer-builder/600kB   mean 3.001 ms  ( +- 75.72 μs  )+buffer-builder/6MB     mean 33.05 ms  ( +- 336.3 μs  )+buffer-builder/60MB    mean 308.5 ms  ( +- 3.489 ms  ) ```--Here is the listing of the data sizes of produced documents by the amounts of objects:--- 1: 941B-- 10: 6.4kB-- 100: 60kB-- 1,000: 604kB-- 10,000: 6MB-- 100,000: 60MB  The benchmark suite is bundled with the package. 
bench/Main.hs view
@@ -5,6 +5,7 @@ import qualified Main.Model as Model import qualified Main.Jsonifier import qualified Main.Aeson+import qualified Main.BufferBuilder as BufferBuilder import qualified Data.Aeson import qualified Data.ByteString.Lazy import qualified Data.ByteString.Char8 as Char8ByteString@@ -24,6 +25,7 @@      -- Ensure that encoders are correct     test "jsonifier" encodeWithJsonifier twitter10Data+    test "buffer-builder" BufferBuilder.encodeResult twitter10Data     test "aeson" encodeWithAeson twitter10Data      -- Print out the data sizes of samples@@ -36,57 +38,38 @@         "- " <> TextBuilder.text sampleName <> ": " <>         sampleDataSize sampleData       in -        "Sample data sizes report:\n" <>-        sample "twitter-1" twitter1Data <> "\n" <>-        sample "twitter-10" twitter10Data <> "\n" <>-        sample "twitter-100" twitter100Data <> "\n" <>-        sample "twitter-1,000" twitter1000Data <> "\n" <>-        sample "twitter-10,000" twitter10000Data <> "\n" <>-        sample "twitter-100,000" twitter100000Data+        "Input data sizes report:\n" <>+        sample "twitter with 1 objects" twitter1Data <> "\n" <>+        sample "twitter with 10 objects" twitter10Data <> "\n" <>+        sample "twitter with 100 objects" twitter100Data <> "\n" <>+        sample "twitter with 1,000 objects" twitter1000Data <> "\n" <>+        sample "twitter with 10,000 objects" twitter10000Data <> "\n" <>+        sample "twitter with 100,000 objects" twitter100000Data -    defaultMain [-      bgroup "jsonifier" [-        bench "1" (nf encodeWithJsonifier twitter1Data)-        ,-        bench "10" (nf encodeWithJsonifier twitter10Data)-        ,-        bench "100" (nf encodeWithJsonifier twitter100Data)-        ,-        bench "1,000" (nf encodeWithJsonifier twitter1000Data)-        ,-        bench "10,000" (nf encodeWithJsonifier twitter10000Data)-        ,-        bench "100,000" (nf encodeWithJsonifier twitter100000Data)-        ]-      ,-      bgroup "aeson" [-        bench "1" (nf encodeWithAeson twitter1Data)-        ,-        bench "10" (nf encodeWithAeson twitter10Data)-        ,-        bench "100" (nf encodeWithAeson twitter100Data)-        ,-        bench "1,000" (nf encodeWithAeson twitter1000Data)-        ,-        bench "10,000" (nf encodeWithAeson twitter10000Data)-        ,-        bench "100,000" (nf encodeWithAeson twitter100000Data)-        ]-      ,-      bgroup "lazy-aeson" [-        bench "1" (nf encodeWithLazyAeson twitter1Data)-        ,-        bench "10" (nf encodeWithLazyAeson twitter10Data)-        ,-        bench "100" (nf encodeWithLazyAeson twitter100Data)-        ,-        bench "1,000" (nf encodeWithLazyAeson twitter1000Data)-        ,-        bench "10,000" (nf encodeWithLazyAeson twitter10000Data)-        ,-        bench "100,000" (nf encodeWithLazyAeson twitter100000Data)-        ]-      ]+    let+      benchLib :: NFData a => String -> (Model.Result -> a) -> Benchmark+      benchLib name encode =+        bgroup name [+          bench "1kB" (nf encode twitter1Data)+          ,+          bench "6kB" (nf encode twitter10Data)+          ,+          bench "60kB" (nf encode twitter100Data)+          ,+          bench "600kB" (nf encode twitter1000Data)+          ,+          bench "6MB" (nf encode twitter10000Data)+          ,+          bench "60MB" (nf encode twitter100000Data)+          ]+      in+        defaultMain [+          benchLib "jsonifier" encodeWithJsonifier,+          benchLib "aeson" encodeWithAeson,+          benchLib "lazy-aeson" encodeWithLazyAeson,+          benchLib "buffer-builder" BufferBuilder.encodeResult+          ]+  load :: FilePath -> IO Model.Result load fileName =
+ bench/Main/BufferBuilder.hs view
@@ -0,0 +1,58 @@+module Main.BufferBuilder where++import Prelude+import Data.BufferBuilder.Json+import qualified Main.Model as M+++encodeResult :: M.Result -> ByteString+encodeResult =+  encodeJson++instance ToJson M.Geo where+  toJson M.Geo{..} =+    toJson $+      "type_"# .=# toJson type_ <>+      "coordinates"# .=# toJson coordinates++instance ToJson (Double, Double) where+  toJson (a, b) =+    toJson [toJson a, toJson b]++instance ToJson M.Story where+  toJson M.Story{..} =+    toJson $+      "from_user_id_str"# .=# toJson from_user_id_str <>+      "profile_image_url"# .=# toJson profile_image_url <>+      "created_at"# .=# toJson created_at <>+      "from_user"# .=# toJson from_user <>+      "id_str"# .=# toJson id_str <>+      "metadata"# .=# toJson metadata <>+      "to_user_id"# .=# toJson to_user_id <>+      "text"# .=# toJson text <>+      "id"# .=# toJson id <>+      "from_user_id"# .=# toJson from_user_id <>+      "geo"# .=# toJson geo <>+      "iso_language_code"# .=# toJson iso_language_code <>+      "to_user_id_str"# .=# toJson to_user_id_str <>+      "source"# .=# toJson source++instance ToJson M.Metadata where+  toJson M.Metadata{..} =+    toJson $+      "result_type"# .=# toJson result_type++instance ToJson M.Result where+  toJson M.Result{..} =+    toJson $+      "results"# .=# toJson results <>+      "max_id"# .=# toJson max_id <>+      "since_id"# .=# toJson since_id <>+      "refresh_url"# .=# toJson refresh_url <>+      "next_page"# .=# toJson next_page <>+      "results_per_page"# .=# toJson results_per_page <>+      "page"# .=# toJson page <>+      "completed_in"# .=# toJson completed_in <>+      "since_id_str"# .=# toJson since_id_str <>+      "max_id_str"# .=# toJson max_id_str <>+      "query"# .=# toJson query
jsonifier.cabal view
@@ -1,5 +1,5 @@ name: jsonifier-version: 0.1.0.2+version: 0.1.0.3 synopsis: Fast and simple JSON encoding toolkit description:   Minimalistic library for encoding JSON directly to strict bytestring.@@ -82,6 +82,7 @@   main-is: Main.hs   other-modules:     Main.Aeson+    Main.BufferBuilder     Main.Jsonifier     Main.Model   ghc-options: -O2 -threaded "-with-rtsopts=-N"@@ -89,6 +90,7 @@   default-language: Haskell2010   build-depends:     aeson >=1.5.4.1 && <1.6,+    buffer-builder >=0.2.4.7 && <0.3,     gauge >=0.2.5 && <0.3,     jsonifier,     rerebase >=1.10.0.1 && <2,