diff --git a/views_bulk_operations.module b/views_bulk_operations.module
index eebc024..a626ea2 100644
--- a/views_bulk_operations.module
+++ b/views_bulk_operations.module
@@ -539,7 +539,7 @@ function views_bulk_operations_form_submit($form, &$form_state) {
     $form_state['storage'][VIEWS_BULK_OPS_STEP_VIEW]['objects']['selection'], 
     $operation, 
     $operation_arguments,
-    array('execution_type' => $plugin->options['execution_type'], 'display_result' => $plugin->options['display_result'], 'settings' => $plugin->get_operation_settings($operation))
+    array('execution_type' => $plugin->options['execution_type'], 'display_result' => $plugin->options['display_result'], 'max_performance' => $plugin->options['max_performance'], 'settings' => $plugin->get_operation_settings($operation))
   );
 
   // Clean up the form.
@@ -583,25 +583,37 @@ function _views_bulk_operations_execute($view, $objects, $operation, $operation_
     variable_set('actions_max_stack', 10000000);
   }
   if ($operation['aggregate'] != VBO_AGGREGATE_FORCED && $options['execution_type'] == VBO_EXECUTION_BATCH) {
-    $operations = array();
-    foreach ($objects as $num => $row) {
-      $oid = $row->{$view->base_field};
-      $operations[] = array('_views_bulk_operations_batch_process', array($oid, $row));
+    
+    // If they have max performance checked, use the high performant batch process.
+    if( $options['max_performance'] ) {
+      $batch = array(
+        'finished' => '_views_bulk_operations_batch_finished',
+        'title' => t('Performing %action on selected rows...', array('%action' => $operation['label'])),
+      );  
+      $batch['operations'][] = array('_views_bulk_operations_direct_process', array($view->base_field, $operation, $objects, $params, $object_info, TRUE));
+      batch_set($batch);
     }
+    else {
+      $operations = array();
+      foreach ($objects as $num => $row) {
+        $oid = $row->{$view->base_field};
+        $operations[] = array('_views_bulk_operations_batch_process', array($oid, $row));
+      }
 
-    // Save the options in the session because Batch API doesn't give a way to 
-    // send a parameter to the finished callback.
-    $_SESSION['vbo_options']['display_result'] = $options['display_result'];
-    $_SESSION['vbo_options']['operation'] = $operation;
-    $_SESSION['vbo_options']['params'] = $params;
-    $_SESSION['vbo_options']['object_info'] = $object_info;
-
-    $batch = array(
-      'operations' => $operations,
-      'finished' => '_views_bulk_operations_batch_finished',
-      'title' => t('Performing %action on selected rows...', array('%action' => $operation['label'])),
-    );  
-    batch_set($batch);
+      // Save the options in the session because Batch API doesn't give a way to 
+      // send a parameter to the finished callback.
+      $_SESSION['vbo_options']['display_result'] = $options['display_result'];
+      $_SESSION['vbo_options']['operation'] = $operation;
+      $_SESSION['vbo_options']['params'] = $params;
+      $_SESSION['vbo_options']['object_info'] = $object_info;
+
+      $batch = array(
+        'operations' => $operations,
+        'finished' => '_views_bulk_operations_batch_finished',
+        'title' => t('Performing %action on selected rows...', array('%action' => $operation['label'])),
+      );  
+      batch_set($batch);
+    }
   }
   else if ($operation['aggregate'] != VBO_AGGREGATE_FORCED && module_exists('job_queue') && $options['execution_type'] == VBO_EXECUTION_QUEUE) {
     global $user;
@@ -632,7 +644,7 @@ function _views_bulk_operations_execute($view, $objects, $operation, $operation_
     $context['results']['rows'] = 0;
     $context['results']['time'] = microtime(TRUE);
 
-    _views_bulk_operations_direct_process($view, $operation, $objects, $params, $object_info, $context);
+    _views_bulk_operations_direct_process($view->base_field, $operation, $objects, $params, $object_info, FALSE, $context);
     _views_bulk_operations_direct_finished(TRUE, $context['results'], array(), $options['display_result']);
   }
 }
@@ -707,18 +719,22 @@ function _views_bulk_operations_batch_process($oid, $row, &$context) {
     return;
   }
 
-  _views_bulk_operations_action_do($operation, $oid, $object, $row, $params, $object_info);
+  // Loop until we start to run our of resources.  This will improve performance significantly for 
+  // batch operations.
+  while( _views_bulk_operations_batch_continue() ) {
+    _views_bulk_operations_action_do($operation, $oid, $object, $row, $params, $object_info);
 
-  $context['results']['log'][] = t('Performed %action on @type %title.', array(
-    '%action' => $operation['label'], 
-    '@type' => t($object_info['type']),
-    '%title' => $object->{$object_info['title']},
-  ));
-  if (isset($context['results']['rows'])) {
-    $context['results']['rows'] += 1;
-  }
-  else {
-    $context['results']['rows'] = 1;
+    $context['results']['log'][] = t('Performed %action on @type %title.', array(
+      '%action' => $operation['label'], 
+      '@type' => t($object_info['type']),
+      '%title' => $object->{$object_info['title']},
+    ));
+    if (isset($context['results']['rows'])) {
+      $context['results']['rows'] += 1;
+    }
+    else {
+      $context['results']['rows'] = 1;
+    }
   }
 }
 
@@ -753,12 +769,74 @@ function _views_bulk_operations_batch_finished($success, $results, $operations,
 }
 
 /**
+ * Get's the next item in the loop taking into consideration server limits for high performance batching.
+ *
+ * @return - The next object in the objects array.
+ */
+function _views_bulk_operations_next( $index, $objects, $batch ) {
+  static $loop = 0, $last_mem = -1, $last_time = 0, $memory_limit = 0, $time_limit = 0;
+
+  // Get the array keys.
+  $keys = array_keys($objects);
+  
+  if( $batch ) {
+    // Keep track of how many loops we have taken.
+    $loop++;
+    
+    // Memory limit in bytes.
+    $memory_limit = $memory_limit ? $memory_limit : ((int)preg_replace('/[^\d\s]/', '', ini_get('memory_limit'))) * 1048576;
+
+    // Max time execution limit.
+    $time_limit = $time_limit ? $time_limit : (int)ini_get('max_execution_time');
+
+    // Current execution time in seconds.
+    $current_time = time() - $_SERVER['REQUEST_TIME'];
+    $time_left = $time_limit - $current_time;
+
+    if ($loop == 1) {
+      $last_time = $current_time;
+      // Never break the first loop.
+      return $objects[$keys[$index]];
+    }
+
+    // Break when current free memory past threshold.  Default to 32 MB.
+    if (($memory_limit - memory_get_usage()) < variable_get('batch_free_memory_threshold', 33554432)) {
+      return FALSE;
+    }
+
+    // Break when peak free memory past threshold.  Default to 8 MB.
+    if (($memory_limit - memory_get_peak_usage()) < variable_get('batch_peak_free_memory_threshold', 8388608)) {
+      return $objects[$keys[$index]];
+    }
+
+    // Break when execution time remaining past threshold.  Default to 15 sec.
+    if (($time_limit - $current_time) < variable_get('batch_time_remaining_threshold', 15)) {
+      return FALSE;
+    }
+
+    $last_time = $current_time;
+    return $objects[$keys[$index]];  
+  }
+  else {
+    return $objects[$keys[$index]];
+  }
+}
+
+/**
  * Helper function for direct execution operations.
  */
-function _views_bulk_operations_direct_process($view, $operation, $objects, $params, $object_info, &$context) {
+function _views_bulk_operations_direct_process($base_field, $operation, $objects, $params, $object_info, $batch, &$context) {
+
+  // Setup our batch process.
+  if (empty($context['sandbox'])) {
+    $context['sandbox']['progress'] = 0;
+    $context['sandbox']['max'] = count($objects);
+  }  
+  
   if ($operation['aggregate'] != VBO_AGGREGATE_FORBIDDEN) {
-    foreach ($objects as $num => $row) {
-      $oid = $row->{$view->base_field};
+    while( $row = _views_bulk_operations_next($context['sandbox']['progress'], $objects, $batch) ) {
+      $context['sandbox']['progress']++;
+      $oid = $row->{$base_field};
       if (isset($object_info['access'])) {
         $object = call_user_func($object_info['load'], $oid);
         if (!$object) {
@@ -794,35 +872,42 @@ function _views_bulk_operations_direct_process($view, $operation, $objects, $par
       $context['results']['rows'] += count($objects);
     }
   }
-  else foreach ($objects as $num => $row) {
-    $oid = $row->{$view->base_field};
-    $object = call_user_func($object_info['load'], $oid);
-    if (!$object) {
-      $context['results']['log'][] = t('Skipped %action on @type id %oid.', array(
-        '%action' => $operation['label'],
-        '@type' => t($operation['type']),
-        '%oid' => $oid,
-      ));
-      continue;
-    }
-    if (!_views_bulk_operations_object_permission($operation, $object, $object_info)) {
-      $context['results']['log'][] = t('Skipped %action on @type %title due to insufficient permissions.', array(
+  else {
+    $index = 0;
+    while( $row = _views_bulk_operations_next($context['sandbox']['progress'], $objects, $batch) ) {
+      $context['sandbox']['progress']++;
+      $oid = $row->{$base_field};
+      $object = call_user_func($object_info['load'], $oid);
+      if (!$object) {
+        $context['results']['log'][] = t('Skipped %action on @type id %oid.', array(
+          '%action' => $operation['label'],
+          '@type' => t($operation['type']),
+          '%oid' => $oid,
+        ));
+        continue;
+      }
+      if (!_views_bulk_operations_object_permission($operation, $object, $object_info)) {
+        $context['results']['log'][] = t('Skipped %action on @type %title due to insufficient permissions.', array(
+          '%action' => $operation['label'], 
+          '@type' => t($object_info['type']),
+          '%title' => $object->{$object_info['title']},
+        ));
+        continue;
+      }
+
+      _views_bulk_operations_action_do($operation, $oid, $object, $row, $params, $object_info);
+
+      $context['results']['log'][] = t('Performed %action on @type %title.', array(
         '%action' => $operation['label'], 
         '@type' => t($object_info['type']),
         '%title' => $object->{$object_info['title']},
       ));
-      continue;
+      $context['results']['rows'] += 1;
     }
-   
-    _views_bulk_operations_action_do($operation, $oid, $object, $row, $params, $object_info);
-    
-    $context['results']['log'][] = t('Performed %action on @type %title.', array(
-      '%action' => $operation['label'], 
-      '@type' => t($object_info['type']),
-      '%title' => $object->{$object_info['title']},
-    ));
-    $context['results']['rows'] += 1;
   }
+  
+  // Update batch progress.
+  $context['finished'] = empty($context['sandbox']['max']) ? 1 : ($context['sandbox']['progress'] / $context['sandbox']['max']);     
 }
 
 /**
diff --git a/views_bulk_operations_plugin_style.inc b/views_bulk_operations_plugin_style.inc
index 9f514d2..2478991 100644
--- a/views_bulk_operations_plugin_style.inc
+++ b/views_bulk_operations_plugin_style.inc
@@ -10,6 +10,7 @@ class views_bulk_operations_plugin_style extends views_plugin_style_table {
 
     $options['selected_operations'] = array('default' => array());
     $options['execution_type'] = array('default' => VBO_EXECUTION_DIRECT);
+    $options['max_performance'] = array('default' => 0);
     $options['display_type'] = array('default' => 0);
     $options['skip_confirmation'] = array('default' => FALSE);
     $options['display_result'] = array('default' => TRUE);
@@ -47,6 +48,12 @@ class views_bulk_operations_plugin_style extends views_plugin_style_table {
       '#default_value' => $this->options['execution_type'],
       '#options' => $execution,
     );
+    $form['max_performance'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Maximize Batch Performance'),
+      '#description' => t('If checked, each batch process will execute as many rows as possible within the server resource limits.'),
+      '#default_value' => $this->options['max_performance'],
+    );    
     $form['display_type'] = array(
       '#type' => 'radios',
       '#title' => t('Display operations as'),
