@ 2014-03-28T16:38:39Z <?php
function extract_docblocks($data) {
$inBlock = false;
$forceNewItem = true;
$currentBlock = array();
$blocks = array();
foreach (preg_split('/[\r\n]+/', $data) as $line) {
$line = trim($line);
if (!$inBlock) {
if ($line === '/**') {
$inBlock = true;
}
continue;
}
if ($line[0] !== '*') {
$inBlock = false;
$forceNewItem = true;
$currentBlock = array();
continue;
}
if ($line === '*/') {
$inBlock = false;
$forceNewItem = true;
$blocks[] = $currentBlock;
$currentBlock = array();
continue;
}
$line = trim(substr($line, 1));
if ($line === '') {
$forceNewItem = true;
} else if ($line[0] === '@' || $forceNewItem) {
$forceNewItem = false;
$currentBlock[] = $line;
} else {
$currentBlock[count($currentBlock) - 1] .= "\n" . $line;
}
}
return $blocks;
}
$str = <<<'CLASS'
<?php
/**
* Class EventLoop
*
* This is not the fastest event loop implementation in the world, at least
* partially because it's been stupidified for PHP4. It's not really for high
* performance asyncSaucezOMG though, so it shouldn't matter.
*/
class EventLoop
{
/**
* @var EventLoopConfig
*/
var $config;
/**
* @var EventLoopLogger
* @access private
*/
var $_logger;
/**
* @var WorkerPoolFactory
*/
var $_workerPoolFactory;
/**
* @var array
* @access private
*/
var $_streamWatchers = array(
'read' => array(
'streams' => array(),
'callbacks' => array(),
),
'write' => array(
'streams' => array(),
'callbacks' => array(),
),
'except' => array(
'streams' => array(),
'callbacks' => array(),
),
);
/**
* @var int
* @access private
*/
var $_streamWatcherCount = 0;
/**
* @var Scheduler
* @access private
*/
var $_scheduler;
/**
* @var WorkerPool
* @access private
*/
var $_dynamicWorkerPool;
/**
* @var WorkerPool
* @access private
*/
var $_dnsWorkerPool;
/**
* @var StreamHandler[]
* @access private
*/
var $_streamHandlers = array();
/**
* @var bool
* @access private
*/
var $_running = false;
/**
* Constructor
*
* @param WorkerPoolFactory $workerPoolFactory
* @param EventLoopConfig $config
* @param EventLoopLogger $logger
* @param SchedulerFactory $schedulerFactory
* @param StreamHandler $socketStreamHandler
*/
function EventLoop(&$workerPoolFactory, &$config, &$logger, &$schedulerFactory, &$socketStreamHandler)
{
$this->config = &$config;
$this->_logger = &$logger;
$this->_workerPoolFactory = &$workerPoolFactory;
$this->_scheduler = &$schedulerFactory->create($this->_logger);
$this->registerStreamHandler($socketStreamHandler, array('tcp', 'udp', 'unix'));
$this->_dynamicWorkerPool = &$workerPoolFactory->create($this, $this->config->workers, $this->_logger, 'Dynamic');
$config->dns->normalizeInheritableProperties($this->config->workers);
$this->_dnsWorkerPool = &$workerPoolFactory->create($this, $this->config->dns, $this->_logger, 'DNS');
}
/**
* Get the current time as a float
*
* @return float
* @access private
*/
function _now()
{
list($usec, $sec) = explode(' ', microtime());
return ((float)$usec + (float)$sec);
}
/**
* Check whether at least one client socket or scheduled item is active
*
* @return bool
* @access private
*/
function _isActive()
{
return $this->_streamWatcherCount || $this->_scheduler->isActive();
}
/**
* Get the time until there is something to do
*
* @return float|null
* @access private
*/
function _getNextActivityTime()
{
$candidates = array();
if (null !== $time = $this->_scheduler->getNextActivityTime()) {
$candidates[] = $time;
}
if (null !== $time = $this->_dynamicWorkerPool->getNextActivityTime()) {
$candidates[] = $time;
}
if (null !== $time = $this->_dnsWorkerPool->getNextActivityTime()) {
$candidates[] = $time;
}
return $candidates ? max(min($candidates), 0) : null;
}
/**
* Sleep until the next scheduled item is due to be executed
*
* @access private
*/
function _awaitNextActivity($timeout)
{
if ($timeout) {
$this->_logger->debug(null, 'Waiting until next scheduled activity, timeout: %f', $timeout);
usleep(floor($timeout * 1000000));
}
}
/**
* Process I/O on all active streams
*
* @access private
*/
function _processStreams($timeout)
{
$streams = array(
'read' => $this->_streamWatchers['read']['streams'],
'write' => $this->_streamWatchers['write']['streams'],
'except' => $this->_streamWatchers['except']['streams'],
);
if ($timeout !== null) {
$secs = floor($timeout);
$usecs = floor(($timeout - $secs) * 1000000);
} else {
$secs = $usecs = null;
}
$this->_logger->debug(
null, 'select() watching %d streams for activity (read: %d, write: %d, except: %d), timeout: %s',
count($streams['read']) + count($streams['write']) + count($streams['except']),
count($streams['read']), count($streams['write']), count($streams['except']),
$secs === null ? 'NULL' : "{$secs}s {$usecs}u"
);
$count = stream_select($streams['read'], $streams['write'], $streams['except'], $secs, $usecs);
if ($count === false) {
$this->_logger->error(null, 'select() operation failed!');
exit(1);
} else if ($count === 0) {
$this->_logger->debug(null, 'select() returned 0 streams with activity');
return;
}
$this->_logger->debug(
null, 'select() returned %d streams with activity (read: %d, write: %d, except: %d)',
$count, count($streams['read']), count($streams['write']), count($streams['except'])
);
foreach (array('read', 'write', 'except') as $op) {
foreach ($streams[$op] as $stream) {
$id = (int) $stream;
if (isset($this->_streamWatchers[$op]['callbacks'][$id])) {
call_user_func($this->_streamWatchers[$op]['callbacks'][$id], $stream);
}
}
}
}
/**
* Add a watcher for a stream
*
* @param string $op
* @param resource $stream
* @param callable $callback
* @return bool
* @access module
*/
function _addStreamWatcher($op, $stream, $callback)
{
$id = (int) $stream;
$op = strtolower($op);
if (!isset($this->_streamWatchers[$op])) {
$this->_logger->debug(null, 'Failed to add %s watcher on stream #%d: unknown op', $op, $id);
return false;
} else if (!is_resource($stream)) {
$this->_logger->debug(null, 'Failed to add %s watcher on stream #%d: not a valid stream resource', $op, $id);
return false;
} else if (!is_callable($callback)) {
$this->_logger->debug(null, 'Failed to add %s watcher on stream #%d: invalid callback', $op, $id);
return false;
}
if (!isset($this->_streamWatchers[$op]['streams'][$id])) {
$this->_streamWatchers[$op]['streams'][$id] = $stream;
$this->_streamWatcherCount++;
} else {
$this->_logger->debug(null, 'Overwrote %s watcher on stream #%d', $op, $id);
}
$this->_streamWatchers[$op]['callbacks'][$id] = $callback;
$this->_logger->debug(null, 'Added %s watcher on stream #%d, watchers: %d', $op, $id, $this->_streamWatcherCount);
return true;
}
/**
* Remove a watcher for a stream or stream ID
*
* @param string $op
* @param resource|int $stream
* @access module
*/
function _removeStreamWatcher($op, $stream)
{
$id = (int) $stream;
$op = strtolower($op);
if (isset($this->_streamWatchers[$op]['streams'][$id])) {
unset($this->_streamWatchers[$op]['streams'][$id], $this->_streamWatchers[$op]['callbacks'][$id]);
$this->_streamWatcherCount--;
$this->_logger->debug(null, 'Removed %s watcher on stream #%d, watchers: %d', $op, $id, $this->_streamWatcherCount);
} else {
$this->_logger->debug(null, 'Could not remove %s watcher on stream #%d: not registered', $op, $id);
}
}
/**
* Clean up and shut down the event loop
*/
function _shutdown()
{
$this->_logger->info(null, 'Shutting down event loop');
// Remove all stream watchers apart from workers
foreach (array('read', 'write', 'except') as $op) {
foreach ($this->_streamWatchers[$op]['callbacks'] as $id => $callback) {
if (!is_array($callback) || !is_a($callback[0], 'WorkerParentEndpoint')) {
$this->_removeStreamWatcher($op, $id);
}
}
}
// Empty the schedule
$this->_scheduler->shutdown();
// Send all workers a terminate signal
$this->_dynamicWorkerPool->shutdown();
$this->_dnsWorkerPool->shutdown();
// Let workers terminate gracefully
while ($this->_streamWatcherCount > 0) {
$this->_processStreams($this->_getNextActivityTime());
$this->_scheduler->processActivity();
}
}
/**
* Register a handler for a stream wrapper or set of wrappers
*
* @param StreamHandler $handler
* @param array $schemes
* @return bool
*/
function registerStreamHandler(&$handler, $schemes)
{
if (!is_a($handler, 'StreamHandler')) {
return false;
}
foreach ($schemes as $scheme) {
$this->_streamHandlers[strtolower($scheme)] = &$handler;
}
return true;
}
/**
* Create a new stream
*
* @param string $address
* @return SocketStream
*/
function &openStream($address)
{
if (!$url = parse_url($address)) {
$this->_logger->warn(null, 'Unable to parse stream URL %s: Parse failed', $address);
return null;
} else if (!isset($url['scheme'])) {
$this->_logger->warn(null, 'Unable to parse stream URL %s: Missing scheme', $address);
return null;
}
$scheme = strtolower($url['scheme']);
if (!isset($this->_streamHandlers[$scheme])) {
$this->_logger->warn(null, 'No stream handler registered for URI scheme: %s', $scheme);
return null;
}
$stream = &$this->_streamHandlers[$scheme]->createStream($this, $url);
return $stream;
}
/**
* Schedule a job to be run asynchronously in a worker
*
* @param string $method
* @param mixed ...$args
* @return AsyncJob
*/
function &async($method)
{
$args = func_get_args();
$job = &new AsyncJob($method, array_slice($args, 1));
$this->_dynamicWorkerPool->pushJob($job);
$this->_logger->info(null, 'Queued async job, method: %s', $method);
return $job;
}
/**
* Resolve a host name to an IP address asynchronously
*
* @param string $host
* @param callable $callback
* @param bool $returnHost
*/
function resolveHost($host, $callback, $returnHost = false)
{
if ($host === '255.255.255.255' || ip2long($host) !== -1) {
$this->in(0, $callback, $returnHost ? array($host, $host) : array($host));
} else {
$job = &new AsyncJob('DNSWorker::resolve', array($host));
$this->_dnsWorkerPool->pushJob($job);
$job->on('complete', $callback, $returnHost ? array($host) : array());
$job->on('error', $callback, $returnHost ? array($host, null) : array(null));
}
}
/**
* Schedule a callback to be execute after a specified number of microseconds
*
* @param int $usecs
* @param callable $callback
* @param array $args
* @return int
*/
function in($usecs, $callback, $args = array())
{
return $this->_scheduler->createItem($this->_now() + ($usecs / 1000000), $callback, $args);
}
/**
* Schedule a callback to execute at a specified timestamp
*
* @param float $timestamp
* @param callable $callback
* @param array $args
* @return int
*/
function at($timestamp, $callback, $args = array())
{
return $this->_scheduler->createItem($timestamp, $callback, $args);
}
/**
* Schedule a recurring callback to execute after a specified number of microseconds
*
* @param int $usecs
* @param callable $callback
* @param array $args
* @return int
*/
function every($usecs, $callback, $args = array())
{
$secs = $usecs / 1000000;
return $this->_scheduler->createItem($this->_now() + $secs, $callback, $args, $secs);
}
/**
* Cancel a scheduled callback
*
* @param int $id
* @return bool
*/
function cancel($id)
{
return $this->_scheduler->removeItem($id);
}
/**
* Execute the event loop
*/
function run()
{
$this->_logger->info(null, 'Starting event loop');
$this->_running = true;
// Main loop
while ($this->_running && $this->_isActive()) {
$timeout = $this->_getNextActivityTime();
if ($this->_streamWatcherCount > 0) {
$this->_processStreams($timeout);
} else {
$this->_awaitNextActivity($timeout);
}
$this->_dynamicWorkerPool->processActivity();
$this->_dnsWorkerPool->processActivity();
$this->_scheduler->processActivity();
}
$this->_running = false;
$this->_shutdown();
$this->_logger->info(null, 'Event loop terminated');
}
/**
* Check whether the event loop is running
*
* @return bool
*/
function isRunning()
{
return $this->_running;
}
/**
* Stop the event loop after the current iteration
*/
function stop()
{
$this->_logger->debug(null, 'Stopping event loop');
$this->_running = false;
}
}
CLASS;
print_r(extract_docblocks($str));
Enable javascript to submit You have javascript disabled. You will not be able to edit any code.
Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).
Version System time (s) User time (s) Memory (MiB) 8.3.6 0.004 0.011 18.68 8.3.5 0.005 0.014 22.11 8.3.4 0.016 0.006 19.27 8.3.3 0.004 0.011 19.29 8.3.2 0.009 0.000 20.33 8.3.1 0.004 0.004 22.01 8.3.0 0.005 0.003 22.32 8.2.18 0.000 0.016 17.00 8.2.17 0.008 0.008 22.96 8.2.16 0.003 0.012 21.09 8.2.15 0.003 0.005 24.18 8.2.14 0.008 0.000 24.66 8.2.13 0.008 0.000 26.16 8.2.12 0.004 0.004 19.38 8.2.11 0.000 0.009 22.16 8.2.10 0.009 0.003 19.77 8.2.9 0.004 0.004 19.38 8.2.8 0.003 0.006 18.02 8.2.7 0.000 0.009 17.88 8.2.6 0.005 0.005 17.93 8.2.5 0.003 0.006 18.07 8.2.4 0.003 0.005 18.26 8.2.3 0.005 0.003 18.29 8.2.2 0.004 0.004 17.86 8.2.1 0.000 0.007 18.03 8.2.0 0.006 0.003 17.94 8.1.28 0.014 0.007 25.92 8.1.27 0.004 0.004 22.31 8.1.26 0.008 0.000 26.35 8.1.25 0.007 0.000 28.09 8.1.24 0.003 0.006 24.02 8.1.23 0.005 0.005 19.27 8.1.22 0.005 0.003 17.74 8.1.21 0.003 0.005 18.77 8.1.20 0.004 0.008 17.60 8.1.19 0.000 0.008 17.42 8.1.18 0.004 0.004 18.81 8.1.17 0.003 0.006 18.96 8.1.16 0.004 0.004 21.98 8.1.15 0.000 0.007 18.92 8.1.14 0.005 0.003 17.77 8.1.13 0.004 0.004 18.01 8.1.12 0.004 0.004 17.62 8.1.11 0.004 0.004 17.67 8.1.10 0.007 0.000 17.66 8.1.9 0.000 0.007 17.69 8.1.8 0.004 0.004 17.57 8.1.7 0.003 0.003 17.59 8.1.6 0.009 0.000 17.68 8.1.5 0.000 0.008 17.75 8.1.4 0.000 0.009 17.77 8.1.3 0.000 0.008 17.88 8.1.2 0.004 0.004 17.84 8.1.1 0.004 0.004 17.79 8.1.0 0.006 0.003 17.73 8.0.30 0.000 0.009 18.77 8.0.29 0.004 0.004 17.40 8.0.28 0.000 0.007 18.59 8.0.27 0.005 0.003 17.40 8.0.26 0.007 0.000 17.02 8.0.25 0.007 0.000 17.28 8.0.24 0.003 0.003 17.20 8.0.23 0.007 0.004 17.16 8.0.22 0.000 0.007 17.07 8.0.21 0.007 0.000 17.15 8.0.20 0.003 0.003 17.12 8.0.19 0.000 0.007 17.20 8.0.18 0.000 0.007 17.16 8.0.17 0.004 0.004 17.17 8.0.16 0.000 0.007 17.14 8.0.15 0.004 0.004 17.14 8.0.14 0.000 0.007 17.15 8.0.13 0.006 0.000 13.55 8.0.12 0.004 0.004 17.15 8.0.11 0.000 0.008 17.23 8.0.10 0.006 0.003 17.29 8.0.9 0.003 0.005 17.25 8.0.8 0.000 0.017 17.16 8.0.7 0.004 0.004 17.13 8.0.6 0.000 0.008 17.27 8.0.5 0.008 0.000 17.02 8.0.3 0.008 0.011 17.35 8.0.2 0.013 0.006 17.40 8.0.1 0.004 0.004 17.36 8.0.0 0.014 0.008 17.18 7.4.33 0.000 0.005 15.00 7.4.32 0.007 0.000 16.86 7.4.30 0.006 0.000 16.82 7.4.29 0.004 0.006 16.91 7.4.28 0.002 0.005 16.84 7.4.27 0.004 0.004 16.95 7.4.26 0.000 0.007 16.80 7.4.25 0.004 0.004 16.82 7.4.24 0.005 0.003 16.80 7.4.23 0.000 0.007 16.88 7.4.22 0.010 0.013 16.90 7.4.21 0.010 0.006 16.98 7.4.20 0.004 0.004 16.78 7.4.19 0.005 0.003 16.97 7.4.16 0.012 0.004 16.75 7.4.15 0.012 0.012 17.40 7.4.14 0.008 0.010 17.86 7.4.13 0.011 0.008 16.85 7.4.12 0.008 0.010 16.93 7.4.11 0.003 0.014 16.77 7.4.10 0.011 0.007 16.73 7.4.9 0.008 0.011 16.71 7.4.8 0.013 0.010 19.39 7.4.7 0.014 0.004 16.74 7.4.6 0.010 0.010 16.80 7.4.5 0.003 0.003 16.75 7.4.4 0.004 0.011 22.77 7.4.3 0.005 0.018 16.70 7.4.0 0.012 0.003 15.51 7.3.33 0.003 0.003 13.64 7.3.32 0.003 0.003 13.62 7.3.31 0.004 0.004 16.70 7.3.30 0.005 0.002 16.61 7.3.29 0.013 0.003 16.64 7.3.28 0.012 0.005 16.63 7.3.27 0.009 0.009 17.40 7.3.26 0.014 0.007 16.83 7.3.25 0.007 0.010 16.71 7.3.24 0.011 0.011 16.91 7.3.23 0.012 0.006 16.63 7.3.21 0.012 0.006 16.72 7.3.20 0.018 0.003 19.39 7.3.19 0.015 0.003 16.60 7.3.18 0.003 0.018 16.57 7.3.17 0.007 0.010 16.64 7.3.16 0.010 0.013 16.70 7.3.12 0.011 0.007 15.15 7.3.1 0.004 0.012 16.88 7.3.0 0.003 0.013 16.90 7.2.33 0.006 0.012 16.99 7.2.32 0.006 0.012 16.88 7.2.31 0.006 0.012 16.88 7.2.30 0.009 0.013 16.75 7.2.29 0.007 0.014 16.89 7.2.13 0.000 0.013 17.19 7.2.12 0.009 0.006 17.23 7.2.11 0.007 0.010 16.93 7.2.10 0.009 0.003 17.20 7.2.9 0.009 0.006 17.20 7.2.8 0.006 0.009 17.07 7.2.7 0.010 0.007 17.31 7.2.6 0.009 0.006 17.01 7.2.5 0.008 0.004 17.09 7.2.4 0.012 0.003 17.06 7.2.3 0.009 0.006 17.11 7.2.2 0.006 0.010 17.34 7.2.1 0.000 0.012 17.13 7.2.0 0.003 0.011 18.37 7.1.25 0.007 0.010 15.91 7.1.20 0.008 0.005 16.04 7.1.10 0.003 0.009 18.23 7.1.7 0.002 0.005 17.13 7.1.6 0.013 0.013 19.82 7.1.5 0.015 0.007 17.22 7.1.0 0.007 0.073 22.55 7.0.20 0.003 0.007 16.76 7.0.14 0.007 0.073 21.94 7.0.6 0.010 0.033 20.06 7.0.5 0.003 0.043 17.77 7.0.4 0.010 0.073 20.32 7.0.3 0.023 0.047 20.26 7.0.2 0.023 0.037 20.21 7.0.1 0.023 0.083 20.07 7.0.0 0.003 0.047 20.32 5.6.21 0.013 0.080 20.65 5.6.20 0.017 0.070 18.29 5.6.19 0.013 0.077 20.58 5.6.18 0.397 0.040 20.48 5.6.17 0.033 0.083 20.71 5.6.16 0.017 0.077 20.46 5.6.15 0.013 0.077 18.24 5.6.14 0.010 0.040 18.18 5.6.13 0.007 0.087 18.18 5.6.12 0.007 0.057 20.94 5.6.11 0.017 0.087 21.18 5.6.10 0.007 0.053 20.97 5.6.9 0.007 0.040 21.02 5.6.8 0.010 0.080 20.59 5.6.7 0.027 0.040 20.32 5.5.35 0.007 0.080 20.35 5.5.34 0.013 0.063 17.98 5.5.33 0.007 0.087 20.13 5.5.32 0.027 0.060 20.27 5.5.31 0.020 0.073 20.32 5.5.30 0.003 0.040 18.04 5.5.29 0.007 0.053 18.06 5.5.28 0.007 0.040 20.73 5.5.27 0.007 0.050 20.91 5.5.26 0.007 0.040 20.80 5.5.25 0.013 0.077 20.60 5.5.24 0.000 0.080 20.07 5.4.45 0.017 0.057 19.46 5.4.44 0.060 0.057 19.55 5.4.43 0.023 0.067 19.21 5.4.42 0.023 0.057 19.56 5.4.41 0.013 0.053 19.54 5.4.40 0.087 0.000 18.93 5.4.39 0.087 0.000 18.78 5.4.38 0.027 0.057 18.64 5.4.37 0.047 0.040 18.84 5.4.36 0.017 0.053 18.82 5.4.35 0.027 0.060 18.85 5.4.34 0.030 0.050 18.86 5.4.32 0.012 0.040 12.63 5.4.31 0.012 0.049 12.63 5.4.30 0.008 0.040 12.63 5.4.29 0.013 0.038 12.62 5.4.28 0.005 0.038 12.52 5.4.27 0.009 0.036 12.52 5.4.26 0.017 0.053 18.93 5.4.25 0.007 0.070 18.64 5.4.24 0.017 0.077 18.84 5.4.23 0.007 0.057 18.73 5.4.22 0.007 0.090 18.99 5.4.21 0.007 0.073 18.60 5.4.20 0.010 0.057 18.93 5.4.19 0.017 0.050 18.88 5.4.18 0.023 0.070 18.93 5.4.17 0.030 0.060 18.72 5.4.16 0.020 0.060 18.96 5.4.15 0.017 0.050 18.73 5.4.14 0.020 0.060 16.64 5.4.13 0.023 0.043 16.60 5.4.12 0.010 0.050 16.41 5.4.11 0.023 0.040 16.45 5.4.10 0.007 0.060 16.39 5.4.9 0.017 0.043 16.55 5.4.8 0.017 0.050 16.30 5.4.7 0.013 0.050 16.59 5.4.6 0.007 0.060 16.64 5.4.5 0.010 0.050 16.66 5.4.4 0.010 0.060 16.60 5.4.3 0.017 0.057 16.43 5.4.2 0.010 0.050 16.52 5.4.1 0.020 0.073 16.52 5.4.0 0.013 0.053 15.94 5.3.29 0.010 0.046 12.88 5.3.28 0.007 0.057 14.74 5.3.27 0.033 0.060 14.72 5.3.26 0.017 0.073 14.71 5.3.25 0.017 0.060 14.91 5.3.24 0.017 0.067 14.75 5.3.23 0.023 0.040 14.88 5.3.22 0.007 0.057 14.75 5.3.21 0.007 0.053 14.60 5.3.20 0.013 0.047 14.78 5.3.19 0.007 0.057 14.83 5.3.18 0.013 0.047 14.78 5.3.17 0.027 0.063 14.60 5.3.16 0.013 0.047 14.86 5.3.15 0.013 0.050 14.60 5.3.14 0.013 0.050 14.73 5.3.13 0.003 0.087 14.76 5.3.12 0.007 0.060 14.70 5.3.11 0.023 0.047 14.76 5.3.10 0.010 0.053 14.07 5.3.9 0.017 0.047 14.30 5.3.8 0.013 0.043 14.22 5.3.7 0.013 0.043 14.24 5.3.6 0.013 0.047 14.20 5.3.5 0.013 0.053 14.27 5.3.4 0.010 0.053 14.07 5.3.3 0.013 0.067 14.21 5.3.2 0.017 0.047 13.82 5.3.1 0.000 0.060 13.80 5.3.0 0.013 0.073 13.77 5.2.17 0.007 0.040 11.18 5.2.16 0.003 0.040 11.24 5.2.15 0.013 0.053 11.22 5.2.14 0.013 0.033 11.24 5.2.13 0.010 0.037 11.21 5.2.12 0.020 0.043 11.11 5.2.11 0.027 0.030 11.18 5.2.10 0.010 0.037 11.19 5.2.9 0.000 0.047 11.10 5.2.8 0.010 0.047 11.01 5.2.7 0.003 0.047 11.06 5.2.6 0.000 0.047 10.98 5.2.5 0.007 0.037 11.03 5.2.4 0.003 0.040 11.01 5.2.3 0.007 0.047 11.08 5.2.2 0.007 0.040 11.06 5.2.1 0.003 0.040 10.85 5.2.0 0.000 0.043 10.72 5.1.6 0.007 0.047 10.17 5.1.5 0.000 0.053 9.97 5.1.4 0.000 0.040 10.04 5.1.3 0.003 0.033 10.53 5.1.2 0.010 0.040 10.46 5.1.1 0.010 0.047 10.13 5.1.0 0.003 0.050 10.09 5.0.5 0.000 0.033 8.53 5.0.4 0.007 0.037 8.52 5.0.3 0.003 0.053 8.34 5.0.2 0.003 0.033 8.19 5.0.1 0.000 0.037 8.25 5.0.0 0.003 0.047 8.27 4.4.9 0.000 0.023 7.01 4.4.8 0.003 0.020 7.01 4.4.7 0.010 0.020 6.94 4.4.6 0.003 0.020 6.94 4.4.5 0.003 0.020 6.94 4.4.4 0.010 0.043 6.94 4.4.3 0.000 0.023 6.94 4.4.2 0.007 0.027 6.94 4.4.1 0.003 0.023 6.94 4.4.0 0.007 0.033 6.94 4.3.11 0.000 0.030 6.94 4.3.10 0.000 0.030 6.94 4.3.9 0.000 0.023 6.94 4.3.8 0.003 0.040 6.94 4.3.7 0.007 0.020 6.94 4.3.6 0.003 0.020 6.94 4.3.5 0.007 0.027 6.94 4.3.4 0.000 0.047 6.94 4.3.3 0.003 0.027 6.94 4.3.2 0.000 0.033 6.94 4.3.1 0.003 0.023 6.94 4.3.0 0.010 0.020 7.32
preferences:dark mode live preview
75.3 ms | 400 KiB | 5 Q