code: public function calculateTimings($messages)
      {
          $timings = [];
          $stack = [];
  
          foreach ($messages as $i => $log) {
              list($token, $level, $category, $timestamp, $traces) = $log;
              $memory = isset($log[5]) ? $log[5] : 0;
              $log[6] = $i;
              $hash = md5(json_encode($token));
              if ($level == self::LEVEL_PROFILE_BEGIN) {
                  $stack[$hash] = $log;
              } elseif ($level == self::LEVEL_PROFILE_END) {
                  if (isset($stack[$hash])) {
                      $timings[$stack[$hash][6]] = [
                          'info' => $stack[$hash][0],
                          'category' => $stack[$hash][2],
                          'timestamp' => $stack[$hash][3],
                          'trace' => $stack[$hash][4],
                          'level' => count($stack) - 1,
                          'duration' => $timestamp - $stack[$hash][3],
                          'memory' => $memory,
                          'memoryDiff' => $memory - (isset($stack[$hash][5]) ? $stack[$hash][5] : 0),
                      ];
                      unset($stack[$hash]);
                  }
              }
          }
  
          ksort($timings);
  
          return array_values($timings);
      }
docs: Calculates the elapsed time for the given log messages.
  @param array $messages the log messages obtained from profiling
  @return array timings. Each element is an array consisting of these elements:
  `info`, `category`, `timestamp`, `trace`, `level`, `duration`, `memory`, `memoryDiff`.
  The `memory` and `memoryDiff` values are available since version 2.0.11.