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/customer/includes/commerce_customer.checkout_pane.inc b/modules/customer/includes/commerce_customer.checkout_pane.inc
index b725720..bea1177 100644
--- a/modules/customer/includes/commerce_customer.checkout_pane.inc
+++ b/modules/customer/includes/commerce_customer.checkout_pane.inc
@@ -175,8 +175,10 @@ function commerce_customer_profile_pane_checkout_form($form, &$form_state, $chec
   // is only one on this profile.
   $addressfields = array();
 
-  foreach (commerce_info_fields('addressfield', 'commerce_customer_profile') as $field_name => $field) {
-    if (!empty($pane_form[$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 = $pane_form[$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
@@ -412,20 +412,28 @@ function commerce_order_commerce_order_status_info() {
  * from that order's edit form.
  */
 function commerce_order_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
-  // If this is an order edit form...
   if ($entity_type == 'commerce_order') {
-    // Get an array of customer profile reference fields attached to products.
-    $fields = commerce_info_fields('commerce_customer_profile_reference', 'commerce_order');
-
-    // Loop over each child element of the form.
-    foreach (element_children($form) as $key) {
-      // If the current element is for a customer profile reference field...
-      if (in_array($key, array_keys($fields))) {
-        // Loop over each of its child items...
-        foreach (element_children($form[$key][$form[$key]['#language']]) as $delta) {
-          foreach (element_children($form[$key][$form[$key]['#language']][$delta]) as $subdelta) {
+    // Get the names of all customer profile reference fields attached to the
+    // current order type.
+    $fields = array();
+    foreach (field_info_instances('commerce_order', $entity->type) as $field_name => $instance) {
+      $field = field_info_field($field_name);
+
+      if ($field['type'] == 'commerce_customer_profile_reference') {
+        $fields[] = $field_name;
+      }
+    }
+
+    foreach ($fields as $field_name) {
+      // The current customer profile reference field has a form element, go
+      // through its child items.
+      if (isset($form[$field_name])) {
+        $field_language = $form[$field_name]['#language'];
+
+        foreach (element_children($form[$field_name][$field_language]) as $delta) {
+          foreach (element_children($form[$field_name][$field_language][$delta]) as $subdelta) {
             // Extract the customer profile from the widget form element.
-            $profile = $form[$key][$form[$key]['#language']][$delta][$subdelta]['profile']['#value'];
+            $profile = $form[$field_name][$field_language][$delta][$subdelta]['profile']['#value'];
 
             // Add the order context to the profile stored in the field element.
             $profile->entity_context = array(
@@ -441,9 +449,9 @@ function commerce_order_field_attach_form($entity_type, $entity, &$form, &$form_
             // If this means this profile can now be deleted and the reference
             // field widget includes a remove element...
             if ($profile->profile_id && commerce_customer_profile_can_delete($profile) &&
-              !empty($form[$key][$form[$key]['#language']][$delta][$subdelta]['remove'])) {
+              !empty($form[$field_name][$field_language][$delta][$subdelta]['remove'])) {
               // Update its remove element's title accordingly.
-              $form[$key][$form[$key]['#language']][$delta][$subdelta]['remove']['#title'] = t('Delete this profile');
+              $form[$field_name][$field_language][$delta][$subdelta]['remove']['#title'] = t('Delete this profile');
             }
           }
         }
@@ -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;
       }
     }
   }
diff --git a/modules/tax/commerce_tax.module b/modules/tax/commerce_tax.module
index 3b660b2..b7478f1 100644
--- a/modules/tax/commerce_tax.module
+++ b/modules/tax/commerce_tax.module
@@ -372,24 +372,30 @@ function commerce_tax_field_attach_form($entity_type, $entity, &$form, &$form_st
       }
     }
 
-    // Get an array of price fields attached to products.
-    $fields = commerce_info_fields('commerce_price', 'commerce_product');
-
-    // Loop over each child element of the form.
-    foreach (element_children($form) as $key) {
-      // If the current element is for a price field...
-      if (in_array($key, array_keys($fields))) {
-        // Loop over each of its child items...
-        foreach (element_children($form[$key][$form[$key]['#language']]) as $delta) {
+    // Get the names of all price fields attached to the current product type.
+    $fields = array();
+    foreach (field_info_instances('commerce_product', $entity->type) as $field_name => $instance) {
+      $field = field_info_field($field_name);
+      if ($field['type'] == 'commerce_price') {
+        $fields[] = $field_name;
+      }
+    }
+
+    foreach ($fields as $field_name) {
+      // The current price field has a form element, go through its child items.
+      if (isset($form[$field_name])) {
+        $field_language = $form[$field_name]['#language'];
+
+        foreach (element_children($form[$field_name][$field_language]) as $delta) {
           if (!empty($options)) {
             // Find the default value for the tax included element.
             $default = '';
 
-            if (!empty($form[$key][$form[$key]['#language']][$delta]['data']['#default_value']['include_tax'])) {
-              $default = $form[$key][$form[$key]['#language']][$delta]['data']['#default_value']['include_tax'];
+            if (!empty($form[$field_name][$field_language][$delta]['data']['#default_value']['include_tax'])) {
+              $default = $form[$field_name][$field_language][$delta]['data']['#default_value']['include_tax'];
             }
 
-            $form[$key][$form[$key]['#language']][$delta]['currency_code']['#title'] = '&nbsp;';
+            $form[$field_name][$field_language][$delta]['currency_code']['#title'] = '&nbsp;';
 
             // Note that because this is a select element, the values in the
             // #options array have not been sanitized. They will be passed
@@ -397,7 +403,7 @@ function commerce_tax_field_attach_form($entity_type, $entity, &$form, &$form_st
             // element is processed. If you alter the type of this element to
             // radios or checkboxes, you are responsible for sanitizing the
             // values of the #options array as well.
-            $form[$key][$form[$key]['#language']][$delta]['include_tax'] = array(
+            $form[$field_name][$field_language][$delta]['include_tax'] = array(
               '#type' => 'select',
               '#title' => t('Include tax in this price'),
               '#description' => t('Saving prices tax inclusive will bypass later calculations for the specified tax.'),
@@ -415,7 +421,7 @@ function commerce_tax_field_attach_form($entity_type, $entity, &$form, &$form_st
           // Append a validation handler to the price field's element validate
           // array to add the included tax price component after the price has
           // been converted from a decimal.
-          $form[$key][$form[$key]['#language']][$delta]['#element_validate'][] = 'commerce_tax_price_field_validate';
+          $form[$field_name][$field_language][$delta]['#element_validate'][] = 'commerce_tax_price_field_validate';
         }
       }
     }
