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 +27/−30
- bench/Main.hs +33/−50
- bench/Main/BufferBuilder.hs +58/−0
- jsonifier.cabal +3/−1
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,