diff --git a/test/Performance/README.md b/test/Performance/README.md index b45fb9e0..a1893e1e 100644 --- a/test/Performance/README.md +++ b/test/Performance/README.md @@ -28,7 +28,7 @@ PHPBench is used to run the benchmarks. Visit http://phpbench.readthedocs.io/en/ ##### 4. Execute run-perf_tests.py. ### Windows - py.exe run-perf_tests.py -platform > tee run-perf_output.txt + py.exe run-perf_tests.py -platform ### Linux and Mac On Linux and Mac, the script must be executed with `sudo python3` because to enable pooling it needs to modify odbcinst.ini system file. As an improvement, the location of the odbcinst.ini file can be changed so that, sudo is not requiered. @@ -36,4 +36,4 @@ On Linux and Mac, the script must be executed with `sudo python3` because to ena `-platform` - The platform that the tests are ran on. Must be one of the following: Windows10, WindowsServer2016, WindowsServer2012, Ubuntu16, RedHat7, Sierra. `-php-driver` (optional) - The driver that the tests are ran on. Must be one of the following: sqlsrv, pdo_sqlsrv, or both. Default is both. -`-test-only` (optional) - The test to run. Must be the file name (not including path) of one test or 'all'. Default is 'all'. If one test is specified, must also specify the -php-driver option to sqlsrv or pdo_sqlsrv. \ No newline at end of file +`-testname` (optional) - The test to run. Must be the file name (not including path) of one test or 'all'. Default is 'all'. If one test is specified, must also specify the -php-driver option to sqlsrv or pdo_sqlsrv. \ No newline at end of file diff --git a/test/Performance/benchmark/pdo_sqlsrv/PDOConnectionBench.php b/test/Performance/benchmark/pdo_sqlsrv/PDOConnectionBench.php index ed907ae9..9e995b34 100644 --- a/test/Performance/benchmark/pdo_sqlsrv/PDOConnectionBench.php +++ b/test/Performance/benchmark/pdo_sqlsrv/PDOConnectionBench.php @@ -1,14 +1,15 @@ conn = PDOSqlsrvUtil::connect(); } /* * Each iteration creates a database, a table and a stored procedure in that database and drops the database at the end. * Note that, execDirect function are used to execute all the queries. */ - public function benchCreateDbTableProc(){ + public function benchCreateDbTableProc() + { $randomNum = rand(); $databaseName = "test_db_$randomNum"; $tableName = "test_table_$randomNum"; @@ -25,7 +28,8 @@ class PDOCreateDbTableProcBench{ PDOSqlsrvUtil::dropDatabase( $this->conn, $databaseName ); } - public function disconnect(){ + public function disconnect() + { PDOSqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/pdo_sqlsrv/PDODeleteBench.php b/test/Performance/benchmark/pdo_sqlsrv/PDODeleteBench.php index fd3d1a89..e14b26ff 100644 --- a/test/Performance/benchmark/pdo_sqlsrv/PDODeleteBench.php +++ b/test/Performance/benchmark/pdo_sqlsrv/PDODeleteBench.php @@ -1,35 +1,42 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = PDOSqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { PDOSqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = PDOSqlsrvUtil::generateInsertValues(); } - public function insertWithPrepare(){ - for( $i=0; $i<100; $i++ ){ + public function insertWithPrepare() + { + for( $i=0; $iconn, $this->tableName, $this->insertValues ); } } @@ -37,17 +44,21 @@ class PDODeleteBench{ * Each iteration inserts 1000 rows into the table, benchDelete deletes top row from the table 1000 times. * Note that, every delete calls prepare and execute APIs. */ - public function benchDelete(){ - for( $i=0; $i<100; $i++ ){ + public function benchDelete() + { + for( $i=0; $iconn, $this->tableName ); } } - public function dropTable(){ + public function dropTable() + { PDOSqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { PDOSqlsrvUtil::disconnect( $this->conn ); } diff --git a/test/Performance/benchmark/pdo_sqlsrv/PDOFetchBench.php b/test/Performance/benchmark/pdo_sqlsrv/PDOFetchBench.php index 9c20bdf2..9601382a 100644 --- a/test/Performance/benchmark/pdo_sqlsrv/PDOFetchBench.php +++ b/test/Performance/benchmark/pdo_sqlsrv/PDOFetchBench.php @@ -1,33 +1,39 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = PDOSqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { PDOSqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = PDOSqlsrvUtil::generateInsertValues(); } - public function insertWithPrepare(){ + public function insertWithPrepare() + { PDOSqlsrvUtil::insertWithPrepare( $this->conn, $this->tableName, $this->insertValues ); } @@ -35,17 +41,21 @@ class PDOFetchBench{ * Each iteration inserts a row into the table, benchFetchWithPrepare() fetches that row 1000 times. * Note that, every fetch calls prepare, execute and fetch APIs. */ - public function benchFetchWithPrepare(){ - for( $i=0; $i<100; $i++){ + public function benchFetchWithPrepare() + { + for( $i=0; $iconn, $this->tableName ); } } - public function dropTable(){ + public function dropTable() + { PDOSqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { PDOSqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/pdo_sqlsrv/PDOFetchLargeBench.php b/test/Performance/benchmark/pdo_sqlsrv/PDOFetchLargeBench.php index af7a0ad0..26fab48c 100644 --- a/test/Performance/benchmark/pdo_sqlsrv/PDOFetchLargeBench.php +++ b/test/Performance/benchmark/pdo_sqlsrv/PDOFetchLargeBench.php @@ -6,27 +6,32 @@ use PDOSqlsrvPerfTest\PDOSqlsrvUtil; * @BeforeMethods({"connect", "setTableName" }) * @AfterMethods({ "disconnect"}) */ -class PDOFetchLargeBench{ +class PDOFetchLargeBench +{ private $conn; private $tableName; - public function setTableName(){ + public function setTableName() + { //Assumes the table is already populated with data $this->tableName = "LargeDB.dbo.datatypes"; } - public function connect(){ + public function connect() + { $this->conn = PDOSqlsrvUtil::connect(); } /* * Each iteration calls prepare, execute and fetch APIs to fetch the already populdated data */ - public function benchFetchWithPrepare(){ + public function benchFetchWithPrepare() + { PDOSqlsrvUtil::fetchWithPrepare( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { PDOSqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/pdo_sqlsrv/PDOInsertBench.php b/test/Performance/benchmark/pdo_sqlsrv/PDOInsertBench.php index 5edbe12b..99d47948 100644 --- a/test/Performance/benchmark/pdo_sqlsrv/PDOInsertBench.php +++ b/test/Performance/benchmark/pdo_sqlsrv/PDOInsertBench.php @@ -1,46 +1,55 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = PDOSqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { PDOSqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = PDOSqlsrvUtil::generateInsertValues(); } /** * Each iteration inserts 1000 rows into the table. * Note that, every insertion calls prepare, bindParam and execute APIs. */ - public function benchInsertWithPrepare(){ - for ( $i=0; $i<100; $i++){ + public function benchInsertWithPrepare() + { + for ( $i=0; $iconn, $this->tableName, $this->insertValues ); } } - public function dropTable(){ + public function dropTable() + { PDOSqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { PDOSqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/pdo_sqlsrv/PDOSelectVersionBench.php b/test/Performance/benchmark/pdo_sqlsrv/PDOSelectVersionBench.php index c7c05a9b..23631e26 100644 --- a/test/Performance/benchmark/pdo_sqlsrv/PDOSelectVersionBench.php +++ b/test/Performance/benchmark/pdo_sqlsrv/PDOSelectVersionBench.php @@ -6,21 +6,25 @@ use PDOSqlsrvPerfTest\PDOSqlsrvUtil; * @BeforeMethods({"connect"}) * @AfterMethods({"disconnect"}) */ -class PDOSelectVersionBench{ +class PDOSelectVersionBench +{ private $conn; - public function connect(){ + public function connect() + { $this->conn = PDOSqlsrvUtil::connect(); } /* * Each iteration calls execDirect API to fetch @@Version */ - public function benchSelectVersion(){ + public function benchSelectVersion() + { $version = PDOSqlsrvUtil::selectVersion( $this->conn ); } - public function disconnect(){ + public function disconnect() + { PDOSqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/pdo_sqlsrv/PDOUpdateBench.php b/test/Performance/benchmark/pdo_sqlsrv/PDOUpdateBench.php index cac76e26..cceaac60 100644 --- a/test/Performance/benchmark/pdo_sqlsrv/PDOUpdateBench.php +++ b/test/Performance/benchmark/pdo_sqlsrv/PDOUpdateBench.php @@ -1,12 +1,13 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = PDOSqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { PDOSqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = PDOSqlsrvUtil::generateInsertValues(); } - public function insertWithPrepare(){ + public function insertWithPrepare() + { PDOSqlsrvUtil::insertWithPrepare( $this->conn, $this->tableName, $this->insertValues ); } - public function generateUpdateValues(){ + public function generateUpdateValues() + { $this->updateValues = PDOSqlsrvUtil::generateUpdateValues(); } - public function generateUpdateParams(){ + public function generateUpdateParams() + { $this->updateParams = PDOSqlsrvUtil::generateUpdateParams(); } /** * Each iteration inserts a row into the table, updateWithPrepare() updates that row 1000 times. * Note that, every update calls prepare, bindParam and execute APIs. */ - public function benchUpdateWithPrepare(){ - for( $i=0; $i<100; $i++ ){ + public function benchUpdateWithPrepare() + { + for( $i=0; $iconn, $this->tableName, $this->updateValues, $this->updateParams ); } } - public function dropTable(){ + public function dropTable() + { PDOSqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { PDOSqlsrvUtil::disconnect( $this->conn ); } diff --git a/test/Performance/benchmark/sqlsrv/SqlsrvConnectionBench.php b/test/Performance/benchmark/sqlsrv/SqlsrvConnectionBench.php index f8fb0211..648a77db 100644 --- a/test/Performance/benchmark/sqlsrv/SqlsrvConnectionBench.php +++ b/test/Performance/benchmark/sqlsrv/SqlsrvConnectionBench.php @@ -1,14 +1,15 @@ conn = SqlsrvUtil::connect(); } @@ -17,7 +19,8 @@ class SqlsrvCreateDbTableProcBench{ * Each iteration creates a database, a table and a stored procedure in that database and drops the database at the end. * Note that, ODBC SQLExecDirect function are used to execute all the queries. */ - public function benchCreateDbTableProc(){ + public function benchCreateDbTableProc() + { $randomNum = rand(); $databaseName = "test_db_$randomNum"; $tableName = "test_table_$randomNum"; @@ -26,7 +29,8 @@ class SqlsrvCreateDbTableProcBench{ SqlsrvUtil::dropDatabase( $this->conn, $databaseName ); } - public function disconnect(){ + public function disconnect() + { SqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/sqlsrv/SqlsrvDeleteBench.php b/test/Performance/benchmark/sqlsrv/SqlsrvDeleteBench.php index e68d88b1..73103c01 100644 --- a/test/Performance/benchmark/sqlsrv/SqlsrvDeleteBench.php +++ b/test/Performance/benchmark/sqlsrv/SqlsrvDeleteBench.php @@ -1,35 +1,42 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = SqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { SqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = SqlsrvUtil::generateInsertValues(); } - public function insertWithPrepare(){ - for ( $i=0; $i<100; $i++ ){ + public function insertWithPrepare() + { + for ( $i=0; $iconn, $this->tableName, $this->insertValues ); } } @@ -37,17 +44,21 @@ class SqlsrvDeleteBench{ * Each iteration inserts 1000 rows into the table, benchDelete deletes top row from the table 1000 times. * Note that, every delete calls prepare and execute APIs. */ - public function benchDelete(){ - for( $i=0; $i<100; $i++ ){ + public function benchDelete() + { + for( $i=0; $iconn, $this->tableName ); } } - public function dropTable(){ + public function dropTable() + { SqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { SqlsrvUtil::disconnect( $this->conn ); } diff --git a/test/Performance/benchmark/sqlsrv/SqlsrvFetchBench.php b/test/Performance/benchmark/sqlsrv/SqlsrvFetchBench.php index b92d5f7e..ec06709d 100644 --- a/test/Performance/benchmark/sqlsrv/SqlsrvFetchBench.php +++ b/test/Performance/benchmark/sqlsrv/SqlsrvFetchBench.php @@ -1,36 +1,40 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = SqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { SqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = SqlsrvUtil::generateInsertValues(); } - public function insertWithPrepare(){ + public function insertWithPrepare() + { SqlsrvUtil::insertWithPrepare( $this->conn, $this->tableName, $this->insertValues ); } @@ -38,17 +42,21 @@ class SqlsrvFetchBench{ * Each iteration inserts a row into the table, benchFetchWithPrepare() fetches that row 1000 times. * Note that, every fetch calls prepare, execute and fetch APIs. */ - public function benchFetchWithPrepare(){ - for( $i=0; $i<100; $i++){ + public function benchFetchWithPrepare() + { + for( $i=0; $iconn, $this->tableName ); } } - public function dropTable(){ + public function dropTable() + { SqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { SqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/sqlsrv/SqlsrvFetchLargeBench.php b/test/Performance/benchmark/sqlsrv/SqlsrvFetchLargeBench.php index 2bda236a..24dee142 100644 --- a/test/Performance/benchmark/sqlsrv/SqlsrvFetchLargeBench.php +++ b/test/Performance/benchmark/sqlsrv/SqlsrvFetchLargeBench.php @@ -6,27 +6,32 @@ use SqlsrvPerfTest\SqlsrvUtil; * @BeforeMethods({"connect", "setTableName" }) * @AfterMethods({ "disconnect"}) */ -class SqlsrvFetchLargeBench{ +class SqlsrvFetchLargeBench +{ private $conn; private $tableName; - public function setTableName(){ + public function setTableName() + { //Assumes the table is already populated with data $this->tableName = "LargeDB.dbo.datatypes"; } - public function connect(){ + public function connect() + { $this->conn = SqlsrvUtil::connect(); } /* * Each iteration calls prepare, execute and fetch APIs to fetch the already populdated data */ - public function benchFetchWithPrepare(){ + public function benchFetchWithPrepare() + { SqlsrvUtil::fetchWithPrepare( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { SqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/sqlsrv/SqlsrvInsertBench.php b/test/Performance/benchmark/sqlsrv/SqlsrvInsertBench.php index ebd7d21f..1d1c2a9f 100644 --- a/test/Performance/benchmark/sqlsrv/SqlsrvInsertBench.php +++ b/test/Performance/benchmark/sqlsrv/SqlsrvInsertBench.php @@ -1,47 +1,56 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = SqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { SqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = SqlsrvUtil::generateInsertValues(); } /** * Each iteration inserts 1000 rows into the table. * Note that, every insertion calls prepare, bindParam and execute APIs. */ - public function benchInsertWithPrepare(){ - for( $i=0; $i<100; $i++ ){ + public function benchInsertWithPrepare() + { + for( $i=0; $iconn, $this->tableName, $this->insertValues ); } } - public function dropTable(){ + public function dropTable() + { SqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { SqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/sqlsrv/SqlsrvSelectVersionBench.php b/test/Performance/benchmark/sqlsrv/SqlsrvSelectVersionBench.php index b89bc429..8f640460 100644 --- a/test/Performance/benchmark/sqlsrv/SqlsrvSelectVersionBench.php +++ b/test/Performance/benchmark/sqlsrv/SqlsrvSelectVersionBench.php @@ -6,21 +6,25 @@ use SqlsrvPerfTest\SqlsrvUtil; * @BeforeMethods({"connect"}) * @AfterMethods({"disconnect"}) */ -class SqlsrvSelectVersionBench{ +class SqlsrvSelectVersionBench +{ private $conn; - public function connect(){ + public function connect() + { $this->conn = SqlsrvUtil::connect(); } /* * Each iteration calls execDirect API to fetch @@Version */ - public function benchSelectVersion(){ + public function benchSelectVersion() + { $version = SqlsrvUtil::selectVersion( $this->conn ); } - public function disconnect(){ + public function disconnect() + { SqlsrvUtil::disconnect( $this->conn ); } } diff --git a/test/Performance/benchmark/sqlsrv/SqlsrvUpdateBench.php b/test/Performance/benchmark/sqlsrv/SqlsrvUpdateBench.php index 0d31b881..de86cc82 100644 --- a/test/Performance/benchmark/sqlsrv/SqlsrvUpdateBench.php +++ b/test/Performance/benchmark/sqlsrv/SqlsrvUpdateBench.php @@ -1,12 +1,13 @@ tableName = "datatypes_".rand(); } - public function connect(){ + public function connect() + { $this->conn = SqlsrvUtil::connect(); } - public function createTable(){ + public function createTable() + { SqlsrvUtil::createCRUDTable( $this->conn, $this->tableName ); } - public function generateInsertValues(){ + public function generateInsertValues() + { $this->insertValues = SqlsrvUtil::generateInsertValues(); } - public function insertWithPrepare(){ + public function insertWithPrepare() + { SqlsrvUtil::insertWithPrepare( $this->conn, $this->tableName, $this->insertValues ); } - public function generateUpdateValues(){ + public function generateUpdateValues() + { $this->updateValues = SqlsrvUtil::generateUpdateValues(); } - public function generateUpdateParams(){ + public function generateUpdateParams() + { $this->updateParams = SqlsrvUtil::generateUpdateParams(); } /** * Each iteration inserts a row into the table, updateWithPrepare() updates that row 1000 times. * Note that, every update calls prepare, bindParam and execute APIs. */ - public function benchUpdateWithPrepare(){ - for( $i=0; $i<100; $i++ ){ + public function benchUpdateWithPrepare() + { + for( $i=0; $iconn, $this->tableName, $this->updateValues, $this->updateParams ); } } - public function dropTable(){ + public function dropTable() + { SqlsrvUtil::dropTable( $this->conn, $this->tableName ); } - public function disconnect(){ + public function disconnect() + { SqlsrvUtil::disconnect( $this->conn ); } diff --git a/test/Performance/lib/CRUDBaseBenchmark.php b/test/Performance/lib/CRUDBaseBenchmark.php new file mode 100644 index 00000000..b8c07de5 --- /dev/null +++ b/test/Performance/lib/CRUDBaseBenchmark.php @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/test/Performance/lib/PDOSqlsrvUtil.php b/test/Performance/lib/PDOSqlsrvUtil.php index 2e82a476..d553b1c4 100644 --- a/test/Performance/lib/PDOSqlsrvUtil.php +++ b/test/Performance/lib/PDOSqlsrvUtil.php @@ -2,32 +2,41 @@ namespace PDOSqlsrvPerfTest; use PDO; -class PDOSqlsrvUtil{ +class PDOSqlsrvUtil +{ - public static function connect(){ + public static $loopsPerCRUDIter = 100; + + public static function connect() + { require dirname(__FILE__).DIRECTORY_SEPARATOR.'connect.php'; - try{ + try + { $conn = new PDO( "sqlsrv:Server=$server; Database=$database; ConnectionPooling=$pooling; MultipleActiveResultSets=$mars" , $uid, $pwd ); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); return $conn; } - catch( PDOException $e ){ + catch( PDOException $e ) + { var_dump( $e ); exit; } } - public static function disconnect( $conn ){ + public static function disconnect( $conn ) + { $conn = null; } - public static function selectVersion( $conn ){ + public static function selectVersion( $conn ) + { $sql = "SELECT @@Version"; $stmt = self::query( $conn, $sql ); return self::fetch( $stmt ); } - public static function createDbTableProc( $conn, $databaseName, $tableName, $procName ){ + public static function createDbTableProc( $conn, $databaseName, $tableName, $procName ) + { $tableParams = "id INTEGER, name VARCHAR(32), value INTEGER, start_date DATE, time_added TIMESTAMP, set_time TIME(7)"; $procParams = "@id INTEGER, @name VARCHAR(32)"; $procTextBase = "SET NOCOUNT ON; SELECT id, name, value FROM $databaseName.$tableName WHERE id = @id AND name = @name"; @@ -37,7 +46,8 @@ class PDOSqlsrvUtil{ self::createStoredProc( $conn, $procName, $procParams, $procTextBase ); } - public static function generateInsertValues(){ + public static function generateInsertValues() + { $vcharVal = "test string"; $nvcharVal = "wstring"; $intVal = 3; @@ -52,7 +62,8 @@ class PDOSqlsrvUtil{ return $values; } - public static function generateUpdateValues(){ + public static function generateUpdateValues() + { $vcharVal = "test string updated"; $nvcharVal = "wstring updated"; $intVal = 5; @@ -67,7 +78,8 @@ class PDOSqlsrvUtil{ return $updatedValues; } - public static function generateUpdateParams(){ + public static function generateUpdateParams() + { $fieldNames = array( "vstring", "nvstring", @@ -81,41 +93,47 @@ class PDOSqlsrvUtil{ "dtoffset"); $params = ""; - foreach( $fieldNames as $fieldName ){ + foreach( $fieldNames as $fieldName ) + { $params = $params.$fieldName."=?,"; } $params = rtrim($params,", "); return $params; } - public static function insertWithPrepare( $conn, $tableName, $values ){ + public static function insertWithPrepare( $conn, $tableName, $values ) + { $sql = "INSERT INTO $tableName VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; $stmt = self::prepare( $conn, $sql ); self::bindParams( $stmt, $values ); self::execute( $stmt ); } - public static function fetchWithPrepare( $conn, $tableName ){ + public static function fetchWithPrepare( $conn, $tableName ) + { $sql = "SELECT * FROM $tableName"; $stmt = self::prepare( $conn, $sql ); self::execute( $stmt ); while ( $row = self::fetch( $stmt )){} } - public static function deleteWithPrepare( $conn, $tableName ){ + public static function deleteWithPrepare( $conn, $tableName ) + { $sql = "DELETE TOP (1) FROM $tableName"; $stmt = self::prepare( $conn, $sql ); self::execute( $stmt ); } - public static function updateWithPrepare( $conn, $tableName, $updateValues, $params ){ + public static function updateWithPrepare( $conn, $tableName, $updateValues, $params ) + { $sql = "UPDATE $tableName SET ".$params; $stmt = self::prepare( $conn, $sql ); self::bindParams( $stmt, $updateValues ); self::execute( $stmt ); } - private function bindParams( $stmt, $values ){ + private function bindParams( $stmt, $values ) + { //This functionn assumes the fields are from createCRUDTable() self::bindParam( $stmt, 1, $values[0], PDO::PARAM_STR); self::bindParam( $stmt, 2, $values[1], PDO::PARAM_STR); @@ -129,7 +147,8 @@ class PDOSqlsrvUtil{ self::bindParam( $stmt, 10, $values[9], PDO::PARAM_STR); } - public static function createCRUDTable( $conn, $tableName ){ + public static function createCRUDTable( $conn, $tableName ) + { $fields = array( "vstring" => "VARCHAR(64)", "nvstring" => "NVARCHAR(64)", @@ -142,86 +161,106 @@ class PDOSqlsrvUtil{ "vbin" => "VARBINARY", "dtoffset" => "DATETIMEOFFSET"); $params = ""; - foreach( $fields as $fieldName => $type ){ + foreach( $fields as $fieldName => $type ) + { $params .= $fieldName." ".$type.","; } $params = rtrim($params,", "); self::createTable( $conn, $tableName, $params ); } - private function createDatabase( $conn, $dbName ){ + private function createDatabase( $conn, $dbName ) + { $sql = "CREATE DATABASE $dbName"; $conn->exec( $sql ); } - public static function dropDatabase( $conn, $dbName ){ + public static function dropDatabase( $conn, $dbName ) + { $sql = "USE MASTER;DROP DATABASE $dbName"; $conn->exec( $sql ); } - public static function createTable( $conn, $tableName, $params ){ + public static function createTable( $conn, $tableName, $params ) + { $sql = "CREATE TABLE $tableName ($params)"; $conn->exec( $sql ); } - public static function dropTable( $conn, $tableName ){ + public static function dropTable( $conn, $tableName ) + { $sql = "DROP TABLE $tableName"; $conn->exec( $sql ); } - private function useDatabase( $conn, $dbName ){ + private function useDatabase( $conn, $dbName ) + { $sql = "USE $dbName"; $conn->exec( $sql ); } - private function createStoredProc( $conn, $procName, $params, $text ){ + private function createStoredProc( $conn, $procName, $params, $text ) + { $sql = "CREATE PROCEDURE $procName $params AS $text"; $conn->exec( $sql ); } - private function dropStoredProc( $conn, $procName ){ + private function dropStoredProc( $conn, $procName ) + { $sql = "DROP PROCEDURE $procName"; $conn->exec( $sql ); } - private function query( $conn, $sql ){ - try{ + private function query( $conn, $sql ) + { + try + { return $conn->query( $sql ); } - catch( PDOException $e ){ + catch( PDOException $e ) + { var_dump( $e ); exit; } } - private function fetch( $stmt ){ + private function fetch( $stmt ) + { return $stmt->fetch(); } - private function prepare( $conn, $sql ){ - try{ + private function prepare( $conn, $sql ) + { + try + { $stmt = $conn->prepare( $sql ); - if( $stmt === false ){ + if( $stmt === false ) + { die( "Failed to prepare\n"); } return $stmt; } - catch( PDOException $e ){ + catch( PDOException $e ) + { var_dump( $e ); exit; } } - private function execute( $stmt ){ + private function execute( $stmt ) + { $ret = $stmt->execute(); - if( $ret === false ){ + if( $ret === false ) + { die( "Failed to execute\n" ); } } - private function bindParam( $stmt, $index, $value, $type ){ + private function bindParam( $stmt, $index, $value, $type ) + { $ret = $stmt->bindParam( $index, $value, $type ); - if ( $ret === false){ + if ( $ret === false) + { die( "Faild to bind\n"); } } diff --git a/test/Performance/lib/SqlsrvUtil.php b/test/Performance/lib/SqlsrvUtil.php index f2a73533..4c8091b5 100644 --- a/test/Performance/lib/SqlsrvUtil.php +++ b/test/Performance/lib/SqlsrvUtil.php @@ -2,35 +2,45 @@ namespace SqlsrvPerfTest; -class SqlsrvUtil{ +class SqlsrvUtil +{ + + public static $loopsPerCRUDIter = 100; - public static function connect(){ + public static function connect() + { require dirname(__FILE__).DIRECTORY_SEPARATOR.'connect.php'; $options = array( "Database"=>$database, "UID"=>$uid, "PWD"=>$pwd, "ConnectionPooling"=>$pooling, "MultipleActiveResultSets"=>$mars ); $conn = sqlsrv_connect( $server, $options ); - if ( $conn === false ){ + if ( $conn === false ) + { die( print_r( sqlsrv_errors(), true)); } return $conn; } - public static function disconnect( $conn ){ - if ( $conn === false || $conn === null ){ + public static function disconnect( $conn ) + { + if ( $conn === false || $conn === null ) + { die( print_r( "Invalid connection resource\n")); } $ret = sqlsrv_close( $conn ); - if ( $ret === false ){ + if ( $ret === false ) + { die( print_r( sqlsrv_errors(), true)); } } - public static function selectVersion( $conn ){ + public static function selectVersion( $conn ) + { $sql = "SELECT @@Version"; $stmt = self::query( $conn, $sql ); return self::fetchArray( $stmt ); } - public static function createDbTableProc( $conn, $databaseName, $tableName, $procName ){ + public static function createDbTableProc( $conn, $databaseName, $tableName, $procName ) + { $tableParams = "id INTEGER, name VARCHAR(32), value INTEGER, start_date DATE, time_added TIMESTAMP, set_time TIME(7)"; $procParams = "@id INTEGER, @name VARCHAR(32)"; $procTextBase = "SET NOCOUNT ON; SELECT id, name, value FROM $databaseName.$tableName WHERE id = @id AND name = @name"; @@ -40,7 +50,8 @@ class SqlsrvUtil{ self::createStoredProc( $conn, $procName, $procParams, $procTextBase ); } - public static function generateInsertValues(){ + public static function generateInsertValues() + { $vcharVal = "test string"; $nvcharVal = "wstring"; $intVal = 3; @@ -55,7 +66,8 @@ class SqlsrvUtil{ return $values; } - public static function generateUpdateValues(){ + public static function generateUpdateValues() + { $vcharVal = "test string updated"; $nvcharVal = "wstring updated"; $intVal = 5; @@ -70,7 +82,8 @@ class SqlsrvUtil{ return $updatedValues; } - public static function generateUpdateParams(){ + public static function generateUpdateParams() + { $fieldNames = array( "vstring", "nvstring", @@ -84,33 +97,38 @@ class SqlsrvUtil{ "dtoffset"); $params = ""; - foreach( $fieldNames as $fieldName ){ + foreach( $fieldNames as $fieldName ) + { $params = $params.$fieldName."=?,"; } $params = rtrim($params,", "); return $params; } - public static function insertWithPrepare( $conn, $tableName, $values ){ + public static function insertWithPrepare( $conn, $tableName, $values ) + { $sql = "INSERT INTO $tableName VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; $stmt = self::prepare( $conn, $sql, $values ); self::execute( $stmt ); } - public static function updateWithPrepare( $conn, $tableName, $updateValues, $params ){ + public static function updateWithPrepare( $conn, $tableName, $updateValues, $params ) + { $sql = "UPDATE $tableName SET ".$params; $stmt = self::prepare( $conn, $sql, $updateValues ); self::execute( $stmt ); } - public static function fetchWithPrepare( $conn, $tableName ){ + public static function fetchWithPrepare( $conn, $tableName ) + { $sql = "SELECT * FROM $tableName"; $stmt = self::prepare( $conn, $sql, array()); self::execute( $stmt ); while( $row = self::fetchArray( $stmt ) ) {} } - public static function createCRUDTable( $conn, $tableName ){ + public static function createCRUDTable( $conn, $tableName ) + { $fields = array( "vstring" => "VARCHAR(64)", "nvstring" => "NVARCHAR(64)", @@ -123,108 +141,131 @@ class SqlsrvUtil{ "vbin" => "VARBINARY", "dtoffset" => "DATETIMEOFFSET"); $params = ""; - foreach( $fields as $fieldName => $type ){ + foreach( $fields as $fieldName => $type ) + { $params .= $fieldName." ".$type.","; } $params = rtrim($params,", "); self::createTable( $conn, $tableName, $params ); } - public static function query( $conn, $sql ){ + public static function query( $conn, $sql ) + { $stmt = sqlsrv_query( $conn, $sql ); - if( $stmt === false ){ + if( $stmt === false ) + { die( print_r( sqlsrv_errors(), true)); } return $stmt; } - public static function fetch( $stmt ){ + public static function fetch( $stmt ) + { $ret = sqlsrv_fetch( $stmt ); - if( $ret === false ){ + if( $ret === false ) + { die( print_r( sqlsrv_errors(), true)); } return $ret; } - public static function fetchArray( $stmt ){ + public static function fetchArray( $stmt ) + { $row = sqlsrv_fetch_array( $stmt ); - if ( $row === false ){ + if ( $row === false ) + { die( print_r( sqlsrv_errors(), true)); } return $row; } - public static function getField( $stmt, $index ){ + public static function getField( $stmt, $index ) + { return sqlsrv_get_field( $stmt, $index ); } - private function createDatabase( $conn, $dbName ){ + private function createDatabase( $conn, $dbName ) + { $sql = "CREATE DATABASE $dbName"; self::query( $conn, $sql ); } - public static function dropDatabase( $conn, $dbName ){ + public static function dropDatabase( $conn, $dbName ) + { $sql = "USE MASTER;DROP DATABASE $dbName"; self::query( $conn, $sql ); } - public static function createTable( $conn, $tableName, $params ){ + public static function createTable( $conn, $tableName, $params ) + { $sql = "CREATE TABLE $tableName ($params)"; self::query( $conn, $sql ); } - public static function dropTable( $conn, $tableName ){ + public static function dropTable( $conn, $tableName ) + { $sql = "DROP TABLE $tableName"; self::query( $conn, $sql ); } - private function useDatabase( $conn, $dbName ){ + private function useDatabase( $conn, $dbName ) + { $sql = "USE $dbName"; self::query( $conn, $sql ); } - private function createStoredProc( $conn, $procName, $params, $text ){ + private function createStoredProc( $conn, $procName, $params, $text ) + { $sql = "CREATE PROCEDURE $procName $params AS $text"; self::query( $conn, $sql ); } - private function dropStoredProc( $conn, $procName ){ + private function dropStoredProc( $conn, $procName ) + { $sql = "DROP PROCEDURE $procName"; self::query( $conn, $sql ); } - private function insert( $conn, $tableName, $values ){ + private function insert( $conn, $tableName, $values ) + { $sql = "INSERT INTO $tableName values ($values)"; self::query( $conn, $sql ); } - private function update( $conn, $tableName, $params, $condition ){ + private function update( $conn, $tableName, $params, $condition ) + { $sql = "UPDATE $tableName SET $params WHERE $condition"; self::query( $sql ); } - public function delete( $conn, $tableName){ + public function delete( $conn, $tableName) + { $sql = "DELETE TOP (1) FROM $tableName"; self::query( $conn, $sql ); } - public function deleteWithPrepare( $conn, $tableName ){ + public function deleteWithPrepare( $conn, $tableName ) + { $sql = "DELETE TOP (1) FROM $tableName"; $stmt = self::prepare( $conn, $sql, array() ); self::execute( $stmt ); } - private function prepare( $conn, $sql, $params ){ + private function prepare( $conn, $sql, $params ) + { $stmt = sqlsrv_prepare( $conn, $sql, $params ); - if( $stmt === false ){ + if( $stmt === false ) + { die( print_r( sqlsrv_errors(), true)); } return $stmt; } - public function execute( $stmt ){ + public function execute( $stmt ) + { $ret = sqlsrv_execute( $stmt ); - if ( $ret === false ){ + if ( $ret === false ) + { die( print_r( sqlsrv_errors(), true)); } } diff --git a/test/Performance/report.sql b/test/Performance/report.sql index 5629abf2..8023d6ac 100644 --- a/test/Performance/report.sql +++ b/test/Performance/report.sql @@ -1,8 +1,9 @@ --The script can be run to read the results. You can filter out the results ran on a certain date by changing the date at the end. +DECLARE @convByteToMegabyte int = 1048576 select t1.ResultId, Test, Client, Server, Driver, Duration, Memory, Success, Team, StartTime from ( select pr.ResultId, pr.Success, pt.TestName as Test, cl.HostName as Client, srv.HostName as Server, -tm.TeamName as Team, st.value as Driver, bi.value as Duration, CAST(bi2.value AS decimal(10,2))/1048576 as Memory, dt.value as StartTime from +tm.TeamName as Team, st.value as Driver, bi.value as Duration, CAST(bi2.value AS decimal(10,2))/@convByteToMegabyte as Memory, dt.value as StartTime from KeyValueTableBigInt bi, KeyValueTableBigInt bi2, KeyValueTableString st, @@ -20,5 +21,4 @@ and cl.ClientId = pr.ClientId and pt.TestId = pr.TestId and tm.TeamId = pr.TeamId and srv.ServerId = pr.ServerId -) t1 where StartTime like '%2017-06-23%' - +) t1 where StartTime like '%2017-06-23%' \ No newline at end of file diff --git a/test/Performance/run-perf_tests.py b/test/Performance/run-perf_tests.py index 0a04e2ab..4a928efe 100644 --- a/test/Performance/run-perf_tests.py +++ b/test/Performance/run-perf_tests.py @@ -755,7 +755,7 @@ if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument( '-platform', '--PLATFORM', required=True, help='The name of the platform the tests run on' ) parser.add_argument( '-php-driver', '--PHP_DRIVER', default='both', help='Name of the PHP driver: sqlsrv, pdo_sqlsrv or both') - parser.add_argument( '-test-only', '--TEST_ONLY', default='all', help='File name for only one test or all' ) + parser.add_argument( '-testname', '--TESTNAME', default='all', help='File name for only one test or all' ) args = parser.parse_args() # Start time is recorded only in the beginning of this script execution. So it is not benchmark specific. @@ -769,7 +769,7 @@ if __name__ == '__main__': print("Running the tests with default settings...") - run_tests( args.PHP_DRIVER, args.TEST_ONLY ) + run_tests( args.PHP_DRIVER, args.TESTNAME ) parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 0, 0 ) """ The following lines are commented out, because it already takes a long time to run the tests with the default settings. @@ -777,14 +777,14 @@ if __name__ == '__main__': print("Running the tests with MARS ON...") enable_mars() - run_tests( args.PHP_DRIVER, args.TEST_ONLY ) + run_tests( args.PHP_DRIVER, args.TESTNAME ) parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 1, 0 ) disable_mars() print("Running the tests with Pooling ON...") enable_pooling() - run_tests( args.PHP_DRIVER, args.TEST_ONLY ) + run_tests( args.PHP_DRIVER, args.TESTNAME ) parse_and_store_results_all( test_db, result_db, args.PLATFORM, start_time, 0, 1 ) disable_pooling() """