diff options
-rw-r--r-- | includes/bootstrap.inc | 29 | ||||
-rw-r--r-- | includes/common.inc | 32 | ||||
-rw-r--r-- | includes/module.inc | 8 | ||||
-rw-r--r-- | includes/path.inc | 24 | ||||
-rw-r--r-- | modules/user/user.module | 8 |
5 files changed, 69 insertions, 32 deletions
diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index 9710669b7..7bc180ef5 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -2188,16 +2188,35 @@ function registry_update() { * function is called many times (100+) during a single page request, so * every microsecond of execution time that can be removed from the function * counts. These functions can use a more cumbersome, but faster variant of - * calling drupal_static(). For benchmarks and background on this variant, - * please see http://drupal.org/node/619666. + * calling drupal_static(). It works by storing the reference returned by + * drupal_static() in the calling function's own static variable, thereby + * removing the need to call drupal_static() for each iteration of the function. + * Conceptually, it replaces: + * @code + * $foo = &drupal_static(__FUNCTION__); + * @endcode + * with: + * @code + * // Unfortunately, this does not work. + * static $foo = &drupal_static(__FUNCTION__); + * @endcode + * However, the above line of code does not work, because PHP only allows static + * variables to be initializied by literal values, and does not allow static + * variables to be assigned to references. + * - http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static + * - http://php.net/manual/en/language.variables.scope.php#language.variables.scope.references + * The example below shows the syntax needed to work around both limitations. + * For benchmarks and more information, @see http://drupal.org/node/619666. * * Example: * @code * function user_access($string, $account = NULL) { * // Use the advanced drupal_static() pattern, since this is called very often. - * static $drupal_static = array(); - * isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - * $perm = &$drupal_static[__FUNCTION__]; + * static $drupal_static_fast; + * if (!isset($drupal_static_fast)) { + * $drupal_static_fast['perm'] = &drupal_static(__FUNCTION__); + * } + * $perm = &$drupal_static_fast['perm']; * ... * } * @endcode diff --git a/includes/common.inc b/includes/common.inc index 683cb16b2..6d69a18dd 100644 --- a/includes/common.inc +++ b/includes/common.inc @@ -2278,9 +2278,11 @@ function format_interval($timestamp, $granularity = 2, $langcode = NULL) { */ function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) { // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $timezones = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['timezones'] = &drupal_static(__FUNCTION__); + } + $timezones = &$drupal_static_fast['timezones']; if (!isset($timezone)) { global $user; @@ -2519,9 +2521,11 @@ function url($path = NULL, array $options = array()) { global $base_url, $base_secure_url, $base_insecure_url; // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $script = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['script'] = &drupal_static(__FUNCTION__); + } + $script = &$drupal_static_fast['script']; if (!isset($script)) { // On some web servers, such as IIS, we can't omit "index.php". So, we @@ -4769,9 +4773,11 @@ function drupal_system_listing($mask, $directory, $key = 'name', $min_depth = 1) */ function drupal_alter($type, &$data, &$context1 = NULL, &$context2 = NULL) { // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $functions = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['functions'] = &drupal_static(__FUNCTION__); + } + $functions = &$drupal_static_fast['functions']; // Some alter hooks are invoked many times per page request, so statically // cache the list of functions to call, and on subsequent calls, iterate @@ -6271,9 +6277,11 @@ function drupal_check_incompatibility($v, $current_version) { */ function entity_get_info($entity_type = NULL) { // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $entity_info = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['entity_info'] = &drupal_static(__FUNCTION__); + } + $entity_info = &$drupal_static_fast['entity_info']; if (empty($entity_info)) { if ($cache = cache_get('entity_info')) { diff --git a/includes/module.inc b/includes/module.inc index e3f31a009..f440858a8 100644 --- a/includes/module.inc +++ b/includes/module.inc @@ -450,9 +450,11 @@ function module_hook($module, $hook) { */ function module_implements($hook, $sort = FALSE, $reset = FALSE) { // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $implementations = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['implementations'] = &drupal_static(__FUNCTION__); + } + $implementations = &$drupal_static_fast['implementations']; // We maintain a persistent cache of hook implementations in addition to the // static cache to avoid looping through every module and every hook on each diff --git a/includes/path.inc b/includes/path.inc index c83a0eec8..b747d5de1 100644 --- a/includes/path.inc +++ b/includes/path.inc @@ -46,9 +46,11 @@ function drupal_path_initialize() { function drupal_lookup_path($action, $path = '', $path_language = NULL) { global $language; // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $cache = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['cache'] = &drupal_static(__FUNCTION__); + } + $cache = &$drupal_static_fast['cache']; if (!isset($cache)) { $cache = array( @@ -260,9 +262,11 @@ function arg($index = NULL, $path = NULL) { // information), it should be resettable anyway in case a module needs to // free up the memory used by it. // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $arguments = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['arguments'] = &drupal_static(__FUNCTION__); + } + $arguments = &$drupal_static_fast['arguments']; if (!isset($path)) { $path = $_GET['q']; @@ -328,9 +332,11 @@ function drupal_set_title($title = NULL, $output = CHECK_PLAIN) { */ function drupal_is_front_page() { // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $is_front_page = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['is_front_page'] = &drupal_static(__FUNCTION__); + } + $is_front_page = &$drupal_static_fast['is_front_page']; if (!isset($is_front_page)) { // As drupal_path_initialize updates $_GET['q'] with the 'site_frontpage' path, diff --git a/modules/user/user.module b/modules/user/user.module index e9e3849fa..41f83d945 100644 --- a/modules/user/user.module +++ b/modules/user/user.module @@ -719,9 +719,11 @@ function user_access($string, $account = NULL) { // To reduce the number of SQL queries, we cache the user's permissions // in a static variable. // Use the advanced drupal_static() pattern, since this is called very often. - static $drupal_static = array(); - isset($drupal_static[__FUNCTION__]) || ($drupal_static[__FUNCTION__] = &drupal_static(__FUNCTION__)); - $perm = &$drupal_static[__FUNCTION__]; + static $drupal_static_fast; + if (!isset($drupal_static_fast)) { + $drupal_static_fast['perm'] = &drupal_static(__FUNCTION__); + } + $perm = &$drupal_static_fast['perm']; if (!isset($perm[$account->uid])) { $role_permissions = user_role_permissions($account->roles); |