From e729bab5bb3d9bdc6576aa24811d6d7d4fae3d56 Mon Sep 17 00:00:00 2001 From: Andy Davidoff Date: Thu, 5 Nov 2020 00:25:45 -0500 Subject: [PATCH] 0.3.0: faster arrays --- docs/bench.svg | 84 ++++++++++++++---------------------------------- docs/packed.svg | 75 ++++++++++++------------------------------ jason.nim | 21 +++++++----- jason.nimble | 2 +- tests/bench.nim | 2 +- tests/nim.cfg | 1 + tests/packed.nim | 4 +-- 7 files changed, 62 insertions(+), 127 deletions(-) diff --git a/docs/bench.svg b/docs/bench.svg index bda1d0a..a926604 100644 --- a/docs/bench.svg +++ b/docs/bench.svg @@ -16,71 +16,37 @@ } :root { - --animation-duration: 64660ms; + --animation-duration: 63001ms; } @keyframes roll { 0.000%{transform:translateY(0px)} -0.108%{transform:translateY(-544px)} -0.116%{transform:translateY(-1088px)} -0.128%{transform:translateY(-1632px)} -0.130%{transform:translateY(-2176px)} -0.136%{transform:translateY(-2720px)} -0.138%{transform:translateY(-3264px)} -0.173%{transform:translateY(-3808px)} -0.181%{transform:translateY(-4352px)} -0.200%{transform:translateY(-4896px)} -0.212%{transform:translateY(-5440px)} -0.479%{transform:translateY(-5984px)} -0.498%{transform:translateY(-6528px)} -0.506%{transform:translateY(-7072px)} -0.549%{transform:translateY(-7616px)} -0.554%{transform:translateY(-8160px)} -0.555%{transform:translateY(-8704px)} -0.561%{transform:translateY(-9248px)} -0.575%{transform:translateY(-9792px)} -0.693%{transform:translateY(-10336px)} -0.705%{transform:translateY(-10880px)} -0.707%{transform:translateY(-11424px)} -0.711%{transform:translateY(-11968px)} -0.716%{transform:translateY(-12512px)} -0.732%{transform:translateY(-13056px)} -0.733%{transform:translateY(-13600px)} -0.735%{transform:translateY(-14144px)} -0.742%{transform:translateY(-14688px)} -0.750%{transform:translateY(-15232px)} -0.781%{transform:translateY(-15776px)} -0.790%{transform:translateY(-16320px)} -0.827%{transform:translateY(-16864px)} -0.854%{transform:translateY(-17408px)} -0.863%{transform:translateY(-17952px)} -2.556%{transform:translateY(-18496px)} -2.567%{transform:translateY(-19040px)} -7.207%{transform:translateY(-19584px)} -11.847%{transform:translateY(-20128px)} -16.486%{transform:translateY(-20672px)} -21.126%{transform:translateY(-21216px)} -25.766%{transform:translateY(-21760px)} -30.405%{transform:translateY(-22304px)} -35.045%{transform:translateY(-22848px)} -39.685%{transform:translateY(-23392px)} -44.324%{transform:translateY(-23936px)} -48.964%{transform:translateY(-24480px)} -53.603%{transform:translateY(-25024px)} -58.243%{transform:translateY(-25568px)} -62.883%{transform:translateY(-26112px)} -67.522%{transform:translateY(-26656px)} -72.162%{transform:translateY(-27200px)} -76.802%{transform:translateY(-27744px)} -81.441%{transform:translateY(-28288px)} -86.081%{transform:translateY(-28832px)} -90.721%{transform:translateY(-29376px)} -95.360%{transform:translateY(-29920px)} -100.000%{transform:translateY(-29920px)} +0.002%{transform:translateY(-544px)} +4.763%{transform:translateY(-1088px)} +9.525%{transform:translateY(-1632px)} +14.287%{transform:translateY(-2176px)} +19.049%{transform:translateY(-2720px)} +23.811%{transform:translateY(-3264px)} +28.573%{transform:translateY(-3808px)} +33.334%{transform:translateY(-4352px)} +38.096%{transform:translateY(-4896px)} +42.858%{transform:translateY(-5440px)} +47.620%{transform:translateY(-5984px)} +52.382%{transform:translateY(-6528px)} +57.144%{transform:translateY(-7072px)} +61.905%{transform:translateY(-7616px)} +66.667%{transform:translateY(-8160px)} +71.429%{transform:translateY(-8704px)} +76.191%{transform:translateY(-9248px)} +80.953%{transform:translateY(-9792px)} +85.715%{transform:translateY(-10336px)} +90.476%{transform:translateY(-10880px)} +95.238%{transform:translateY(-11424px)} +100.000%{transform:translateY(-11424px)} } #screen_view { - animation-duration: 64660ms; + animation-duration: 63001ms; animation-iteration-count:infinite; animation-name:roll; animation-timing-function: steps(1,end); @@ -115,5 +81,5 @@ - . .. ... ...... ....... .......... ........... ............ ............. ............... ................ .................. ................... ..................... ...................... ........................ .......................... ........................... ............................ ............................. ................................ ................................. .................................. ..................................... ...................................... ........................................ ......................................... ........................................... ............................................ ............................................. .............................................. ............................................../home/adavidoff/git/jason/jason.nim(170, 21) Hint: conversion from Json to itself is pointless [ConvFromXtoItselfNotNeeded] Hint: 78356 lines; 1.656s; 95.086MiB peakmem; Dangerous Release build; proj: /home/adavidoff/git/jason/tests/bench.nim; out: /home/adavidoff/git/jason/bin/bench [SuccessX]running benchmark...Benchmark: encode_stdlib_integer -> ()Collected 216 samplesWarning: Found 39 mild and 9 extreme outliers in the time measurementsWarning: Found 38 mild and 9 extreme outliers in the cycles measurements Time: 92.8919ns ± 91.6156ns Cycles: 341cycles ± 332cyclesBenchmark: encode_jason_integer -> ()Collected 305 samplesWarning: Found 9 mild and 50 extreme outliers in the time measurementsWarning: Found 10 mild and 41 extreme outliers in the cycles measurements Time: 1.6081ns ± 2.9989ns Cycles: 4cycles ± 4cyclesBenchmark: encode_stdlib_bool -> ()Collected 242 samplesWarning: Found 6 mild and 21 extreme outliers in the time measurementsWarning: Found 10 mild and 15 extreme outliers in the cycles measurements Time: 24.0388ns ± 5.7745ns Cycles: 87cycles ± 15cyclesBenchmark: encode_jason_bool -> ()Warning: Found 9 mild and 49 extreme outliers in the time measurementsWarning: Found 10 mild and 39 extreme outliers in the cycles measurements Time: 1.6695ns ± 3.2762nsBenchmark: encode_stdlib_number -> ()Collected 196 samplesWarning: Found 5 mild and 11 extreme outliers in the time measurementsWarning: Found 5 mild and 11 extreme outliers in the cycles measurements Time: 214.0948ns ± 5.0644ns Cycles: 789cycles ± 13cyclesBenchmark: encode_jason_number -> ()Collected 304 samplesWarning: Found 11 mild and 40 extreme outliers in the time measurementsWarning: Found 9 mild and 33 extreme outliers in the cycles measurements Time: 1.6504ns ± 3.1338nsBenchmark: encode_stdlib_string -> ()Collected 220 samplesWarning: Found 7 mild and 13 extreme outliers in the time measurementsWarning: Found 7 mild and 12 extreme outliers in the cycles measurements Time: 68.2352ns ± 5.8528ns Cycles: 250cycles ± 15cyclesBenchmark: encode_jason_string -> ()Warning: Found 10 mild and 45 extreme outliers in the time measurementsWarning: Found 9 mild and 38 extreme outliers in the cycles measurements Time: 1.6408ns ± 3.1185nsBenchmark: encode_stdlib_tuple -> ()Collected 198 samplesWarning: Found 26 mild and 19 extreme outliers in the time measurementsWarning: Found 34 mild and 24 extreme outliers in the cycles measurements Time: 213.5943ns ± 25.6217ns Cycles: 787cycles ± 93cyclesBenchmark: encode_jason_tuple -> ()Collected 204 samplesWarning: Found 10 mild and 12 extreme outliers in the time measurementsWarning: Found 9 mild and 13 extreme outliers in the cycles measurements Time: 153.8108ns ± 6.1598ns Cycles: 566cycles ± 16cyclesBenchmark: encode_stdlib_mixed_tuple -> ()Collected 183 samplesWarning: Found 12 mild and 13 extreme outliers in the time measurements Time: 402.6425ns ± 9.8762ns Cycles: 1'485cycles ± 34cyclesBenchmark: encode_jason_mixed_tuple -> ()Collected 184 samplesWarning: Found 9 mild and 15 extreme outliers in the time measurementsWarning: Found 11 mild and 13 extreme outliers in the cycles measurements Time: 388.7178ns ± 11.1582ns Cycles: 1'434cycles ± 38cyclesBenchmark: encode_stdlib_named_tuple -> ()Collected 193 samplesWarning: Found 6 mild and 32 extreme outliers in the time measurementsWarning: Found 4 mild and 34 extreme outliers in the cycles measurements Time: 247.8049ns ± 22.9927ns Cycles: 913cycles ± 82cyclesBenchmark: encode_jason_named_tuple -> ()Collected 229 samplesWarning: Found 6 mild and 24 extreme outliers in the time measurementsWarning: Found 8 mild and 27 extreme outliers in the cycles measurements Time: 44.0867ns ± 4.7270ns Cycles: 161cycles ± 11cyclesBenchmark: encode_stdlib_array -> ()Collected 195 samplesWarning: Found 9 mild and 13 extreme outliers in the time measurementsWarning: Found 9 mild and 12 extreme outliers in the cycles measurements Time: 226.4039ns ± 5.7284ns Cycles: 834cycles ± 16cyclesBenchmark: encode_jason_array -> ()Collected 203 samplesWarning: Found 4 mild and 20 extreme outliers in the time measurementsWarning: Found 9 mild and 19 extreme outliers in the cycles measurements Time: 160.5346ns ± 13.1453ns Cycles: 591cycles ± 44cyclesBenchmark: encode_stdlib_sequence -> ()Collected 194 samplesWarning: Found 8 mild and 13 extreme outliers in the time measurementsWarning: Found 10 mild and 14 extreme outliers in the cycles measurements Time: 239.0614ns ± 8.1304ns Cycles: 881cycles ± 26cyclesBenchmark: encode_jason_sequence -> ()Warning: Found 9 mild and 16 extreme outliers in the time measurementsWarning: Found 9 mild and 14 extreme outliers in the cycles measurements Time: 153.6812ns ± 6.7684ns Cycles: 566cycles ± 18cyclesBenchmark: encode_stdlib_large_object -> ()Collected 148 samplesWarning: Found 5 mild and 18 extreme outliers in the time measurementsWarning: Found 5 mild and 18 extreme outliers in the cycles measurements Time: 2.3688us ± 236.0849ns Cycles: 8'752cycles ± 872cyclesBenchmark: encode_jason_large_object -> ()Collected 162 samplesWarning: Found 10 mild and 8 extreme outliers in the time measurementsWarning: Found 11 mild and 11 extreme outliers in the cycles measurements Time: 1.1401us ± 24.8788ns Cycles: 4'211cycles ± 89cycles + Hint: 7861 lines; 0.015s; 12.285MiB peakmem; Dangerous Release build; proj: /home/adavidoff/git/jason/tests/bench.nim; out: /home/adavidoff/git/jason/bin/bench [SuccessX] running benchmark...Benchmark: encode_stdlib_integer -> ()Collected 232 samplesWarning: Found 3 mild and 48 extreme outliers in the time measurementsWarning: Found 2 mild and 49 extreme outliers in the cycles measurements Time: 88.7689ns ± 91.3519ns Cycles: 326cycles ± 334cyclesBenchmark: encode_jason_integer -> ()Collected 319 samplesWarning: Found 10 mild and 44 extreme outliers in the time measurementsWarning: Found 13 mild and 33 extreme outliers in the cycles measurements Time: 1.6296ns ± 3.1699ns Cycles: 4cycles ± 4cyclesBenchmark: encode_stdlib_bool -> ()Collected 256 samplesWarning: Found 15 mild and 18 extreme outliers in the time measurementsWarning: Found 10 mild and 16 extreme outliers in the cycles measurements Time: 24.2590ns ± 5.6146ns Cycles: 88cycles ± 14cyclesBenchmark: encode_jason_bool -> ()Warning: Found 9 mild and 50 extreme outliers in the time measurementsWarning: Found 11 mild and 46 extreme outliers in the cycles measurements Time: 1.5805ns ± 2.9625ns Cycles: 4cycles ± 3cyclesBenchmark: encode_stdlib_number -> ()Collected 214 samplesWarning: Found 10 mild and 17 extreme outliers in the time measurementsWarning: Found 8 mild and 16 extreme outliers in the cycles measurements Time: 186.1543ns ± 8.5694ns Cycles: 685cycles ± 17cyclesBenchmark: encode_jason_number -> ()Warning: Found 12 mild and 47 extreme outliers in the time measurementsWarning: Found 15 mild and 32 extreme outliers in the cycles measurements Time: 1.5856ns ± 2.8446nsBenchmark: encode_stdlib_string -> ()Collected 234 samplesWarning: Found 13 mild and 16 extreme outliers in the time measurementsWarning: Found 16 mild and 21 extreme outliers in the cycles measurements Time: 69.4829ns ± 5.9819ns Cycles: 255cycles ± 17cyclesBenchmark: encode_jason_string -> ()Warning: Found 10 mild and 43 extreme outliers in the time measurementsWarning: Found 13 mild and 37 extreme outliers in the cycles measurements Time: 1.5716ns ± 2.7627nsBenchmark: encode_stdlib_tuple -> ()Collected 213 samplesWarning: Found 8 mild and 20 extreme outliers in the time measurementsWarning: Found 9 mild and 20 extreme outliers in the cycles measurements Time: 216.3993ns ± 102.6018ns Cycles: 797cycles ± 378cyclesBenchmark: encode_jason_tuple -> ()Collected 218 samplesWarning: Found 7 mild and 11 extreme outliers in the time measurementsWarning: Found 8 mild and 11 extreme outliers in the cycles measurements Time: 153.5390ns ± 5.0479ns Cycles: 565cycles ± 14cyclesBenchmark: encode_stdlib_mixed_tuple -> ()Collected 200 samplesWarning: Found 4 mild and 5 extreme outliers in the time measurementsWarning: Found 3 mild and 5 extreme outliers in the cycles measurements Time: 370.2078ns ± 11.1726ns Cycles: 1'365cycles ± 27cyclesBenchmark: encode_jason_mixed_tuple -> ()Collected 201 samplesWarning: Found 10 mild and 11 extreme outliers in the time measurementsWarning: Found 9 mild and 10 extreme outliers in the cycles measurements Time: 341.7526ns ± 11.1853ns Cycles: 1'260cycles ± 31cyclesBenchmark: encode_stdlib_named_tuple -> ()Collected 207 samplesWarning: Found 2 mild and 1 extreme outliers in the time measurementsWarning: Found 2 mild and 0 extreme outliers in the cycles measurements Time: 246.9001ns ± 30.6329ns Cycles: 903cycles ± 39cyclesBenchmark: encode_jason_named_tuple -> ()Collected 244 samplesWarning: Found 7 mild and 13 extreme outliers in the time measurementsWarning: Found 4 mild and 14 extreme outliers in the cycles measurements Time: 42.1764ns ± 4.7052ns Cycles: 154cycles ± 10cyclesBenchmark: encode_stdlib_array -> ()Collected 209 samplesWarning: Found 9 mild and 17 extreme outliers in the time measurementsWarning: Found 7 mild and 15 extreme outliers in the cycles measurements Time: 228.9187ns ± 10.1584ns Cycles: 843cycles ± 25cyclesBenchmark: encode_jason_array -> ()Collected 245 samplesWarning: Found 7 mild and 16 extreme outliers in the time measurementsWarning: Found 7 mild and 18 extreme outliers in the cycles measurements Time: 41.5277ns ± 4.1689ns Cycles: 151cycles ± 8cyclesBenchmark: encode_stdlib_sequence -> ()Collected 208 samplesWarning: Found 3 mild and 21 extreme outliers in the time measurementsWarning: Found 5 mild and 18 extreme outliers in the cycles measurements Time: 240.7379ns ± 5.6572ns Cycles: 887cycles ± 16cyclesBenchmark: encode_jason_sequence -> ()Warning: Found 7 mild and 14 extreme outliers in the time measurementsWarning: Found 7 mild and 12 extreme outliers in the cycles measurements Time: 150.6639ns ± 4.7571ns Cycles: 555cycles ± 11cyclesBenchmark: encode_stdlib_large_object -> ()Collected 163 samplesWarning: Found 6 mild and 10 extreme outliers in the time measurementsWarning: Found 6 mild and 10 extreme outliers in the cycles measurements Time: 2.2455us ± 192.9796ns Cycles: 8'296cycles ± 712cyclesBenchmark: encode_jason_large_object -> ()Collected 179 samplesWarning: Found 2 mild and 22 extreme outliers in the cycles measurements Time: 1.0082us ± 203.5046ns Cycles: 3'723cycles ± 752cycles \ No newline at end of file diff --git a/docs/packed.svg b/docs/packed.svg index 9178853..de3dd15 100644 --- a/docs/packed.svg +++ b/docs/packed.svg @@ -16,67 +16,32 @@ } :root { - --animation-duration: 46744ms; + --animation-duration: 45006ms; } @keyframes roll { 0.000%{transform:translateY(0px)} -0.152%{transform:translateY(-544px)} -0.163%{transform:translateY(-1088px)} -0.180%{transform:translateY(-1632px)} -0.182%{transform:translateY(-2176px)} -0.190%{transform:translateY(-2720px)} -0.195%{transform:translateY(-3264px)} -0.246%{transform:translateY(-3808px)} -0.257%{transform:translateY(-4352px)} -0.282%{transform:translateY(-4896px)} -0.297%{transform:translateY(-5440px)} -0.674%{transform:translateY(-5984px)} -0.700%{transform:translateY(-6528px)} -0.712%{transform:translateY(-7072px)} -0.770%{transform:translateY(-7616px)} -0.779%{transform:translateY(-8160px)} -0.781%{transform:translateY(-8704px)} -0.787%{transform:translateY(-9248px)} -0.809%{transform:translateY(-9792px)} -0.969%{transform:translateY(-10336px)} -0.988%{transform:translateY(-10880px)} -0.991%{transform:translateY(-11424px)} -0.999%{transform:translateY(-11968px)} -1.005%{transform:translateY(-12512px)} -1.025%{transform:translateY(-13056px)} -1.029%{transform:translateY(-13600px)} -1.031%{transform:translateY(-14144px)} -1.042%{transform:translateY(-14688px)} -1.053%{transform:translateY(-15232px)} -1.095%{transform:translateY(-15776px)} -1.108%{transform:translateY(-16320px)} -1.110%{transform:translateY(-16864px)} -1.166%{transform:translateY(-17408px)} -1.189%{transform:translateY(-17952px)} -1.202%{transform:translateY(-18496px)} -1.305%{transform:translateY(-19040px)} -3.718%{transform:translateY(-19584px)} -3.731%{transform:translateY(-20128px)} -10.149%{transform:translateY(-20672px)} -16.567%{transform:translateY(-21216px)} -22.985%{transform:translateY(-21760px)} -29.403%{transform:translateY(-22304px)} -35.821%{transform:translateY(-22848px)} -42.239%{transform:translateY(-23392px)} -48.657%{transform:translateY(-23936px)} -55.074%{transform:translateY(-24480px)} -61.492%{transform:translateY(-25024px)} -67.910%{transform:translateY(-25568px)} -74.328%{transform:translateY(-26112px)} -80.746%{transform:translateY(-26656px)} -87.164%{transform:translateY(-27200px)} -93.582%{transform:translateY(-27744px)} -100.000%{transform:translateY(-27744px)} +0.002%{transform:translateY(-544px)} +6.668%{transform:translateY(-1088px)} +13.334%{transform:translateY(-1632px)} +20.000%{transform:translateY(-2176px)} +26.665%{transform:translateY(-2720px)} +33.331%{transform:translateY(-3264px)} +33.342%{transform:translateY(-3808px)} +40.008%{transform:translateY(-4352px)} +46.674%{transform:translateY(-4896px)} +53.340%{transform:translateY(-5440px)} +60.005%{transform:translateY(-5984px)} +66.671%{transform:translateY(-6528px)} +73.337%{transform:translateY(-7072px)} +80.003%{transform:translateY(-7616px)} +86.668%{transform:translateY(-8160px)} +93.334%{transform:translateY(-8704px)} +100.000%{transform:translateY(-8704px)} } #screen_view { - animation-duration: 46744ms; + animation-duration: 45006ms; animation-iteration-count:infinite; animation-name:roll; animation-timing-function: steps(1,end); @@ -111,5 +76,5 @@ - . .. ... ...... ....... .......... ........... ............ ............. ............... ................ .................. ................... ..................... ...................... ........................ .......................... ........................... ............................ ............................. ................................ ................................. .................................. ..................................... ...................................... ........................................ ......................................... ........................................... ............................................ ............................................. ............................................... ................................................ ................................................/home/adavidoff/git/jason/jason.nim(170, 21) Hint: conversion from Json to itself is pointless [ConvFromXtoItselfNotNeeded] /home/adavidoff/git/jason/tests/packed.nim(1, 11) Warning: imported and not used: 'jsonutils' [UnusedImport]Hint: 79519 lines; 1.741s; 94.844MiB peakmem; Dangerous Release build; proj: /home/adavidoff/git/jason/tests/packed.nim; out: /home/adavidoff/git/jason/bin/packed [SuccessX]running benchmark...Benchmark: encode_packed_integer -> ()Collected 202 samplesWarning: Found 6 mild and 3 extreme outliers in the time measurementsWarning: Found 6 mild and 6 extreme outliers in the cycles measurements Time: 171.9709ns ± 26.8555ns Cycles: 633cycles ± 94cyclesBenchmark: encode_jason_integer -> ()Collected 305 samplesWarning: Found 11 mild and 46 extreme outliers in the time measurementsWarning: Found 10 mild and 40 extreme outliers in the cycles measurements Time: 1.6559ns ± 3.5038ns Cycles: 4cycles ± 4cyclesBenchmark: encode_packed_bool -> ()Collected 235 samplesWarning: Found 10 mild and 16 extreme outliers in the time measurementsWarning: Found 12 mild and 15 extreme outliers in the cycles measurements Time: 34.2080ns ± 4.7942ns Cycles: 124cycles ± 10cyclesBenchmark: encode_jason_bool -> ()Warning: Found 9 mild and 46 extreme outliers in the time measurementsWarning: Found 11 mild and 41 extreme outliers in the cycles measurements Time: 1.6731ns ± 3.5317nsBenchmark: encode_packed_number -> ()Collected 178 samplesWarning: Found 15 mild and 11 extreme outliers in the time measurementsWarning: Found 17 mild and 9 extreme outliers in the cycles measurements Time: 540.5071ns ± 10.6872ns Cycles: 1'995cycles ± 34cyclesBenchmark: encode_jason_number -> ()Warning: Found 10 mild and 40 extreme outliers in the time measurementsWarning: Found 11 mild and 25 extreme outliers in the cycles measurements Time: 1.6485ns ± 3.0916nsBenchmark: encode_packed_string -> ()Collected 205 samplesWarning: Found 6 mild and 17 extreme outliers in the time measurementsWarning: Found 6 mild and 17 extreme outliers in the cycles measurements Time: 141.3075ns ± 8.3253ns Cycles: 520cycles ± 26cyclesBenchmark: encode_jason_string -> ()Warning: Found 10 mild and 42 extreme outliers in the cycles measurements Time: 1.5978ns ± 2.8876ns Cycles: 4cycles ± 3cyclesNOTE: tuple serialization is unsupported by packedjsonBenchmark: encode_packed_array -> ()Collected 177 samplesWarning: Found 10 mild and 9 extreme outliers in the time measurementsWarning: Found 9 mild and 10 extreme outliers in the cycles measurements Time: 562.8830ns ± 10.8896ns Cycles: 2'078cycles ± 36cyclesBenchmark: encode_jason_array -> ()Collected 204 samplesWarning: Found 5 mild and 17 extreme outliers in the time measurementsWarning: Found 11 mild and 19 extreme outliers in the cycles measurements Time: 147.5788ns ± 6.4912ns Cycles: 543cycles ± 17cyclesNOTE: uint serialization is unsupported by packedjsonBenchmark: encode_packed_sequence -> ()Collected 173 samplesWarning: Found 10 mild and 13 extreme outliers in the time measurementsWarning: Found 9 mild and 13 extreme outliers in the cycles measurements Time: 719.3250ns ± 216.1390ns Cycles: 2'656cycles ± 797cyclesBenchmark: encode_jason_sequence -> ()Warning: Found 7 mild and 16 extreme outliers in the time measurementsWarning: Found 9 mild and 14 extreme outliers in the cycles measurements Time: 152.7725ns ± 12.7295ns Cycles: 562cycles ± 42cyclesBenchmark: encode_packed_large_object -> ()Collected 141 samplesWarning: Found 8 mild and 7 extreme outliers in the time measurementsWarning: Found 7 mild and 7 extreme outliers in the cycles measurements Time: 3.2532us ± 175.1948ns Cycles: 12'020cycles ± 647cyclesBenchmark: encode_jason_large_object -> ()Collected 183 samplesWarning: Found 11 mild and 13 extreme outliers in the time measurementsWarning: Found 13 mild and 13 extreme outliers in the cycles measurements Time: 437.6226ns ± 122.1566ns Cycles: 1'615cycles ± 450cycles + Hint: 7861 lines; 0.015s; 12.277MiB peakmem; Dangerous Release build; proj: /home/adavidoff/git/jason/tests/packed.nim; out: /home/adavidoff/git/jason/bin/packed [SuccessX] running benchmark...Benchmark: encode_packed_integer -> ()Collected 216 samplesWarning: Found 1 mild and 4 extreme outliers in the time measurementsWarning: Found 2 mild and 3 extreme outliers in the cycles measurements Time: 175.0547ns ± 29.9833ns Cycles: 644cycles ± 107cyclesBenchmark: encode_jason_integer -> ()Collected 316 samplesWarning: Found 10 mild and 45 extreme outliers in the time measurementsWarning: Found 14 mild and 28 extreme outliers in the cycles measurements Time: 1.8675ns ± 3.3367ns Cycles: 5cycles ± 5cyclesBenchmark: encode_packed_bool -> ()Collected 247 samplesWarning: Found 19 mild and 19 extreme outliers in the time measurementsWarning: Found 12 mild and 23 extreme outliers in the cycles measurements Time: 36.4596ns ± 4.8618ns Cycles: 133cycles ± 11cyclesBenchmark: encode_jason_bool -> ()Collected 315 samplesWarning: Found 9 mild and 44 extreme outliers in the time measurementsWarning: Found 14 mild and 36 extreme outliers in the cycles measurements Time: 1.8169ns ± 3.1390ns Cycles: 5cycles ± 4cyclesBenchmark: encode_packed_number -> () Benchmark: encode_packed_number -> ()Collected 191 samplesWarning: Found 4 mild and 13 extreme outliers in the time measurementsWarning: Found 5 mild and 13 extreme outliers in the cycles measurements Time: 544.4607ns ± 14.2223ns Cycles: 2'010cycles ± 50cyclesBenchmark: encode_jason_number -> ()Warning: Found 10 mild and 46 extreme outliers in the time measurementsWarning: Found 12 mild and 37 extreme outliers in the cycles measurements Time: 1.7914ns ± 2.9354ns Cycles: 5cycles ± 3cyclesBenchmark: encode_packed_string -> ()Collected 221 samplesWarning: Found 16 mild and 18 extreme outliers in the time measurementsWarning: Found 13 mild and 18 extreme outliers in the cycles measurements Time: 130.8448ns ± 10.0553ns Cycles: 481cycles ± 34cyclesBenchmark: encode_jason_string -> ()Warning: Found 9 mild and 49 extreme outliers in the time measurementsWarning: Found 11 mild and 39 extreme outliers in the cycles measurements Time: 1.8218ns ± 3.0580nsNOTE: tuple serialization is unsupported by packedjsonBenchmark: encode_packed_array -> ()Collected 190 samplesWarning: Found 10 mild and 9 extreme outliers in the time measurementsWarning: Found 9 mild and 9 extreme outliers in the cycles measurements Time: 583.6257ns ± 25.9860ns Cycles: 2'153cycles ± 93cyclesBenchmark: encode_jason_array -> ()Collected 244 samplesWarning: Found 4 mild and 14 extreme outliers in the time measurementsWarning: Found 5 mild and 12 extreme outliers in the cycles measurements Time: 42.8021ns ± 4.6713ns Cycles: 156cycles ± 10cyclesNOTE: uint serialization is unsupported by packedjsonBenchmark: encode_packed_sequence -> ()Collected 187 samplesWarning: Found 7 mild and 13 extreme outliers in the time measurements Time: 684.3491ns ± 32.0145ns Cycles: 2'527cycles ± 117cyclesBenchmark: encode_jason_sequence -> ()Collected 218 samplesWarning: Found 5 mild and 16 extreme outliers in the time measurementsWarning: Found 9 mild and 13 extreme outliers in the cycles measurements Time: 151.8951ns ± 6.3181ns Cycles: 559cycles ± 16cyclesBenchmark: encode_packed_large_object -> ()Collected 156 samplesWarning: Found 7 mild and 8 extreme outliers in the time measurementsWarning: Found 6 mild and 8 extreme outliers in the cycles measurements Time: 3.0607us ± 77.6870ns Cycles: 11'309cycles ± 286cyclesBenchmark: encode_jason_large_object -> ()Collected 202 samplesWarning: Found 2 mild and 19 extreme outliers in the time measurementsWarning: Found 2 mild and 18 extreme outliers in the cycles measurements Time: 368.3217ns ± 98.1059ns Cycles: 1'353cycles ± 353cycles \ No newline at end of file diff --git a/jason.nim b/jason.nim index 7bd291d..32f521c 100644 --- a/jason.nim +++ b/jason.nim @@ -167,19 +167,24 @@ macro jason*[I, T](a: array[I, T]): Json = error "unexpected infix range:\n" & treeRepr(ranger) # okay, let's do this thing - let js = bindSym"jason" - let amper = bindSym"&" # we need our Json concatenator + let js = ident"jason" + let s = genSym(nskVar, "jason") var list = newStmtList() - list.add jasonify"[" + # we'll make adding strings to our accumulating string easier... + template addString(x: typed): NimNode {.dirty.} = + # also cast the argument to a string just for correctness + list.add newCall(newDotExpr(s, bindSym"add"), newCall(ident"string", x)) + # iterate over the array by index and add each item to the string + list.add newVarStmt(s, newLit"[") for index in ranger[1].intVal .. ranger[2].intVal: if index != 0: - list.add jasonify"," # comma between each element + addString newLit"," # comma between each element # build and invoke the array access expression `a[i]` let access = newTree(nnkBracketExpr, a, index.newLit) - list.add newCall(js, access).jasonify - list.add jasonify"]" - result = nestList(amper, list) # concatenate it all - result = jasonify result # merge literals, etc. + addString newCall(js, access) + addString newLit"]" + list.add s # final value of the stmtlist is the string itself + result = newCall(bindSym"Json", list) when false: macro jason[T](j: T{lit|`const`}): Json = diff --git a/jason.nimble b/jason.nimble index b065134..8a616cc 100644 --- a/jason.nimble +++ b/jason.nimble @@ -1,4 +1,4 @@ -version = "0.2.2" +version = "0.3.0" author = "disruptek" description = "compile-time json" license = "MIT" diff --git a/tests/bench.nim b/tests/bench.nim index 2d3d0d5..9ff84a4 100644 --- a/tests/bench.nim +++ b/tests/bench.nim @@ -33,7 +33,7 @@ const var cfg = newDefaultConfig() cfg.brief = true -cfg.budget = 0.5 +cfg.budget = 1.0 echo "running benchmark..." diff --git a/tests/nim.cfg b/tests/nim.cfg index 9dd3201..7e2aece 100644 --- a/tests/nim.cfg +++ b/tests/nim.cfg @@ -3,4 +3,5 @@ --hint[Cc]=off --hint[Link]=off --hint[XDeclaredButNotUsed]=off +--hint[ConvFromXtoItselfNotNeeded]=off --path="$config/../" diff --git a/tests/packed.nim b/tests/packed.nim index cf5a090..8d4fd42 100644 --- a/tests/packed.nim +++ b/tests/packed.nim @@ -1,5 +1,3 @@ -import std/jsonutils - import jason import criterion @@ -35,7 +33,7 @@ const var cfg = newDefaultConfig() cfg.brief = true -cfg.budget = 0.5 +cfg.budget = 1.0 echo "running benchmark..."