diff --git a/modules/block/block.module b/modules/block/block.module
index ff77d9e..a64f9db 100644
--- a/modules/block/block.module
+++ b/modules/block/block.module
@@ -840,15 +840,42 @@ function _block_render_blocks($region_blocks) {
   // preserve the submission of forms in blocks, by fetching from cache only
   // if the request method is 'GET' (or 'HEAD').
   $cacheable = !count(module_implements('node_grants')) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD');
+
+  // Proceed to loop over all blocks in order to compute their respective cache
+  // identifiers; this allows us to do one single cache_get_multiple() call
+  // instead of doing one cache_get() call per block.
+  $cached_blocks = array();
+  $cids_by_key = array();
+  if ($cacheable) {
+    $cids = array();
+    $keys_by_cid = array();
+    foreach ($region_blocks as $key => $block) {
+      if (!isset($block->content)) {
+        if ($cid = _block_get_cache_id($block)) {
+          $cids[] = $cid;
+          $keys_by_cid[$cid] = $key;
+        }
+      }
+    }
+    $cids_by_key = array_flip($keys_by_cid);
+
+    if ($cids) {
+      foreach (cache_get_multiple($cids, 'cache_block') as $cid => $cached_data) {
+        $cached_blocks[$keys_by_cid[$cid]] = $cached_data;
+      }
+    }
+  }
+
   foreach ($region_blocks as $key => $block) {
     // Render the block content if it has not been created already.
     if (!isset($block->content)) {
       // Erase the block from the static array - we'll put it back if it has
       // content.
       unset($region_blocks[$key]);
-      // Try fetching the block from cache.
-      if ($cacheable && ($cid = _block_get_cache_id($block)) && ($cache = cache_get($cid, 'cache_block'))) {
-        $array = $cache->data;
+
+      // Try fetching the block from the previously loaded cache entries.
+      if (isset($cached_blocks[$key])) {
+        $array = $cached_blocks[$key]->data;
       }
       else {
         $array = module_invoke($block->module, 'block_view', $block->delta);
@@ -857,8 +884,8 @@ function _block_render_blocks($region_blocks) {
         // hook_block_view_alter() or hook_block_view_MODULE_DELTA_alter().
         drupal_alter(array('block_view', "block_view_{$block->module}_{$block->delta}"), $array, $block);
 
-        if (isset($cid)) {
-          cache_set($cid, $array, 'cache_block', CACHE_TEMPORARY);
+        if (isset($cids_by_key[$key])) {
+          cache_set($cids_by_key[$key], $array, 'cache_block', CACHE_TEMPORARY);
         }
       }
 
