Current File : //opt/RZphp73/includes/test/DBA/tests/benchmark_drivers.php
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Brent Cook                                        |
// +----------------------------------------------------------------------+
// | This library is free software; you can redistribute it and/or        |
// | modify it under the terms of the GNU Lesser General Public           |
// | License as published by the Free Software Foundation; either         |
// | version 2.1 of the License, or (at your option) any later version.   |
// |                                                                      |
// | This library is distributed in the hope that it will be useful,      |
// | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    |
// | Lesser General Public License for more details.                      |
// |                                                                      |
// | You should have received a copy of the GNU Lesser General Public     |
// | License along with this library; if not, write to the Free Software  |
// | Foundation, Inc., 59 Temple Place, Suite 330,Boston,MA 02111-1307 USA|
// +----------------------------------------------------------------------+
// | Author: Brent Cook <busterb@mail.utexas.edu>                         |
// +----------------------------------------------------------------------+
//
// $Id: benchmark_drivers.php,v 1.7 2003/01/04 11:54:51 mj Exp $
//

ini_set('include_path',ini_get('include_path').':../../');
require_once 'DBA.php';
require_once 'PEAR.php';

$testDataArray = array ('11111111111111111111',
                        '222222222222222222222222',
                        '3333333333333333333333333333',
                        '44444444444444444444444444444444',
                        '555555555555555555555555555555555555',
                        '6666666666666666666666666666666666666666',
                        '77777777777777777777777777777777777777777777',
                        '888888888888888888888888888888888888888888888888',
                        '9999999999999999999999999999999999999999999999999999');

$maxDataIndex = sizeof ($testDataArray)-1;

$maxTestKeys = array(1600, 3200, 6400, 12800, 25600);

$transactionsInterval = 2000;

$maxTransactions = $transactionsInterval * 8;

$prefix = './';

function getmicrotime(){ 
    list($usec, $sec) = explode(" ",microtime()); 
    return((float)$usec + (float)$sec); 
} 

foreach (DBA::getDriverList() as $driver) {
    echo "Benchmarking driver: $driver\n";
    $testDB = DBA::create($driver);

    foreach ($maxTestKeys as $maxTestKey) {

        $dat_fp = fopen($prefix."{$driver}_{$maxTestKey}.dat", 'w');
        for ($transactions=$transactionsInterval;
            $transactions <= $maxTransactions;
            $transactions+=$transactionsInterval) {

            $result = $testDB->open($prefix.'benchmark_db_'.$driver, 'n');
            if (PEAR::isError($result)) {
                echo $result->getMessage()."\n";
            } else {
                // only measure successful transactions
                $actualTransactions = 0;

                // begin stopwatch
                $start = getmicrotime();

                for ($i=0; $i<$transactions; ++$i) {
                    $testKey = rand (0, $maxTestKey);
                    $testData = $testDataArray[rand(0, $maxDataIndex)];
                    switch (rand(0, 3)) {
                        case 0:
                            if (!$testDB->exists($testKey)) {
                                ++$actualTransactions;
                                $testDB->insert($testKey, $testData);
                            }
                            break;
                        case 1:
                            if ($testDB->exists($testKey)) {
                                ++$actualTransactions;
                                $testDB->remove($testKey);
                            }
                            break;
                        case 2:
                            $testDB->replace($testKey, $testData);
                            break;
                        case 3:
                            if ($testDB->exists($testKey)) {
                                ++$actualTransactions;
                                $testDB->fetch($testKey);
                            }
                    }
                }
                $testDB->close();
            }

            // end stopwatch
            $stop = getmicrotime();
            $line = $actualTransactions.' '.($stop - $start)."\n";
            echo "Keys: $maxTestKey Transactions: $line";
            fwrite($dat_fp, $line);
        }
        fclose($dat_fp);
    }

    // make a gnuplot data file
    $graph_data = <<<EOT
set size 1.0, 1.0
set terminal postscript portrait "Helvetica" 12
set title "driver: $driver"
set xlabel "# of transactions"
set ylabel "time in seconds"
set out "$driver.ps"
plot
EOT;

    foreach ($maxTestKeys as $maxTestKey) {
        $graph_data .= " \"{$driver}_{$maxTestKey}.dat\" using 1:2 title '".
                    "$driver, $maxTestKey keys' with lines,\\\n";
    }

    // write the gnuplot data file, trimming off that last comma :P
    $graph_fp = fopen($prefix.$driver.'_graph', 'w');
    fwrite($graph_fp, substr($graph_data, 0, -3));
    fclose($graph_fp);
}
?>