1 #!/usr/bin/tclsh 2 # 3 # Run this script using TCLSH to do a speed comparison between 4 # various versions of SQLite and PostgreSQL and MySQL 5 # 6 7 # Run a test 8 # 9 set cnt 1 10 proc runtest {title} { 11 global cnt 12 set sqlfile test$cnt.sql 13 puts "<h2>Test $cnt: $title</h2>" 14 incr cnt 15 set fd [open $sqlfile r] 16 set sql [string trim [read $fd [file size $sqlfile]]] 17 close $fd 18 set sx [split $sql \n] 19 set n [llength $sx] 20 if {$n>8} { 21 set sql {} 22 for {set i 0} {$i<3} {incr i} {append sql [lindex $sx $i]<br>\n} 23 append sql "<i>... [expr {$n-6}] lines omitted</i><br>\n" 24 for {set i [expr {$n-3}]} {$i<$n} {incr i} { 25 append sql [lindex $sx $i]<br>\n 26 } 27 } else { 28 regsub -all \n [string trim $sql] <br> sql 29 } 30 puts "<blockquote>" 31 puts "$sql" 32 puts "</blockquote><table border=0 cellpadding=0 cellspacing=0>" 33 set format {<tr><td>%s</td><td align="right"> %.3f</td></tr>} 34 set delay 1000 35 exec sync; after $delay; 36 set t [time "exec psql drh <$sqlfile" 1] 37 set t [expr {[lindex $t 0]/1000000.0}] 38 puts [format $format PostgreSQL: $t] 39 exec sync; after $delay; 40 set t [time "exec mysql -f drh <$sqlfile" 1] 41 set t [expr {[lindex $t 0]/1000000.0}] 42 puts [format $format MySQL: $t] 43 # set t [time "exec ./sqlite232 s232.db <$sqlfile" 1] 44 # set t [expr {[lindex $t 0]/1000000.0}] 45 # puts [format $format {SQLite 2.3.2:} $t] 46 # set t [time "exec ./sqlite-100 s100.db <$sqlfile" 1] 47 # set t [expr {[lindex $t 0]/1000000.0}] 48 # puts [format $format {SQLite 2.4 (cache=100):} $t] 49 exec sync; after $delay; 50 set t [time "exec ./sqlite240 s2k.db <$sqlfile" 1] 51 set t [expr {[lindex $t 0]/1000000.0}] 52 puts [format $format {SQLite 2.4:} $t] 53 exec sync; after $delay; 54 set t [time "exec ./sqlite240 sns.db <$sqlfile" 1] 55 set t [expr {[lindex $t 0]/1000000.0}] 56 puts [format $format {SQLite 2.4 (nosync):} $t] 57 # set t [time "exec ./sqlite-t1 st1.db <$sqlfile" 1] 58 # set t [expr {[lindex $t 0]/1000000.0}] 59 # puts [format $format {SQLite 2.4 (test):} $t] 60 puts "</table>" 61 } 62 63 # Initialize the environment 64 # 65 expr srand(1) 66 catch {exec /bin/sh -c {rm -f s*.db}} 67 set fd [open clear.sql w] 68 puts $fd { 69 drop table t1; 70 drop table t2; 71 } 72 close $fd 73 catch {exec psql drh <clear.sql} 74 catch {exec mysql drh <clear.sql} 75 set fd [open 2kinit.sql w] 76 puts $fd { 77 PRAGMA default_cache_size=2000; 78 PRAGMA default_synchronous=on; 79 } 80 close $fd 81 exec ./sqlite240 s2k.db <2kinit.sql 82 exec ./sqlite-t1 st1.db <2kinit.sql 83 set fd [open nosync-init.sql w] 84 puts $fd { 85 PRAGMA default_cache_size=2000; 86 PRAGMA default_synchronous=off; 87 } 88 close $fd 89 exec ./sqlite240 sns.db <nosync-init.sql 90 set ones {zero one two three four five six seven eight nine 91 ten eleven twelve thirteen fourteen fifteen sixteen seventeen 92 eighteen nineteen} 93 set tens {{} ten twenty thirty forty fifty sixty seventy eighty ninety} 94 proc number_name {n} { 95 if {$n>=1000} { 96 set txt "[number_name [expr {$n/1000}]] thousand" 97 set n [expr {$n%1000}] 98 } else { 99 set txt {} 100 } 101 if {$n>=100} { 102 append txt " [lindex $::ones [expr {$n/100}]] hundred" 103 set n [expr {$n%100}] 104 } 105 if {$n>=20} { 106 append txt " [lindex $::tens [expr {$n/10}]]" 107 set n [expr {$n%10}] 108 } 109 if {$n>0} { 110 append txt " [lindex $::ones $n]" 111 } 112 set txt [string trim $txt] 113 if {$txt==""} {set txt zero} 114 return $txt 115 } 116 117 118 set fd [open test$cnt.sql w] 119 puts $fd "BEGIN;" 120 puts $fd "CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));" 121 for {set i 1} {$i<=25000} {incr i} { 122 set r [expr {int(rand()*500000)}] 123 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 124 } 125 puts $fd "COMMIT;" 126 close $fd 127 runtest {25000 INSERTs in a transaction} 128 129 130 set fd [open test$cnt.sql w] 131 puts $fd "DELETE FROM t1;" 132 close $fd 133 runtest {DELETE everything} 134 135 136 set fd [open test$cnt.sql w] 137 puts $fd "BEGIN;" 138 for {set i 1} {$i<=25000} {incr i} { 139 set r [expr {int(rand()*500000)}] 140 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 141 } 142 puts $fd "COMMIT;" 143 close $fd 144 runtest {25000 INSERTs in a transaction} 145 146 147 set fd [open test$cnt.sql w] 148 puts $fd "DELETE FROM t1;" 149 close $fd 150 runtest {DELETE everything} 151 152 153 set fd [open test$cnt.sql w] 154 puts $fd "BEGIN;" 155 for {set i 1} {$i<=25000} {incr i} { 156 set r [expr {int(rand()*500000)}] 157 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 158 } 159 puts $fd "COMMIT;" 160 close $fd 161 runtest {25000 INSERTs in a transaction} 162 163 164 set fd [open test$cnt.sql w] 165 puts $fd "DELETE FROM t1;" 166 close $fd 167 runtest {DELETE everything} 168 169 170 set fd [open test$cnt.sql w] 171 puts $fd "BEGIN;" 172 for {set i 1} {$i<=25000} {incr i} { 173 set r [expr {int(rand()*500000)}] 174 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 175 } 176 puts $fd "COMMIT;" 177 close $fd 178 runtest {25000 INSERTs in a transaction} 179 180 181 set fd [open test$cnt.sql w] 182 puts $fd "DELETE FROM t1;" 183 close $fd 184 runtest {DELETE everything} 185 186 187 set fd [open test$cnt.sql w] 188 puts $fd "BEGIN;" 189 for {set i 1} {$i<=25000} {incr i} { 190 set r [expr {int(rand()*500000)}] 191 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 192 } 193 puts $fd "COMMIT;" 194 close $fd 195 runtest {25000 INSERTs in a transaction} 196 197 198 set fd [open test$cnt.sql w] 199 puts $fd "DELETE FROM t1;" 200 close $fd 201 runtest {DELETE everything} 202 203 204 set fd [open test$cnt.sql w] 205 puts $fd {DROP TABLE t1;} 206 close $fd 207 runtest {DROP TABLE} 208