1<?php
2
3/*
4 * This file is part of Twig.
5 *
6 * (c) Fabien Potencier
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Twig\Profiler\Dumper;
13
14use Twig\Profiler\Profile;
15
16/**
17 * @author Fabien Potencier <fabien@symfony.com>
18 */
19final class BlackfireDumper
20{
21    public function dump(Profile $profile)
22    {
23        $data = [];
24        $this->dumpProfile('main()', $profile, $data);
25        $this->dumpChildren('main()', $profile, $data);
26
27        $start = sprintf('%f', microtime(true));
28        $str = <<<EOF
29file-format: BlackfireProbe
30cost-dimensions: wt mu pmu
31request-start: {$start}
32
33
34EOF;
35
36        foreach ($data as $name => $values) {
37            $str .= "{$name}//{$values['ct']} {$values['wt']} {$values['mu']} {$values['pmu']}\n";
38        }
39
40        return $str;
41    }
42
43    private function dumpChildren(string $parent, Profile $profile, &$data)
44    {
45        foreach ($profile as $p) {
46            if ($p->isTemplate()) {
47                $name = $p->getTemplate();
48            } else {
49                $name = sprintf('%s::%s(%s)', $p->getTemplate(), $p->getType(), $p->getName());
50            }
51            $this->dumpProfile(sprintf('%s==>%s', $parent, $name), $p, $data);
52            $this->dumpChildren($name, $p, $data);
53        }
54    }
55
56    private function dumpProfile(string $edge, Profile $profile, &$data)
57    {
58        if (isset($data[$edge])) {
59            ++$data[$edge]['ct'];
60            $data[$edge]['wt'] += floor($profile->getDuration() * 1000000);
61            $data[$edge]['mu'] += $profile->getMemoryUsage();
62            $data[$edge]['pmu'] += $profile->getPeakMemoryUsage();
63        } else {
64            $data[$edge] = [
65                'ct' => 1,
66                'wt' => floor($profile->getDuration() * 1000000),
67                'mu' => $profile->getMemoryUsage(),
68                'pmu' => $profile->getPeakMemoryUsage(),
69            ];
70        }
71    }
72}
73
74class_alias('Twig\Profiler\Dumper\BlackfireDumper', 'Twig_Profiler_Dumper_Blackfire');
75