drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 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} |