diff --git a/commerce.module b/commerce.module
index 1b24ca7..5e56be5 100644
--- a/commerce.module
+++ b/commerce.module
@@ -94,12 +94,26 @@ function commerce_system_info_alter(&$info, $file, $type) {
 function commerce_info_fields($field_type, $entity_type = NULL) {
   $fields = array();

-  // Loop through the fields looking for any fields of the specified type.
-  foreach (field_info_fields() as $field_name => $field) {
-    if ($field['type'] == $field_type) {
-      // Add this field to the return array if no entity type was specified or
-      // if the specified type exists in the field's bundles array.
-      if (empty($entity_type) || in_array($entity_type, array_keys($field['bundles']))) {
+  // If the entity type is known, only the fields attached to its bundles are
+  // examined. That allows us to avoid loading all fields in the system, which
+  // can have a significant memory & CPU cost.
+  if ($entity_type) {
+    $info = entity_get_info($entity_type);
+    $bundles = array_keys($info['bundles']);
+
+    foreach ($bundles as $bundle) {
+      foreach (field_info_instances($entity_type, $bundle) as $field_name => $instance) {
+        $field = field_info_field($field_name);
+
+        if ($field['type'] == $field_type) {
+          $fields[$field_name] = $field;
+        }
+      }
+    }
+  }
+  else {
+    foreach (field_info_fields() as $field_name => $field) {
+      if ($field['type'] == $field_type) {
         $fields[$field_name] = $field;
       }
     }
diff --git a/modules/customer/commerce_customer.module b/modules/customer/commerce_customer.module
index 51b774d..2f310ec 100644
--- a/modules/customer/commerce_customer.module
+++ b/modules/customer/commerce_customer.module
@@ -997,9 +997,10 @@ function commerce_customer_field_widget_form(&$form, &$form_state, $field, $inst
       // is only one on this profile.
       $addressfields = array();

-      foreach (commerce_info_fields('addressfield', 'commerce_customer_profile') as $field_name => $field) {
-        // First make sure this addressfield is part of the current profile.
-        if (!empty($element['profiles'][$key][$field_name]['#language'])) {
+      foreach (field_info_instances('commerce_customer_profile', $profile->type) as $field_name => $instance) {
+        $field = field_info_field($field_name);
+
+        if ($field['type'] == 'addressfield') {
           $langcode = $element['profiles'][$key][$field_name]['#language'];

           // Only consider this addressfield if it's represented on the form.
diff --git a/modules/order/commerce_order.module b/modules/order/commerce_order.module
index a14307d..4e480e3 100644
--- a/modules/order/commerce_order.module
+++ b/modules/order/commerce_order.module
@@ -457,7 +465,7 @@ function commerce_order_field_attach_form($entity_type, $entity, &$form, &$form_
  */
 function commerce_order_commerce_customer_profile_can_delete($profile) {
   // Look for any non-cart order with a reference field targeting the profile.
-  foreach (commerce_info_fields('commerce_customer_profile_reference') as $field_name => $field) {
+  foreach (commerce_info_fields('commerce_customer_profile_reference', 'commerce_order') as $field_name => $field) {
     // Use EntityFieldQuery to look for orders referencing this customer profile
     // and do not allow the delete to occur if one exists.
     $query = new EntityFieldQuery();
diff --git a/modules/price/commerce_price.module b/modules/price/commerce_price.module
index b7c959e..84d7aa9 100644
--- a/modules/price/commerce_price.module
+++ b/modules/price/commerce_price.module
@@ -114,14 +114,13 @@ function _commerce_price_get_price_fields($entity_type, $entity) {
   // Determine the list of instances to iterate on.
   list(, , $bundle) = entity_extract_ids($entity_type, $entity);
   $instances = field_info_instances($entity_type, $bundle);
-  $fields = field_info_fields();

   // Iterate through the instances and collect results.
-  foreach ($instances as $instance) {
-    $field_name = $instance['field_name'];
+  foreach ($instances as $field_name => $instance) {
+    $field = field_info_field($field_name);

     // If the instance is a price field with data...
-    if ($fields[$field_name]['type'] == 'commerce_price' && isset($entity->{$field_name})) {
+    if ($field['type'] == 'commerce_price' && isset($entity->{$field_name})) {
       $commerce_price_fields[] = $field_name;
     }
   }
diff --git a/modules/product_reference/commerce_product_reference.module b/modules/product_reference/commerce_product_reference.module
index db63353..6833ba8 100644
--- a/modules/product_reference/commerce_product_reference.module
+++ b/modules/product_reference/commerce_product_reference.module
@@ -25,70 +25,63 @@ function commerce_product_reference_commerce_product_uri($product) {
  */
 function commerce_product_reference_field_extra_fields() {
   $extra = array();
+  $node_types = commerce_product_reference_node_types();

   // Loop through the product reference fields.
-  foreach (commerce_info_fields('commerce_product_reference') as $field_name => $field) {
-    foreach ($field['bundles'] as $entity_type => $bundles) {
-      if ($entity_type == 'commerce_line_item' || $entity_type == 'commerce_product') {
-        // We do not currently support the injection of product fields into the
-        // display of line items or other products.
+  foreach (commerce_info_fields('commerce_product_reference', 'node') as $field_name => $field) {
+    foreach ($field['bundles']['node'] as $bundle_name) {
+      // Get the instance settings for the field on this entity bundle.
+      $instance = field_info_instance('node', $field['field_name'], $bundle_name);
+
+      // If field injection is turned off for this instance, skip adding the
+      // extra fields to this bundle's view modes.
+      if (empty($instance['settings']['field_injection'])) {
         continue;
       }

-      foreach ($bundles as $bundle_name) {
-        // Get the instance settings for the field on this entity bundle.
-        $instance_settings = field_info_instance($entity_type, $field['field_name'], $bundle_name);
-
-        // If field injection is turned off for this instance, skip adding the
-        // extra fields to this bundle's view modes.
-        if (empty($instance_settings['settings']['field_injection'])) {
-          continue;
-        }
+      // Attach extra fields from products that may be visible on the bundle.
+      // We have to call commerce_product_field_extra_fields() directly
+      // instead of using field_info_extra_fields() because of the order in
+      // which these items are rebuilt in the cache for use by "Manage
+      // display" tabs. Otherwise these extra fields will not appear.
+      $product_fields = commerce_product_field_extra_fields();

-        // Attach extra fields from products that may be visible on the bundle.
-        // We have to call commerce_product_field_extra_fields() directly
-        // instead of using field_info_extra_fields() because of the order in
-        // which these items are rebuilt in the cache for use by "Manage
-        // display" tabs. Otherwise these extra fields will not appear.
-        $product_fields = commerce_product_field_extra_fields();
-
-        // Prevent notices if there are no product types defined.
-        if (empty($product_fields['commerce_product'])) {
-          continue;
-        }
+      // Prevent notices if there are no product types defined.
+      if (empty($product_fields['commerce_product'])) {
+        continue;
+      }

-        foreach ($product_fields['commerce_product'] as $key => $value) {
-          foreach ($value['display'] as $product_extra_field_name => $product_extra_field) {
-            $product_extra_field['label'] = t('Product: @label', array('@label' => $product_extra_field['label']));
+      foreach ($product_fields['commerce_product'] as $key => $value) {
+        foreach ($value['display'] as $product_extra_field_name => $product_extra_field) {
+          $product_extra_field['label'] = t('Product: @label', array('@label' => $product_extra_field['label']));

-            $product_extra_field['display']['default'] = array(
-              'weight' => 0,
-              'visible' => FALSE,
-            );
+          $product_extra_field['display']['default'] = array(
+            'weight' => 0,
+            'visible' => FALSE,
+          );

-            $extra[$entity_type][$bundle_name]['display']['product:' . $product_extra_field_name] = $product_extra_field;
-          }
+          $extra['node'][$bundle_name]['display']['product:' . $product_extra_field_name] = $product_extra_field;
         }
+      }

-        // Do the same for fields on products that may be visible on the bundle.
-        // First build a list of product types that may be referenced.
-        $field_instance = field_info_instance($entity_type, $field_name, $bundle_name);
-        $product_types = array_filter($field_instance['settings']['referenceable_types']);
+      // Do the same for fields on products that may be visible on the bundle.
+      // First build a list of product types that may be referenced.
+      $field_instance = field_info_instance('node', $field_name, $bundle_name);
+      $product_types = array_filter($field_instance['settings']['referenceable_types']);

-        // If no product types are specified, use all product types.
-        if (empty($product_types)) {
-          $product_types = array_keys(commerce_product_types());
-        }
+      // If no product types are specified, use all product types.
+      if (empty($product_types)) {
+        $product_types = array_keys(commerce_product_types());
+      }

-        foreach ($product_types as $product_type) {
-          foreach (field_info_instances('commerce_product', $product_type) as $product_field_name => $product_field) {
-            $extra[$entity_type][$bundle_name]['display']['product:' . $product_field_name] = array(
-              'label' => t('Product: @label', array('@label' => $product_field['label'])),
-              'description' => t('Field from a referenced product.'),
-              'weight' => $product_field['widget']['weight'],
-              'configurable' => TRUE,
-            );
-          }
+      foreach ($product_types as $product_type) {
+        foreach (field_info_instances('commerce_product', $product_type) as $product_field_name => $product_field) {
+          $extra['node'][$bundle_name]['display']['product:' . $product_field_name] = array(
+            'label' => t('Product: @label', array('@label' => $product_field['label'])),
+            'description' => t('Field from a referenced product.'),
+            'weight' => $product_field['widget']['weight'],
+            'configurable' => TRUE,
+          );
         }
       }
     }
@@ -1227,10 +1220,12 @@ function commerce_product_reference_property_info_callback(&$info, $entity_type,
 function commerce_product_reference_node_types() {
   $list = array();
   $types = node_type_get_types();
-  foreach (field_info_fields() as $field_name => $field) {
-    if ($field['type'] == 'commerce_product_reference' && !empty($field['bundles']['node'])) {
-      foreach($field['bundles']['node'] as $bundle) {
-        $list[$bundle] = $types[$bundle];
+  foreach ($types as $type_name => $type) {
+    foreach (field_info_instances('node', $type_name) as $field_name => $instance) {
+      $field = field_info_field($field_name);
+
+      if ($field['type'] == 'commerce_product_reference') {
+        $list[$type_name] = $type;
       }
     }
   }
