fork_test.pl
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #!/usr/bin/perl -w
  2. # This is a test with uses 5 processes to insert, update and select from
  3. # two tables.
  4. # One inserts records in the tables, one updates some record in it and
  5. # the last 3 does different selects on the tables.
  6. #
  7. $opt_loop_count=10000; # Change this to make test harder/easier
  8. ##################### Standard benchmark inits ##############################
  9. use Mysql;
  10. use Getopt::Long;
  11. use Benchmark;
  12. package main;
  13. $opt_skip_create=$opt_skip_in=$opt_verbose=$opt_fast_insert=
  14.   $opt_lock_tables=$opt_debug=$opt_skip_delete=$opt_fast=$opt_force=0;
  15. $opt_host=""; $opt_db="test";
  16. GetOptions("host=s","db=s","loop-count=i","skip-create","skip-in",
  17.    "skip-delete","verbose","fast-insert","lock-tables","debug","fast",
  18.    "force") || die "Aborted";
  19. $opt_verbose=$opt_debug=$opt_lock_tables=$opt_fast_insert=$opt_fast=$opt_skip_in=$Mysql::db_errstr=$opt_force=undef;  # Ignore warnings from these
  20. print "Testing 5 multiple connections to a server with 1 insert, 1 updaten";
  21. print "and 3 select connections.n";
  22. $firsttable  = "bench_f1";
  23. $secondtable = "bench_f2";
  24. ####  
  25. ####  Start timeing and start test
  26. ####
  27. $start_time=new Benchmark;
  28. if (!$opt_skip_create)
  29. {
  30.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  31.   $Mysql::QUIET = 1;
  32.   $dbh->Query("drop table $firsttable");
  33.   $dbh->Query("drop table $secondtable");
  34.   $Mysql::QUIET = 0;
  35.   print "Creating tables $firsttable and $secondtable in database $opt_dbn";
  36.   $dbh->Query("create table $firsttable (id int(6) not null, info varchar(32), marker char(1), primary key(id))") or die $Mysql::db_errstr;
  37.   $dbh->Query("create table $secondtable (id int(6) not null, row int(3) not null,value double, primary key(id,row))") or die $Mysql::db_errstr;
  38.   $dbh=0; # Close handler
  39. }
  40. $|= 1; # Autoflush
  41. ####
  42. #### Start the tests
  43. ####
  44. test_1() if (($pid=fork()) == 0); $work{$pid}="insert";
  45. test_2() if (($pid=fork()) == 0); $work{$pid}="update";
  46. test_3() if (($pid=fork()) == 0); $work{$pid}="select1";
  47. test_4() if (($pid=fork()) == 0); $work{$pid}="select2";
  48. test_5() if (($pid=fork()) == 0); $work{$pid}="select3";
  49. $errors=0;
  50. while (($pid=wait()) != -1)
  51. {
  52.   $ret=$?/256;
  53.   print "thread '" . $work{$pid} . "' finished with exit code $retn";
  54.   $errors++ if ($ret != 0);
  55. }
  56. if (!$opt_skip_delete && !$errors)
  57. {
  58.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  59.   $dbh->Query("drop table $firsttable");
  60.   $dbh->Query("drop table $secondtable");
  61. }
  62. print ($errors ? "Test failedn" :"Test okn");
  63. $end_time=new Benchmark;
  64. print "Total time: " .
  65.   timestr(timediff($end_time, $start_time),"noc") . "n";
  66. exit(0);
  67. #
  68. # Insert records in the two tables
  69. sub test_1
  70. {
  71.   my ($dbh,$tmpvar,$rows,$found,$i);
  72.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  73.   $tmpvar=1;
  74.   $rows=$found=0;
  75.   for ($i=0 ; $i < $opt_loop_count; $i++)
  76.   {
  77.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  78.     $sth=$dbh->Query("insert into $firsttable values ($i,'This is entry $i','')") || die "Got error on insert: $Mysql::db_errstrn";
  79.     $row_count=($i % 7)+1;
  80.     $rows+=1+$row_count;
  81.     for ($j=0 ; $j < $row_count; $j++)
  82.     {
  83.       $sth=$dbh->Query("insert into $secondtable values ($i,$j,0)") || die "Got error on insert: $Mysql::db_errstrn";
  84.     }
  85.     if (($tmpvar % 10) == 0)
  86.     {
  87.       $sth=$dbh->Query("select max(info) from $firsttable") || die "Got error on select max(info): $Mysql::db_errstrn";
  88.       $sth=$dbh->Query("select max(value) from $secondtable") || die "Got error on select max(info): $Mysql::db_errstrn";      
  89.       $found+=2;
  90.     }
  91.   }
  92.   $dbh=0;
  93.   print "Test_1: Inserted $rows rows, found $found rowsn";
  94.   exit(0);
  95. }
  96. #
  97. # Update records in both tables
  98. #
  99. sub test_2
  100. {
  101.   my ($dbh,$id,$tmpvar,$rows,$found,$i,$max_id,$tmp);
  102.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  103.   $tmpvar=111111;
  104.   $rows=$found=$max_id=$id=0;
  105.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  106.   {
  107.     $tmp=(($tmpvar + 63) + $i)*3;
  108.     $tmp=$tmp-int($tmp/100000)*100000; 
  109.     $tmpvar^= $tmp;
  110.     $tmp=$tmpvar - int($tmpvar/10)*10;
  111.     if ($max_id < 2 || $tmp == 0)
  112.     {
  113.       $max_id=0;
  114.       $sth=$dbh->Query("select max(id) from $firsttable where marker=''") || die "Got error select max: $Mysql::db_errstrn";
  115.       if ((@row = $sth->FetchRow()) && defined($row[0]))
  116.       {
  117. $found++;
  118. $max_id=$id=$row[0];
  119.       }
  120.     }
  121.     else
  122.     {
  123.       $id= $tmpvar % ($max_id-1)+1;
  124.     }
  125.     if ($id)
  126.     {
  127.       $sth=$dbh->Query("update $firsttable set marker='x' where id=$id") || die "Got error update $firsttable: $Mysql::db_errstrn";
  128.       $rows+=$sth->affected_rows;
  129.       if ($sth->affected_rows)
  130.       {
  131. $sth=$dbh->Query("update $secondtable set value=$i where id=$id") || die "Got error update $firsttable: $Mysql::db_errstrn";
  132. $rows+=$sth->affected_rows;
  133.       }
  134.     }
  135.   }
  136.   $dbh=0;
  137.   print "Test_2: Found $found rows, Updated $rows rowsn";
  138.   exit(0);
  139. }
  140. #
  141. # select records
  142. #
  143. sub test_3
  144. {
  145.   my ($dbh,$id,$tmpvar,$rows,$i);
  146.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  147.   $tmpvar=222222;
  148.   $rows=0;
  149.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  150.   {
  151.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  152.     $id=$tmpvar % $opt_loop_count;
  153.     $sth=$dbh->Query("select id from $firsttable where id=$id") || die "Got error on select from $firsttable: $Mysql::db_errstrn";
  154.     $rows+=$sth->numrows;
  155.   }
  156.   $dbh=0;
  157.   print "Test_3: Found $rows rowsn";
  158.   exit(0);
  159. }
  160. #
  161. # Note that this uses row=1 and in some cases won't find any matching
  162. # records
  163. #
  164. sub test_4
  165. {
  166.   my ($dbh,$id,$tmpvar,$rows,$i);
  167.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  168.   $tmpvar=333333;
  169.   $rows=0;
  170.   for ($i=0 ; $i < $opt_loop_count; $i++)
  171.   {
  172.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  173.     $id=$tmpvar % $opt_loop_count;
  174.     $sth=$dbh->Query("select id from $secondtable where id=$id") || die "Got error on select form $secondtable: $Mysql::db_errstrn";
  175.     $rows+=$sth->numrows;
  176.   }
  177.   $dbh=0;
  178.   print "Test_4: Found $rows rowsn";
  179.   exit(0);
  180. }
  181. sub test_5
  182. {
  183.   my ($dbh,$id,$tmpvar,$rows,$i,$max_id);
  184.   $dbh = Mysql->Connect($opt_host, $opt_db) || die $Mysql::db_errstr;
  185.   $tmpvar=444444;
  186.   $rows=$max_id=0;
  187.   for ($i=0 ; $i < $opt_loop_count ; $i++)
  188.   {
  189.     $tmpvar^= ((($tmpvar + 63) + $i)*3 % 100000);
  190.     if ($max_id == 0 || ($tmpvar % 10 == 0))
  191.     {
  192.       $sth=$dbh->Query("select max(id) from $firsttable") || die "Got error select max: $Mysql::db_errstrn";
  193.       if ((@row = $sth->FetchRow()) && defined($row[0]))
  194.       {
  195. $max_id=$id=$row[0];
  196.       }
  197.       else
  198.       {
  199. $id=0;
  200.       }
  201.     }
  202.     else
  203.     {
  204.       $id= $tmpvar % $max_id;
  205.     }
  206.     $sth=$dbh->Query("select value from $firsttable,$secondtable where $firsttable.id=$id and $secondtable.id=$firsttable.id") || die "Got error on select form $secondtable: $Mysql::db_errstrn";
  207.     $rows+=$sth->numrows;
  208.   }
  209.   $dbh=0;
  210.   print "Test_5: Found $rows rowsn";
  211.   exit(0);
  212. }