test-connect
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!/usr/bin/perl
  2. # Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  3. #
  4. # This library is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU Library General Public
  6. # License as published by the Free Software Foundation; either
  7. # version 2 of the License, or (at your option) any later version.
  8. #
  9. # This library is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. # Library General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU Library General Public
  15. # License along with this library; if not, write to the Free
  16. # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  17. # MA 02111-1307, USA
  18. #
  19. # This test is for testing the speed of connections and sending
  20. # data to the client.
  21. #
  22. # By changing the variable '$opt_loop_count' value you can make this test
  23. # easier/harderto your computer to execute. You can also change this value
  24. # by using option --loop_value='what_ever_you_like'.
  25. ##################### Standard benchmark inits ##############################
  26. use Cwd;
  27. use DBI;
  28. use Benchmark;
  29. $opt_loop_count=100000; # Change this to make test harder/easier
  30. $str_length=65000; # This is the length of blob strings in PART:5
  31. $max_test=20; # How many times to test if the server is busy
  32. $pwd = cwd(); $pwd = "." if ($pwd eq '');
  33. require "$pwd/bench-init.pl" || die "Can't read Configuration file: $!n";
  34. # This is the length of blob strings in PART:5
  35. $str_length=min($limits->{'max_text_size'},$limits->{'query_size'}-30,$str_length);
  36. if ($opt_small_test)
  37. {
  38.   $opt_loop_count/=100;
  39. }
  40. $opt_loop_count=min(1000, $opt_loop_count) if ($opt_tcpip);
  41. $small_loop_count=$opt_loop_count/10; # For connect tests
  42. print "Testing the speed of connecting to the server and sending of datan";
  43. print "Connect tests are done $small_loop_count times and other tests $opt_loop_count timesnn";
  44. ################################# PART:1 ###################################
  45. ####
  46. ####  Start timeing and start connect test..
  47. ####
  48. $start_time=new Benchmark;
  49. print "Testing connection/disconnectn";
  50. $loop_time=new Benchmark;
  51. $errors=0;
  52. for ($i=0 ; $i < $small_loop_count ; $i++)
  53. {
  54.   print "$i " if (($opt_debug));
  55.   for ($j=0; $j < $max_test ; $j++)
  56.   {
  57.     if ($dbh = DBI->connect($server->{'data_source'}, $opt_user,
  58.     $opt_password))
  59.     {
  60.       $dbh->disconnect;
  61.       last;
  62.     }
  63.     select(undef, undef, undef, 0.01*$j);
  64.     print "$errors " if (($opt_debug));
  65.     $errors++;
  66.   }
  67.   die "Got error '$DBI::errstr' after $i connects" if ($j == $max_test);
  68.   $dbh->disconnect;
  69.   undef($dbh);
  70. }
  71. $end_time=new Benchmark;
  72. print "Warning: $errors connections didn't work without a time delayn" if ($errors);
  73. print "Time to connect ($small_loop_count): " .
  74.   timestr(timediff($end_time, $loop_time),"all") . "nn";
  75. ################################# PART:2 ###################################
  76. #### Now we shall do first one connect, then simple select
  77. #### (select 1..) and then close connection. This will be
  78. #### done $small_loop_count times.
  79. if ($limits->{'select_without_from'})
  80. {
  81.   print "Test connect/simple select/disconnectn";
  82.   $loop_time=new Benchmark;
  83.   for ($i=0; $i < $small_loop_count; $i++)
  84.   {
  85.     $dbh = DBI->connect($server->{'data_source'}, $opt_user, $opt_password) || die $DBI::errstr;
  86.     $sth = $dbh->do("select $i") or die $DBI::errstr;
  87.     $dbh->disconnect;
  88.   }
  89.   $end_time=new Benchmark;
  90.   print "Time for connect+select_simple ($small_loop_count): " .
  91.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  92. }
  93. ################################# PART:3 ###################################
  94. ####
  95. #### Okay..Next thing we'll do is a simple select $opt_loop_count times.
  96. ####
  97. $dbh = DBI->connect($server->{'data_source'}, $opt_user, $opt_password,
  98.     { PrintError => 0}) || die $DBI::errstr;
  99. if ($limits->{'select_without_from'})
  100. {
  101.   print "Test simple selectn";
  102.   $loop_time=new Benchmark;
  103.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  104.   {
  105.     $sth = $dbh->do("select $i") or die $DBI::errstr;
  106.   }
  107.   $end_time=new Benchmark;
  108.   print "Time for select_simple ($opt_loop_count): " .
  109.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  110. }
  111. ###########################################################################
  112. #### The same as the previous test, but always execute the same select
  113. #### This is done to test the query cache for real simple selects.
  114. if ($limits->{'select_without_from'})
  115. {
  116.   print "Test simple selectn";
  117.   $loop_time=new Benchmark;
  118.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  119.   {
  120.     $sth = $dbh->do("select 10000") or die $DBI::errstr;
  121.   }
  122.   $end_time=new Benchmark;
  123.   print "Time for select_simple_cache ($opt_loop_count): " .
  124.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  125. }
  126. ##########################################################################
  127. #### First, we'll create a simple table 'bench1'
  128. #### Then we shall do $opt_loop_count selects from this table.
  129. #### Table will contain very simple data.
  130. $sth = $dbh->do("drop table bench1" . $server->{'drop_attr'});
  131. do_many($dbh,$server->create("bench1",
  132.      ["a int NOT NULL",
  133.       "i int",
  134.       "s char(10)"],
  135.      ["primary key (a)"]));
  136. $sth = $dbh->do("insert into bench1 values(1,100,'AAA')") or die $DBI::errstr;
  137. if ($opt_fast && defined($server->{vacuum}))
  138. {
  139.   $server->vacuum(0,$dbh);
  140. }
  141. $dbh->disconnect;
  142. #
  143. # First test connect/select/disconnect
  144. #
  145. print "Testing connect/select 1 row from table/disconnectn";
  146. $loop_time=new Benchmark;
  147. $errors=0;
  148. for ($i=0 ; $i < $small_loop_count ; $i++)
  149. {
  150.   for ($j=0; $j < $max_test ; $j++)
  151.   {
  152.     last if ($dbh = DBI->connect($server->{'data_source'}, $opt_user, $opt_password));
  153.     $errors++;
  154.   }
  155.   die $DBI::errstr if ($j == $max_test);
  156.   $sth = $dbh->do("select a,i,s,$i from bench1") # Select * from table with 1 record
  157.     or die $DBI::errstr;
  158.   $dbh->disconnect;
  159. }
  160. $end_time=new Benchmark;
  161. print "Warning: $errors connections didn't work without a time delayn" if ($errors);
  162. print "Time to connect+select_1_row ($small_loop_count): " .
  163.   timestr(timediff($end_time, $loop_time),"all") . "nn";
  164. #
  165. # The same test, but without connect/disconnect
  166. #
  167. print "Testing select 1 row from tablen";
  168. $dbh = $server->connect();
  169. $loop_time=new Benchmark;
  170. for ($i=0 ; $i < $opt_loop_count ; $i++)
  171. {
  172.   $sth = $dbh->do("select a,i,s,$i from bench1") # Select * from table with 1 record
  173.     or die $DBI::errstr;
  174. }
  175. $end_time=new Benchmark;
  176. print "Time to select_1_row ($opt_loop_count): " .
  177.   timestr(timediff($end_time, $loop_time),"all") . "nn";
  178. #
  179. # Same test (as with one row) but now with a cacheable query
  180. #
  181. $loop_time=new Benchmark;
  182. for ($i=0 ; $i < $opt_loop_count ; $i++)
  183. {
  184.   $sth = $dbh->do("select a,i,s from bench1") # Select * from table with 1 record
  185.     or die $DBI::errstr;
  186. }
  187. $end_time=new Benchmark;
  188. print "Time to select_1_row_cache ($opt_loop_count): " .
  189.   timestr(timediff($end_time, $loop_time),"all") . "nn";
  190. #
  191. # The same test, but with 2 rows (not cacheable).
  192. #
  193. print "Testing select 2 rows from tablen";
  194. $sth = $dbh->do("insert into bench1 values(2,200,'BBB')")
  195.   or die $DBI::errstr;
  196. $loop_time=new Benchmark;
  197. for ($i=0 ; $i < $opt_loop_count ; $i++)
  198. {
  199.   $sth = $dbh->do("select a,i,s,$i from bench1") # Select * from table with 2 record
  200.     or die $DBI::errstr;
  201. }
  202. $end_time=new Benchmark;
  203. print "Time to select_2_rows ($opt_loop_count): " .
  204.   timestr(timediff($end_time, $loop_time),"all") . "nn";
  205. #
  206. # Simple test to test speed of functions.
  207. #
  208. if ($limits->{'functions'})
  209. {
  210.   print "Test select with aritmetic (+)n";
  211.   $loop_time=new Benchmark;
  212.   for ($i=0; $i < $opt_loop_count; $i++)
  213.   {
  214.     $sth = $dbh->do("select a+a+a+a+a+a+a+a+a+$i from bench1") or die $DBI::errstr;
  215.   }
  216.   $end_time=new Benchmark;
  217.   print "Time for select_column+column ($opt_loop_count): " .
  218.     timestr(timediff($end_time, $loop_time),"all") . "nn";
  219. }
  220. $sth = $dbh->do("drop table bench1" . $server->{'drop_attr'})
  221.   or die $DBI::errstr;
  222. if ($opt_fast && defined($server->{vacuum}))
  223. {
  224.   $server->vacuum(0,$dbh);
  225. }
  226. ################################# PART:5 ###################################
  227. #### We'll create one table with a single blob field,but with a
  228. #### huge record in it and then we'll do $opt_loop_count selects
  229. #### from it.
  230. goto skip_blob_test if (!$limits->{'working_blobs'});
  231. print "Testing retrieval of big records ($str_length bytes)n";
  232. do_many($dbh,$server->create("bench1", ["b blob"], []));
  233. $dbh->{LongReadLen}= $str_length; # Set retrieval buffer
  234. my $string=(A) x ($str_length); # This will make a string $str_length long.
  235. $sth = $dbh->prepare("insert into bench1 values(?)") or die $dbh->errstr;
  236. $sth->execute($string) or die $sth->errstr;
  237. undef($string);
  238. if ($opt_fast && defined($server->{vacuum}))
  239. {
  240.   $server->vacuum(0,$dbh);
  241. }
  242. $loop_time=new Benchmark;
  243. for ($i=0 ; $i < $small_loop_count ; $i++)
  244. {
  245.   $sth = $dbh->prepare("select b,$i from bench1");
  246.   if (!$sth->execute || !(@row = $sth->fetchrow_array) ||
  247.       length($row[0]) != $str_length)
  248.   {
  249.     warn "$DBI::errstr - ".length($row[0])." - $str_length **n";
  250.   }
  251.   $sth->finish;
  252. }
  253. $end_time=new Benchmark;
  254. print "Time to select_big_str ($small_loop_count): " .
  255.   timestr(timediff($end_time, $loop_time),"all") . "nn";
  256. $sth = $dbh->do("drop table bench1" . $server->{'drop_attr'})
  257.   or do
  258. {
  259.     # Fix for Access 2000
  260.     die $dbh->errstr if (!$server->abort_if_fatal_error());
  261. };
  262. if ($opt_fast && defined($server->{vacuum}))
  263. {
  264.   $server->vacuum(0,$dbh);
  265. }
  266. skip_blob_test:
  267. ################################ END ###################################
  268. ####
  269. #### End of the test...Finally print time used to execute the
  270. #### whole test.
  271. $dbh->disconnect;
  272. end_benchmark($start_time);