diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 3fc38fd..7a54289 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -135,6 +135,14 @@ class EntityManager extends DefaultPluginManager implements EntityManagerInterfa
   protected $fieldMap = array();
 
   /**
+   * Filter versions of $this->fieldMap. An array keyed by field type with the
+   * associated value being filtered version of $this->fieldMap.
+   *
+   * @var array
+   */
+  protected $fieldMapByFieldType = array();
+
+  /**
    * Constructs a new Entity plugin manager.
    *
    * @param \Traversable $namespaces
@@ -566,6 +574,25 @@ public function getFieldMap() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getFieldMapByFieldType($field_type) {
+    if (!isset($this->fieldMapByFieldType[$field_type])) {
+      $filtered_map = array();
+      $map = $this->getFieldMap();
+      foreach ($map as $entity_type => $fields) {
+        foreach ($fields as $field_name => $field_info) {
+          if ($field_info['type'] == $field_type) {
+            $filtered_map[$entity_type][$field_name] = $field_info;
+          }
+        }
+      }
+      $this->fieldMapByFieldType[$field_type] = $filtered_map;
+    }
+    return $this->fieldMapByFieldType[$field_type];
+  }
+
+  /**
    * Builds field storage definitions for an entity type.
    *
    * @param string $entity_type_id
@@ -610,6 +637,7 @@ public function clearCachedFieldDefinitions() {
     $this->fieldDefinitions = array();
     $this->fieldStorageDefinitions = array();
     $this->fieldMap = array();
+    $this->fieldMapByFieldType = array();
     $this->displayModeInfo = array();
     $this->extraFields = array();
     Cache::deleteTags(array('entity_field_info' => TRUE));
diff --git a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
index 104f774..1fc485d 100644
--- a/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityManagerInterface.php
@@ -92,6 +92,20 @@ public function getFieldStorageDefinitions($entity_type_id);
   public function getFieldMap();
 
   /**
+   * Collects a lightweight map of fields across bundles filtered by field type.
+   *
+   * @param string $field_type
+   *   The field type to filter by.
+   *
+   * @return array
+   *   An array keyed by entity type. Each value is an array which keys are
+   *   field names and value is an array with two entries:
+   *   - type: The field type.
+   *   - bundles: The bundles in which the field appears.
+   */
+  public function getFieldMapByFieldType($field_type);
+
+  /**
    * Creates a new access controller instance.
    *
    * @param string $entity_type
diff --git a/core/modules/comment/src/CommentManager.php b/core/modules/comment/src/CommentManager.php
index a4a1170..f8dac54 100644
--- a/core/modules/comment/src/CommentManager.php
+++ b/core/modules/comment/src/CommentManager.php
@@ -114,30 +114,13 @@ public function getFields($entity_type_id) {
       return array();
     }
 
-    $map = $this->getAllFields();
+    $map = $this->entityManager->getFieldMapByFieldType('comment');
     return isset($map[$entity_type_id]) ? $map[$entity_type_id] : array();
   }
 
   /**
    * {@inheritdoc}
    */
-  public function getAllFields() {
-    $map = $this->entityManager->getFieldMap();
-    // Build a list of comment fields only.
-    $comment_fields = array();
-    foreach ($map as $entity_type => $data) {
-      foreach ($data as $field_name => $field_info) {
-        if ($field_info['type'] == 'comment') {
-          $comment_fields[$entity_type][$field_name] = $field_info;
-        }
-      }
-    }
-    return $comment_fields;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function addDefaultField($entity_type, $bundle, $field_name = 'comment', $default_value = CommentItemInterface::OPEN, $comment_type_id = 'comment') {
     $comment_type_storage = $this->entityManager->getStorage('comment_type');
     if ($comment_type = $comment_type_storage->load($comment_type_id)) {
diff --git a/core/modules/comment/src/CommentManagerInterface.php b/core/modules/comment/src/CommentManagerInterface.php
index d16dc4f..fc35ddb 100644
--- a/core/modules/comment/src/CommentManagerInterface.php
+++ b/core/modules/comment/src/CommentManagerInterface.php
@@ -44,11 +44,6 @@
   public function getFields($entity_type_id);
 
   /**
-   * Utility function to return all comment fields.
-   */
-  public function getAllFields();
-
-  /**
    * Utility method to add the default comment field to an entity.
    *
    * Attaches a comment field named 'comment' to the given entity type and
diff --git a/core/modules/comment/tests/src/CommentManagerTest.php b/core/modules/comment/tests/src/CommentManagerTest.php
new file mode 100644
index 0000000..27c03a1
--- /dev/null
+++ b/core/modules/comment/tests/src/CommentManagerTest.php
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\comment\Tests\CommentManagerTest.
+ */
+
+namespace Drupal\comment\Tests;
+
+use Drupal\comment\CommentManager;
+use Drupal\Tests\UnitTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\comment\CommentManager
+ * @group comment
+ */
+class CommentManagerTest extends UnitTestCase {
+
+  /**
+   * Tests the getFields method.
+   *
+   * @covers ::getFields()
+   */
+  public function testGetFields() {
+    // Set up a content entity type.
+    $entity_type = $this->getMock('Drupal\Core\Entity\ContentEntityTypeInterface');
+    $entity_type->expects($this->any())
+      ->method('getClass')
+      ->will($this->returnValue('Node'));
+    $entity_type->expects($this->any())
+      ->method('isSubclassOf')
+      ->with('\Drupal\Core\Entity\ContentEntityInterface')
+      ->will($this->returnValue(TRUE));
+
+    $entity_manager = $this->getMockBuilder('Drupal\Core\Entity\EntityManager')
+      ->disableOriginalConstructor()
+      ->setMethods(array('getFieldMap', 'getDefinition'))
+      ->getMock();
+
+    $entity_manager->expects($this->once())
+      ->method('getFieldMap')
+      ->will($this->returnValue(array(
+        'node' => array(
+          'field_foobar' => array(
+            'type' => 'comment',
+          ),
+          'field_fuzzball' => array(
+            'type' => 'string',
+          ),
+        ),
+      )));
+
+    $entity_manager->expects($this->any())
+      ->method('getDefinition')
+      ->will($this->returnValue($entity_type));
+
+    $comment_manager = new CommentManager(
+      $entity_manager,
+      $this->getMockBuilder('Drupal\Core\Entity\Query\QueryFactory')->disableOriginalConstructor()->getMock(),
+      $this->getMock('Drupal\Core\Config\ConfigFactoryInterface'),
+      $this->getMock('Drupal\Core\StringTranslation\TranslationInterface'),
+      $this->getMock('Drupal\Core\Routing\UrlGeneratorInterface'),
+      $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface'),
+      $this->getMock('Drupal\Core\Session\AccountInterface')
+    );
+    // First call with prime the static cache.
+    $comment_fields = $comment_manager->getFields('node');
+    // Should not trigger EntityManager::getFieldMap().
+    $cached_comment_fields = $comment_manager->getFields('node');
+    $this->assertSame($cached_comment_fields, $comment_fields);
+    $this->assertArrayHasKey('field_foobar', $comment_fields);
+    $this->assertArrayNotHasKey('field_fuzzball', $comment_fields);
+  }
+
+}
