← Back to team overview

anewt-developers team mailing list archive

[Branch ~uws/anewt/anewt.uws] Rev 1784: [database] Performance optimzation of row casting for MySQL

 

------------------------------------------------------------
revno: 1784
committer: Wouter Bolsterlee <uws@xxxxxxxxx>
branch nick: anewt.uws
timestamp: Wed 2010-03-31 20:57:08 +0200
message:
  [database] Performance optimzation of row casting for MySQL
modified:
  database/backend-mysql.lib.php


--
lp:anewt
https://code.launchpad.net/~uws/anewt/anewt.uws

Your team Anewt developers is subscribed to branch lp:anewt.
To unsubscribe from this branch go to https://code.launchpad.net/~uws/anewt/anewt.uws/+edit-subscription
=== modified file 'database/backend-mysql.lib.php'
--- database/backend-mysql.lib.php	2010-01-05 20:45:41 +0000
+++ database/backend-mysql.lib.php	2010-03-31 18:57:08 +0000
@@ -239,16 +239,19 @@
 			if (is_null($value))
 				continue;
 
+			/* Performance optimization: put some often-used types on top to
+			 * avoid doing too many switch/case comparisons early on for
+			 * relatively rare column * types.
+			 *
+			 * XXX: A static hash table mapping MySQL types to "Anewt conversion
+			 * methods" (simple ints, for instance) followed by a short if/else
+			 * construct for each of the conversion methods might be a better
+			 * optimization approach.
+			 */
 			switch ($type)
 			{
-				case MYSQLI_TYPE_DECIMAL:
-				case MYSQLI_TYPE_NEWDECIMAL:
-				case MYSQLI_TYPE_BIT:
-				case MYSQLI_TYPE_TINY:
-				case MYSQLI_TYPE_SHORT:
+				/* Common integer types (INT) */
 				case MYSQLI_TYPE_LONG:
-				case MYSQLI_TYPE_INT24:
-				case MYSQLI_TYPE_YEAR:
 					$value = (int) $value;
 					break;
 
@@ -257,24 +260,14 @@
 					   hold the values in an integer data type. */
 					if (PHP_INT_SIZE >= 8)
 						$value = (int) $value;
-
-					break;
-
-				case MYSQLI_TYPE_FLOAT:
-				case MYSQLI_TYPE_DOUBLE:
-					$value = (float) $value;
-					break;
-
-				case MYSQLI_TYPE_TINY_BLOB:
-				case MYSQLI_TYPE_MEDIUM_BLOB:
-				case MYSQLI_TYPE_LONG_BLOB:
-				case MYSQLI_TYPE_BLOB:
+					break;
+
+
+				/* Common string types (VARCHAR) */
 				case MYSQLI_TYPE_VAR_STRING:
-				case MYSQLI_TYPE_STRING:
-				case MYSQLI_TYPE_CHAR:
-					$value = (string) $value;
 					break;
 
+				/* Date and time types */
 				case MYSQLI_TYPE_TIMESTAMP:
 				case MYSQLI_TYPE_DATE:
 				case MYSQLI_TYPE_TIME:
@@ -283,15 +276,39 @@
 					$value = AnewtDateTime::parse_string($value);
 					break;
 
-				case MYSQLI_TYPE_ENUM:
-				case MYSQLI_TYPE_INTERVAL:
-				case MYSQLI_TYPE_ENUM:
-				case MYSQLI_TYPE_SET:
-				case MYSQLI_TYPE_GEOMETRY:
-					/* XXX: Fall-through: what should be done with these? */
-
+				/* Floating point types */
+				case MYSQLI_TYPE_FLOAT:
+				case MYSQLI_TYPE_DOUBLE:
+					$value = (float) $value;
+					break;
+
+				/* Less common integer types */
+				case MYSQLI_TYPE_TINY:
+				case MYSQLI_TYPE_INT24:
+				case MYSQLI_TYPE_SHORT:
+				case MYSQLI_TYPE_DECIMAL:
+				case MYSQLI_TYPE_NEWDECIMAL:
+				case MYSQLI_TYPE_BIT:
+				case MYSQLI_TYPE_YEAR:
+					$value = (int) $value;
+					break;
+
+				/* Fall-through for types that will be left as-is (no
+				 * conversion, leave as string):
+				 *
+				 * - MYSQLI_TYPE_TINY_BLOB:
+				 * - MYSQLI_TYPE_MEDIUM_BLOB:
+				 * - MYSQLI_TYPE_LONG_BLOB:
+				 * - MYSQLI_TYPE_BLOB:
+				 * - MYSQLI_TYPE_STRING:
+				 * - MYSQLI_TYPE_CHAR:
+				 * - MYSQLI_TYPE_ENUM:
+				 * - MYSQLI_TYPE_INTERVAL:
+				 * - MYSQLI_TYPE_ENUM:
+				 * - MYSQLI_TYPE_SET:
+				 * - MYSQLI_TYPE_GEOMETRY:
+				 */
 				default:
-					/* No conversion, leave as string */
 					break;
 			}