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