andrey                                   Thu, 12 Aug 2010 13:23:16 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=302143

Log:
Allocate memory in a burst mode, and later use it. Increases
locality of the data.
Also use MYSQLND_INC_CONN_STATISTIC in one place, instead of
two, thus removing code duplication from macro expansion - less
code to fit in the instruction cache.

Changed paths:
    U   php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c
    U   php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c

Modified: php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c     
2010-08-12 12:02:02 UTC (rev 302142)
+++ php/php-src/branches/PHP_5_3/ext/mysqlnd/mysqlnd_wireprotocol.c     
2010-08-12 13:23:16 UTC (rev 302143)
@@ -1201,24 +1201,29 @@

        DBG_ENTER("php_mysqlnd_rowp_read_binary_protocol");

-       end_field = (current_field = start_field = fields) + field_count;
-       if (!current_field) {
+       if (!fields) {
                DBG_RETURN(FAIL);
        }

+       end_field = (start_field = fields) + field_count;
+
        /* skip the first byte, not EODATA_MARKER -> 0x0, status */
        p++;
        null_ptr= p;
        p += (field_count + 9)/8;       /* skip null bits */
        bit     = 4;                                    /* first 2 bits are 
reserved */

-       for (i = 0; current_field < end_field; current_field++, i++) {
+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
                DBG_INF("Directly creating zval");
                MAKE_STD_ZVAL(*current_field);
                if (!*current_field) {
                        DBG_RETURN(FAIL);
                }
-
+       }
+
+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
+               enum_mysqlnd_collected_stats statistic;
+
                DBG_INF_FMT("Into zval=%p decoding column %u [%s.%s.%s] type=%u 
field->flags&unsigned=%u flags=%u is_bit=%u as_unicode=%u",
                        *current_field, i,
                        fields_metadata[i].db, fields_metadata[i].table, 
fields_metadata[i].name, fields_metadata[i].type,
@@ -1226,13 +1231,12 @@
                if (*null_ptr & bit) {
                        DBG_INF("It's null");
                        ZVAL_NULL(*current_field);
-                       MYSQLND_INC_CONN_STATISTIC(stats, 
STAT_BINARY_TYPE_FETCHED_NULL);
+                       statistic = STAT_BINARY_TYPE_FETCHED_NULL;
                } else {
                        enum_mysqlnd_field_types type = fields_metadata[i].type;
                        mysqlnd_ps_fetch_functions[type].func(*current_field, 
&fields_metadata[i], 0, &p, as_unicode TSRMLS_CC);

                        if (MYSQLND_G(collect_statistics)) {
-                               enum_mysqlnd_collected_stats statistic;
                                switch (fields_metadata[i].type) {
                                        case MYSQL_TYPE_DECIMAL:        
statistic = STAT_BINARY_TYPE_FETCHED_DECIMAL; break;
                                        case MYSQL_TYPE_TINY:           
statistic = STAT_BINARY_TYPE_FETCHED_INT8; break;
@@ -1263,9 +1267,10 @@
                                        case MYSQL_TYPE_GEOMETRY:       
statistic = STAT_BINARY_TYPE_FETCHED_GEOMETRY; break;
                                        default: statistic = 
STAT_BINARY_TYPE_FETCHED_OTHER; break;
                                }
-                               MYSQLND_INC_CONN_STATISTIC(stats, statistic);
                        }
                }
+               MYSQLND_INC_CONN_STATISTIC(stats, statistic);
+
                if (!((bit<<=1) & 255)) {
                        bit = 1;        /* to the following byte */
                        null_ptr++;
@@ -1294,23 +1299,26 @@

        DBG_ENTER("php_mysqlnd_rowp_read_text_protocol");

-       end_field = (current_field = start_field = fields) + field_count;
-       if (!current_field) {
+       if (!fields) {
                DBG_RETURN(FAIL);
        }

-       for (i = 0; current_field < end_field; current_field++, i++) {
-               /* Don't reverse the order. It is significant!*/
-               zend_uchar *this_field_len_pos = p;
-               /* php_mysqlnd_net_field_length() call should be after 
*this_field_len_pos = p; */
-               unsigned long len = php_mysqlnd_net_field_length(&p);
+       end_field = (start_field = fields) + field_count;

+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
                DBG_INF("Directly creating zval");
                MAKE_STD_ZVAL(*current_field);
                if (!*current_field) {
                        DBG_RETURN(FAIL);
                }
+       }

+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
+               /* Don't reverse the order. It is significant!*/
+               zend_uchar *this_field_len_pos = p;
+               /* php_mysqlnd_net_field_length() call should be after 
*this_field_len_pos = p; */
+               unsigned long len = php_mysqlnd_net_field_length(&p);
+
                if (current_field > start_field && last_field_was_string) {
                        /*
                          Normal queries:

Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c
===================================================================
--- php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c        2010-08-12 
12:02:02 UTC (rev 302142)
+++ php/php-src/trunk/ext/mysqlnd/mysqlnd_wireprotocol.c        2010-08-12 
13:23:16 UTC (rev 302143)
@@ -1201,24 +1201,29 @@

        DBG_ENTER("php_mysqlnd_rowp_read_binary_protocol");

-       end_field = (current_field = start_field = fields) + field_count;
-       if (!current_field) {
+       if (!fields) {
                DBG_RETURN(FAIL);
        }

+       end_field = (start_field = fields) + field_count;
+
        /* skip the first byte, not EODATA_MARKER -> 0x0, status */
        p++;
        null_ptr= p;
        p += (field_count + 9)/8;       /* skip null bits */
        bit     = 4;                                    /* first 2 bits are 
reserved */

-       for (i = 0; current_field < end_field; current_field++, i++) {
+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
                DBG_INF("Directly creating zval");
                MAKE_STD_ZVAL(*current_field);
                if (!*current_field) {
                        DBG_RETURN(FAIL);
                }
-
+       }
+
+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
+               enum_mysqlnd_collected_stats statistic;
+
                DBG_INF_FMT("Into zval=%p decoding column %u [%s.%s.%s] type=%u 
field->flags&unsigned=%u flags=%u is_bit=%u as_unicode=%u",
                        *current_field, i,
                        fields_metadata[i].db, fields_metadata[i].table, 
fields_metadata[i].name, fields_metadata[i].type,
@@ -1226,13 +1231,12 @@
                if (*null_ptr & bit) {
                        DBG_INF("It's null");
                        ZVAL_NULL(*current_field);
-                       MYSQLND_INC_CONN_STATISTIC(stats, 
STAT_BINARY_TYPE_FETCHED_NULL);
+                       statistic = STAT_BINARY_TYPE_FETCHED_NULL;
                } else {
                        enum_mysqlnd_field_types type = fields_metadata[i].type;
                        mysqlnd_ps_fetch_functions[type].func(*current_field, 
&fields_metadata[i], 0, &p, as_unicode TSRMLS_CC);

                        if (MYSQLND_G(collect_statistics)) {
-                               enum_mysqlnd_collected_stats statistic;
                                switch (fields_metadata[i].type) {
                                        case MYSQL_TYPE_DECIMAL:        
statistic = STAT_BINARY_TYPE_FETCHED_DECIMAL; break;
                                        case MYSQL_TYPE_TINY:           
statistic = STAT_BINARY_TYPE_FETCHED_INT8; break;
@@ -1263,9 +1267,10 @@
                                        case MYSQL_TYPE_GEOMETRY:       
statistic = STAT_BINARY_TYPE_FETCHED_GEOMETRY; break;
                                        default: statistic = 
STAT_BINARY_TYPE_FETCHED_OTHER; break;
                                }
-                               MYSQLND_INC_CONN_STATISTIC(stats, statistic);
                        }
                }
+               MYSQLND_INC_CONN_STATISTIC(stats, statistic);
+
                if (!((bit<<=1) & 255)) {
                        bit = 1;        /* to the following byte */
                        null_ptr++;
@@ -1294,23 +1299,26 @@

        DBG_ENTER("php_mysqlnd_rowp_read_text_protocol");

-       end_field = (current_field = start_field = fields) + field_count;
-       if (!current_field) {
+       if (!fields) {
                DBG_RETURN(FAIL);
        }

-       for (i = 0; current_field < end_field; current_field++, i++) {
-               /* Don't reverse the order. It is significant!*/
-               zend_uchar *this_field_len_pos = p;
-               /* php_mysqlnd_net_field_length() call should be after 
*this_field_len_pos = p; */
-               unsigned long len = php_mysqlnd_net_field_length(&p);
+       end_field = (start_field = fields) + field_count;

+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
                DBG_INF("Directly creating zval");
                MAKE_STD_ZVAL(*current_field);
                if (!*current_field) {
                        DBG_RETURN(FAIL);
                }
+       }

+       for (i = 0, current_field = start_field; current_field < end_field; 
current_field++, i++) {
+               /* Don't reverse the order. It is significant!*/
+               zend_uchar *this_field_len_pos = p;
+               /* php_mysqlnd_net_field_length() call should be after 
*this_field_len_pos = p; */
+               unsigned long len = php_mysqlnd_net_field_length(&p);
+
                if (current_field > start_field && last_field_was_string) {
                        /*
                          Normal queries:

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to