diff --git a/core/includes/common.inc b/core/includes/common.inc
index 47e9f95..647f030 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -5027,6 +5027,13 @@ function drupal_page_set_cache($body) {
  *   TRUE if cron ran successfully.
  */
 function drupal_cron_run() {
+
+  // If cron debug is enabled, start timer.
+  $cron_timer = config('system.cron')->get('timer');
+  if ($cron_timer) {
+    timer_start('cron');
+  }
+
   // Allow execution to continue even if the request gets canceled.
   @ignore_user_abort(TRUE);
 
@@ -5067,16 +5074,35 @@ function drupal_cron_run() {
     foreach (module_implements('cron') as $module) {
       // Do not let an exception thrown by one module disturb another.
       try {
-        module_invoke($module, 'cron');
+        // If we have the timer enabled, time the functions.
+        if ($cron_timer) {
+          timer_start($module);
+          module_invoke($module, 'cron');
+          $function_time = timer_stop($module);
+          $function_time_rounded = round($function_time['time']/1000, 4);
+          watchdog('cron', 'Cron time elapsed for @module is @secs seconds.', array('@module' => $module, '@secs' => $function_time_rounded), WATCHDOG_NOTICE);
+        }
+        else {
+          module_invoke($module, 'cron');
+        }
       }
       catch (Exception $e) {
         watchdog_exception('cron', $e);
       }
     }
 
+    if ($cron_timer) {
+      $cron_time = timer_stop('cron');
+      $cron_time_rounded = round($cron_time['time']/1000, 4);
+    }
+
     // Record cron time.
     variable_set('cron_last', REQUEST_TIME);
-    watchdog('cron', 'Cron run completed.', array(), WATCHDOG_NOTICE);
+    if ($cron_timer) {
+      watchdog('cron', 'Cron run completed in @time seconds', array('@time' => $cron_time_rounded));
+    } else {
+      watchdog('cron', 'Cron run completed.', array(), WATCHDOG_NOTICE);
+    }
 
     // Release cron lock.
     lock()->release('cron');
diff --git a/core/modules/system/config/system.cron.yml b/core/modules/system/config/system.cron.yml
index b9a5096..127269d 100644
--- a/core/modules/system/config/system.cron.yml
+++ b/core/modules/system/config/system.cron.yml
@@ -3,3 +3,4 @@ threshold:
   autorun: '10800'
   requirements_warning: '172800'
   requirements_error: '1209600'
+timer: 0
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index c55289c..4f1462d 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -1515,6 +1515,7 @@ function system_cron_settings($form, &$form_state) {
   $form['cron'] = array(
     '#type' => 'fieldset',
   );
+
   $form['cron']['cron_safe_threshold'] = array(
     '#type' => 'select',
     '#title' => t('Run cron every'),
@@ -1522,6 +1523,13 @@ function system_cron_settings($form, &$form_state) {
     '#options' => array(0 => t('Never')) + drupal_map_assoc(array(3600, 10800, 21600, 43200, 86400, 604800), 'format_interval'),
   );
 
+  $form['cron']['cron_timer'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Log cron run times'),
+    '#default_value' => config('system.cron')->get('timer'),
+    '#description' => 'Run times of individual cron jobs will be written to watchdog',
+  );
+
   return system_config_form($form, $form_state);
 }
 
@@ -1533,6 +1541,7 @@ function system_cron_settings($form, &$form_state) {
 function system_cron_settings_submit($form, &$form_state) {
   config('system.cron')
     ->set('threshold.autorun', $form_state['values']['cron_safe_threshold'])
+    ->set('timer', $form_state['values']['cron_timer'])
     ->save();
 }
 
