Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add scripts for JSON performance testing. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | json5 |
Files: | files | file ages | folders |
SHA3-256: |
3051d6a7c12cbf86634d8fab64f3f3bc |
User & Date: | drh 2023-04-26 13:25:30 |
Context
2023-04-26
| ||
13:52 | Fix to the json-speed-check.sh script. (check-in: d839c954 user: drh tags: json5) | |
13:25 | Add scripts for JSON performance testing. (check-in: 3051d6a7 user: drh tags: json5) | |
2023-04-25
| ||
21:24 | The json_valid() function only returns true for pure JSON. JSON5 (or at least that subset of JSON5 that has been so far implemented) is accepted by all routines, but json_valid() still returns false for JSON5 inputs. The new json_valid5(X) routine returns true or false if X is or is not valid JSON5. All of this is experimental and subject to change. (check-in: 5d33ab77 user: drh tags: json5) | |
Changes
Added test/json/README.md.
> > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | The files in this subdirectory are used to help measure the performance of the SQLite JSON parser. # 1.0 Prerequisites 1. Valgrind 2. Fossil # 2.0 Setup 1. Run: "`tclsh json-generator.tcl | sqlite3 json100mb.db`" to create the 100 megabyte test database. Do this so that the "json100mb.db" file lands in the same directory as the json-generator.tcl script. 2. Build the baseline sqlite3.c file. ("`make sqlite3.c`") 3. Run "`sh json-speed-check-1.sh trunk`". This creates the baseline profile in "jout-trunk.txt". # 3.0 Testing 1. Build the sqlite3.c to be tested. 2. Run "`sh json-speed-check-1.sh x1`". The profile output will appear in jout-x1.txt. Substitute any label you want in place of "x1". |
Added test/json/json-generator.tcl.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 | #!/usr/bin/tclsh # # Generate SQL that will populate an SQLite database with about 100 megabytes # of pseudo-random JSON text. # # tclsh json-generator.tcl | sqlite3 json110mb.db # # srand() is used to initialize the random seed so that the same JSON # is generated for every run. # expr srand(12345678) set wordlist { ability able abroad access account act action active actor add address adept adroit advance advice affect age ageless agency agent agile agree air airfare airline airport alert almond alpha always amend amount amplify analyst anchor angel angelic angle ankle annual answer antique anybody anyhow appeal apple apricot apt area argon arm army arrival arsenic art artful article arugula aside ask aspect assist assume atom atone attempt author autumn average avocado award awl azure back bacon bag bagel bake baker balance ball balloon bamboo banana band banjo bank barium base basil basin basis basket bass bat bath battery beach beak bean bear bearcub beauty beef beet beige being bell belly belt bench bend benefit best beta better beyond bicycle bid big bike bill bird biscuit bismuth bisque bit black blank blest blind bliss block bloom blue board boat body bokchoy bone bonus book bookish boot border boron boss bossy bottle bottom bow bowl bowtie box brain brainy branch brave bravely bread break breath breezy brick bridge brie brief briefly bright broad broil bromine bronze brother brow brown brush buddy budget buffalo bug bugle bull bunch burger burly burrito bus busy butter button buy buyer byte cab cabbage cabinet cable cadet cadmium caesium cake calcium caliper call caller calm calmly camera camp can canary cancel candle candy cap capable caper capital captain car carbon card care career careful carp carpet carrot carry case cash cassava casual cat catch catfish catsear catsup cause cave celery cell century chain chair chalk chance change channel chapter chard charge charity chart check cheddar cheery cheese chicken chicory chiffon child chin chip chives choice chowder chum church circle city claim clam class classic classy clay clean cleaner clear clearly clerk click client climate clock clorine closet clothes cloud clown club clue cluster coach coast coat cobbler cobolt cod code coffee colby cold collar college comb combine comet comfort command comment common company complex concept concern concert conduit consist contact contest context control convert cook cookie copilot copper copy coral cordial corn corner corny correct cost count counter country county couple courage course court cover cow cowbird crab crack craft crash crazy cream credit creek cress crevice crew crimson croaker crop cross crowd cube cuckoo cuisine culture cup current curve cut cyan cycle dagger daily dance dare darter data date day daylily deal dear dearly debate debit decade decimal deep deft deftly degree delay deluxe deposit depth design desk detail device dew diamond diet dig dill dinner dip direct dirt dish disk display diver divide divine doctor dodger donut door dot double dough draft drag dragon drama draw drawer drawing dream drill drink drive driver drop drum dry dryer drywall duck due dump dusk dust duty dye eagle ear earring earth ease east easy eat economy edge editor eel effect effort egg eight elbow elegant element elf elk email emerald employ end endive endless energy engine enjoy enter entry equal equip error escape essay eternal evening event exam example excuse exit expert extent extreme eye face fact factor factual fail failure fair fajita fall family fan fang farm farmer fat fault feature feed feel feeling fench fennel festive few fiber field fig figure file fill film filter final finance finding finger finish fire fish fishing fit fitting five fix flier flight floor floral florine flour flow flower fly flying focus fold folding food foot force forest forever forgive form formal format fortune forum frame free freedom freely fresh friend frog front fruit fuchsia fuel fun funny future gain galaxy gallium game gamma gap garage garden garlic gas gate gather gauge gear gem gene general gentle gently gherkin ghost gift give glad glass gleeful glossy glove glue goal goat goby gold goldeye golf good gouda goulash gourd grab grace grade gram grand grape grapes grass gravy gray great green grits grocery ground group grouper grout growth guard guave guess guest guide guitar gumbo guppy habit hacksaw haddock hafnium hagfish hair half halibut hall hammer hand handle handy hanger happy hat havarti hay haybale head health healthy hearing heart hearty heat heavy heel height helium hello help helpful herald herring hide high highly highway hill hip hipster hire history hit hoki hold hole holiday holly home honest honey hook hope hopeful horizon horn horse host hotel hour house housing human humane humor hunt hurry ice icecube icefish icy idea ideal image impact impress inch income indigo initial inkpen insect inside intense invite iodine iridium iron island issue item ivory jacket jargon javelin jello jelly jewel job jocund join joint joke jovial joy joyful joyous judge juice jump junior jury just justice kale keel keep kelp ketchup key keyhole keyway khaki kick kid kidney kiloohm kind kindly king kitchen kite kiwi knee knife krill krypton kumquat lab lace lack ladder lake lamp lamprey land laser laugh law lawn lawyer layer lead leader leading leaf leafy league leather leave lecture leek leg lemon length lentil lesson let letter lettuce level library life lift light lily lime limit line linen link lip list listen lithium lively living lizard load loan lobster local lock log long longfin look lotus love lovely loving low lucid luck luffa lunch lung machine magenta magnet mail main major make mall manager mango manner many map march market maroon martian master match math matter maximum maybe meal meaning meat media medium meet meeting melody melon member memory mention menu mercury merry mess message messy metal meter method micron middle might mile milk mind mine minimum minnow minor mint minute mirror miss mission misty mix mixer mixture mobile mode model moment monitor monk month moon moray morning most motor mouse mouth move mover movie much mud mudfish muffin mullet munster muon muscle music mustard nail name nation native natural nature navy neat neatly nebula neck needle neon nerve net network neutron news nibble nice nickel night niobium nobody noise noodle normal north nose note nothing notice nova novel number nurse nursery oar object offer office officer oil okay okra old olive one onion open opening opinion option orange orbit orchid order oregano other ounce outcome outside oven owner oxygen oyster pace pack package page pager paint pair pale pan pancake papaya paper pardon parent park parking parsley parsnip part partner party pass passage past pasta path patient pattern pause pay pea peace peach peacock peahen peak peanut pear pearl pen penalty pencil pension people pepper perch perfect period permit person phase phone photo phrase physics piano pick picture pie piece pigeon pike pilot pin pink pinkie pious pipe pitch pizza place plan plane planet plant planter plastic plate play player playful plenty pliers plum pod poem poet poetry point police policy pollock pony pool pop popover poptart pork port portal post pot potato pound powder power present press price pride primary print prior private prize problem process produce product profile profit program project promise prompt proof proper protein proton public puff puffer pull pumpkin pup pupfish pure purple purpose push put quality quark quarter quiet quill quit quote rabbit raccoon race radiant radio radish radium radon rain rainbow raise ramp ranch range rasp rate ratio ray razor reach read reading real reality reason recipe record recover red redeem reed reef refuse region regret regular relaxed release relief relish remote remove rent repair repeat reply report request reserve resist resolve resort rest result return reveal review reward ribbon rice rich ride ridge right ring rise risk river rivet road roast rock rocket role roll roof room rope rose rough roughy round row royal rub ruby rudder ruin rule run runner rush rust sacred saddle safe safety sail salad salami sale salmon salt sample sand sander sandy sauce save saving saw scale scampi scene scheme school score screen script sea search season seat second secret sector seemly self sell senate senior sense series serve set shake shape share shark shell shift shine shiny ship shock shoe shoot shop shovel show side sign signal silk silly silver simple sing singer single sink site size skill skin sky slate sleep sleepy slice slide slip smart smell smelt smile smoke smooth snap snipe snow snowy sock socket sodium soft softly soil sole solid song sorrel sort soul sound soup source south space spare speech speed spell spend sphere spice spider spirit spite split spoon sport spot spray spread spring squab square squash stable staff stage stand staple star start state status stay steak steel step stern stew stick still stock stone stop store storm story strain street stress strike string stroke strong studio study stuff style sugar suit sulfur summer sun sunny sunset super superb surf survey sweet swim swing switch symbol system table tackle tail tale talk tan tank tap tape target task taste tau tea teach teal team tear tell ten tender tennis tent term test tetra text thanks theme theory thing think thread throat thumb ticket tidy tie tiger till time timely tin tip title toast today toe tomato tone tongue tool tooth top topic total touch tough tour towel tower town track trade train trash travel tray treat tree trick trip trout trowel truck trupet trust truth try tube tuna tune turf turkey turn turnip tutor tux tweet twist two type union unique unit upbeat upper use useful user usual valley value van vase vast veil vein velvet verse very vessel vest video view violet visit visual vivid voice volume vowel voyage waffle wait wake walk wall warm warmth wasabi wash watch water wave wax way wealth wear web wedge week weekly weight west whale what wheat wheel when where while who whole why will win wind window wing winner winter wire wish witty wolf wonder wood wool woolly word work worker world worry worth worthy wrap wrench wrist writer xenon yak yam yard yarrow year yearly yellow yew yogurt young youth zebra zephyr zinc zone zoo } set nwordlist [llength $wordlist] proc random_char {} { return [string index \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" \ [expr {int(rand()*52)}]] } proc random_label {} { set label [random_char] while {rand()>0.8} { append label [random_char] } if {rand()>0.9} {append label -} append label [format %d [expr {int(rand()*100)}]] return $label } proc random_numeric {} { set n [expr {(rand()*2-1.0)*1e6}] switch [expr {int(rand()*6)}] { 0 {set format %.3f} 1 {set format %.6E} 2 {set format %.4e} default {set format %g} } return [format $format $n] } proc random_json {limit indent} { global nwordlist wordlist set res {} if {$indent==0 || ($limit>0 && rand()>0.5)} { incr limit -1 incr indent 2 set n [expr {int(rand()*5)+1}] if {$n==5} {incr n [expr {int(rand()*10)}]} if {rand()>0.5} { set res \173\n for {set i 0} {$i<$n} {incr i} { append res [string repeat { } $indent] if {rand()>0.8} { if {rand()>0.5} { set sep ":\n [string repeat { } $indent]" } else { set sep " : " } } else { set sep : } append res \"[random_label]\"$sep[random_json $limit $indent] if {$i<$n-1} {append res ,} append res \n } incr indent -2 append res [string repeat { } $indent] append res \175 return $res } else { set res \[\n for {set i 0} {$i<$n} {incr i} { append res [string repeat { } $indent] append res [random_json $limit $indent] if {$i<$n-1} {append res ,} append res \n } incr indent -2 append res [string repeat { } $indent] append res \] return $res } } elseif {rand()>0.9} { if {rand()>0.7} {return "true"} if {rand()>0.5} {return "false"} return "null" } elseif {rand()>0.5} { return [random_numeric] } else { set res \" set n [expr {int(rand()*4)+1}] if {$n>=4} {set n [expr {$n+int(rand()*6)}]} for {set i 0} {$i<$n} {incr i} { if {rand()<0.05} { set w [random_numeric] } else { set k [expr {int(rand()*$nwordlist)}] set w [lindex $wordlist $k] } if {rand()<0.07} { set w \\\"$w\\\" } if {$i<$n-1} { switch [expr {int(rand()*9)}] { 0 {set sp {, }} 1 {set sp "\\n "} 2 {set sp "-"} default {set sp { }} } append res $w$sp } else { append res $w if {rand()<0.2} {append res .} } } return $res\" } } puts "CREATE TABLE IF NOT EXISTS data1(x JSON);" puts "BEGIN;" set sz 0 for {set i 0} {$sz<100000000} {incr i} { set j [random_json 7 0] incr sz [string length $j] puts "INSERT INTO data1(x) VALUES('$j');" } puts "COMMIT;" puts "SELECT sum(length(x)) FROM data1;" |
Added test/json/json-q1.txt.
> > > > | 1 2 3 4 | .mode qbox .timer on .param set $label 'q87' SELECT rowid, x->>$label FROM data1 WHERE x->>$label IS NOT NULL; |
Added test/json/json-speed-check.sh.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #!/bin/bash # # This is a template for a script used for day-to-day size and # performance monitoring of SQLite. Typical usage: # # sh speed-check.sh trunk # Baseline measurement of trunk # sh speed-check.sh x1 # Measure some experimental change # fossil xdiff --tk jout-trunk.txt jout-x1.txt # View chanages # # There are multiple output files, all with a base name given by # the first argument: # # summary-$BASE.txt # Copy of standard output # jout-$BASE.txt # cachegrind output # explain-$BASE.txt # EXPLAIN listings (only with --explain) # if test "$1" = "" then echo "Usage: $0 OUTPUTFILE [OPTIONS]" exit fi NAME=$1 shift #CC_OPTS="-DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_MEMSYS5" CC_OPTS="-DSQLITE_ENABLE_MEMSYS5" CC=gcc LEAN_OPTS="-DSQLITE_THREADSAFE=0" LEAN_OPTS="$LEAN_OPTS -DSQLITE_DEFAULT_MEMSTATUS=0" LEAN_OPTS="$LEAN_OPTS -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1" LEAN_OPTS="$LEAN_OPTS -DSQLITE_LIKE_DOESNT_MATCH_BLOBS" LEAN_OPTS="$LEAN_OPTS -DSQLITE_MAX_EXPR_DEPTH=0" LEAN_OPTS="$LEAN_OPTS -DSQLITE_OMIT_DECLTYPE" LEAN_OPTS="$LEAN_OPTS -DSQLITE_OMIT_DEPRECATED" LEAN_OPTS="$LEAN_OPTS -DSQLITE_OMIT_PROGRESS_CALLBACK" LEAN_OPTS="$LEAN_OPTS -DSQLITE_OMIT_SHARED_CACHE" LEAN_OPTS="$LEAN_OPTS -DSQLITE_USE_ALLOCA" BASELINE="trunk" doExplain=0 doCachegrind=1 doVdbeProfile=0 doWal=1 doDiff=1 while test "$1" != ""; do case $1 in --nodiff) doDiff=0 ;; --lean) CC_OPTS="$CC_OPTS $LEAN_OPTS" ;; --clang) CC=clang ;; --gcc7) CC=gcc-7 ;; -*) CC_OPTS="$CC_OPTS $1" ;; *) BASELINE=$1 ;; esac shift done echo "NAME = $NAME" | tee summary-$NAME.txt echo "CC_OPTS = $CC_OPTS" | tee -a summary-$NAME.txt rm -f cachegrind.out.* jsonshell $CC -g -Os -Wall -I. $CC_OPTS ./shell.c ./sqlite3.c -o jsonshell -ldl -lpthread ls -l jsonshell | tee -a summary-$NAME.txt home=/home/drh/sqlite/json-perf valgrind --tool=cachegrind ./jsonshell $home/json100mb.db <$home/json-q1.txt \ 2>&1 | tee -a summary-$NAME.txt cg_anno.tcl cachegrind.out.* >jout-$NAME.txt echo '*****************************************************' >>jout-$NAME.txt sed 's/^[0-9=-]\{9\}/==00000==/' summary-$NAME.txt >>jout-$NAME.txt if test "$NAME" != "$BASELINE"; then fossil xdiff --tk -c 20 jout-$BASELINE.txt jout-$NAME.txt fi |