123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <?php
- /**
- * @package Kohana/Codebench
- * @category Tests
- * @author Woody Gilk <woody.gilk@kohanaphp.com>
- */
- class Bench_DateSpan extends Codebench {
- public $description =
- 'Optimization for <code>Date::span()</code>.';
- public $loops = 1000;
- public $subjects = [];
- public function __construct()
- {
- parent::__construct();
- $this->subjects = [
- time(),
- time() - Date::MONTH,
- time() - Date::YEAR,
- time() - Date::YEAR * 10,
- ];
- }
- // Original method
- public static function bench_span_original($remote, $local = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds')
- {
- // Array with the output formats
- $output = preg_split('/[^a-z]+/', strtolower( (string) $output));
- // Invalid output
- if (empty($output))
- return FALSE;
- // Make the output values into keys
- extract(array_flip($output), EXTR_SKIP);
- if ($local === NULL)
- {
- // Calculate the span from the current time
- $local = time();
- }
- // Calculate timespan (seconds)
- $timespan = abs($remote - $local);
- if (isset($years))
- {
- $timespan -= Date::YEAR * ($years = (int) floor($timespan / Date::YEAR));
- }
- if (isset($months))
- {
- $timespan -= Date::MONTH * ($months = (int) floor($timespan / Date::MONTH));
- }
- if (isset($weeks))
- {
- $timespan -= Date::WEEK * ($weeks = (int) floor($timespan / Date::WEEK));
- }
- if (isset($days))
- {
- $timespan -= Date::DAY * ($days = (int) floor($timespan / Date::DAY));
- }
- if (isset($hours))
- {
- $timespan -= Date::HOUR * ($hours = (int) floor($timespan / Date::HOUR));
- }
- if (isset($minutes))
- {
- $timespan -= Date::MINUTE * ($minutes = (int) floor($timespan / Date::MINUTE));
- }
- // Seconds ago, 1
- if (isset($seconds))
- {
- $seconds = $timespan;
- }
- // Remove the variables that cannot be accessed
- unset($timespan, $remote, $local);
- // Deny access to these variables
- $deny = array_flip(['deny', 'key', 'difference', 'output']);
- // Return the difference
- $difference = [];
- foreach ($output as $key)
- {
- if (isset($$key) AND ! isset($deny[$key]))
- {
- // Add requested key to the output
- $difference[$key] = $$key;
- }
- }
- // Invalid output formats string
- if (empty($difference))
- return FALSE;
- // If only one output format was asked, don't put it in an array
- if (count($difference) === 1)
- return current($difference);
- // Return array
- return $difference;
- }
- // Using an array for the output
- public static function bench_span_use_array($remote, $local = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds')
- {
- // Array with the output formats
- $output = preg_split('/[^a-z]+/', strtolower( (string) $output));
- // Invalid output
- if (empty($output))
- return FALSE;
- // Convert the list of outputs to an associative array
- $output = array_combine($output, array_fill(0, count($output), 0));
- // Make the output values into keys
- extract(array_flip($output), EXTR_SKIP);
- if ($local === NULL)
- {
- // Calculate the span from the current time
- $local = time();
- }
- // Calculate timespan (seconds)
- $timespan = abs($remote - $local);
- if (isset($output['years']))
- {
- $timespan -= Date::YEAR * ($output['years'] = (int) floor($timespan / Date::YEAR));
- }
- if (isset($output['months']))
- {
- $timespan -= Date::MONTH * ($output['months'] = (int) floor($timespan / Date::MONTH));
- }
- if (isset($output['weeks']))
- {
- $timespan -= Date::WEEK * ($output['weeks'] = (int) floor($timespan / Date::WEEK));
- }
- if (isset($output['days']))
- {
- $timespan -= Date::DAY * ($output['days'] = (int) floor($timespan / Date::DAY));
- }
- if (isset($output['hours']))
- {
- $timespan -= Date::HOUR * ($output['hours'] = (int) floor($timespan / Date::HOUR));
- }
- if (isset($output['minutes']))
- {
- $timespan -= Date::MINUTE * ($output['minutes'] = (int) floor($timespan / Date::MINUTE));
- }
- // Seconds ago, 1
- if (isset($output['seconds']))
- {
- $output['seconds'] = $timespan;
- }
- if (count($output) === 1)
- {
- // Only a single output was requested, return it
- return array_pop($output);
- }
- // Return array
- return $output;
- }
- }
|