Index: includes/common.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/common.inc,v retrieving revision 1.842 diff -u -p -r1.842 common.inc --- includes/common.inc 5 Jan 2009 22:23:58 -0000 1.842 +++ includes/common.inc 9 Jan 2009 01:48:18 -0000 @@ -3180,7 +3180,10 @@ function drupal_alter($type, &$data) { * * Recursively iterates over each of the array elements, generating HTML code. * This function is usually called from within a another function, like - * drupal_get_form() or node_view(). + * drupal_get_form() or node_view(). Elements are sorted internally using + * uasort(). Since this is expensive, when passing already sorted elements to + * drupal_render(), for example from a database query, set + * $elements['#sorted'] = TRUE to avoid trying to sort them a second time. * * @param $elements * The structured array describing the data to be rendered. @@ -3188,6 +3191,7 @@ function drupal_alter($type, &$data) { * The rendered HTML. */ function drupal_render(&$elements) { + // Early-return nothing if user does not have access. if (!isset($elements) || (isset($elements['#access']) && !$elements['#access'])) { return NULL; } @@ -3211,15 +3215,19 @@ function drupal_render(&$elements) { } } - $content = ''; - // Either the elements did not go through form_builder or one of the children - // has a #weight. - if (!isset($elements['#sorted'])) { - uasort($elements, "element_sort"); + // Sort the elements by weight, if there are any children, and have not been + // sorted elsewhere already, for example by a database query. Pre-sorted + // elements should have $elements['#sorted'] set to TRUE to avoid unnecessary + // calls to uasort(). + $children = !isset($elements['#children']) ? element_children($elements) : FALSE; + if (!isset($elements['#sorted']) && $children) { + uasort($elements, 'element_sort'); + $elements['#sorted'] = TRUE; } + + $content = ''; $elements += array('#title' => NULL, '#description' => NULL); if (!isset($elements['#children'])) { - $children = element_children($elements); // Render all the children that use a theme function. if (isset($elements['#theme']) && empty($elements['#theme_used'])) { $elements['#theme_used'] = TRUE; Index: modules/comment/comment.module =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v retrieving revision 1.680 diff -u -p -r1.680 comment.module --- modules/comment/comment.module 4 Jan 2009 16:19:39 -0000 1.680 +++ modules/comment/comment.module 9 Jan 2009 01:48:21 -0000 @@ -498,6 +498,7 @@ function comment_nodeapi_view($node, $te if ($node->comment && (bool)menu_get_object() && $node->build_mode != NODE_BUILD_PREVIEW) { $node->content['comments'] = array( '#markup' => comment_render($node), + '#sorted' => TRUE, ); } } Index: modules/taxonomy/taxonomy.module =================================================================== RCS file: /cvs/drupal/drupal/modules/taxonomy/taxonomy.module,v retrieving revision 1.451 diff -u -p -r1.451 taxonomy.module --- modules/taxonomy/taxonomy.module 30 Dec 2008 16:43:19 -0000 1.451 +++ modules/taxonomy/taxonomy.module 9 Jan 2009 01:48:28 -0000 @@ -76,7 +76,8 @@ function taxonomy_nodeapi_view($node) { $node->content['links']['terms'] = array( '#type' => 'node_links', - '#value' => $links + '#value' => $links, + '#sorted' => TRUE, ); }