<?php

if (!isset($_SERVER['argv'][1], $_SERVER['argv'][2])) {
    echo 'Usage: php benchmark.php <format> <iterations> [output-file]' . PHP_EOL;
    exit(1);
}

list(, $format, $iterations) = $_SERVER['argv'];

require_once 'bootstrap.php';

function benchmark(\Closure $f, $times = 10)
{
    $time = microtime(true);
    for ($i = 0; $i < $times; $i++) {
        $f();
    }

    return (microtime(true) - $time) / $times;
}

function createCollection()
{
    $collection = array();
    for ($i = 0; $i < 200; $i++) {
        $collection[] = createObject();
    }

    return $collection;
}

function createObject()
{
    $p = new \JMS\Serializer\Tests\Fixtures\Publisher('bar');
    $post = new \JMS\Serializer\Tests\Fixtures\BlogPost('FooooooooooooooooooooooBAR', new \JMS\Serializer\Tests\Fixtures\Author('Foo'), new \DateTime, $p);
    for ($i = 0; $i < 100; $i++) {
        $post->addComment(new \JMS\Serializer\Tests\Fixtures\Comment(new \JMS\Serializer\Tests\Fixtures\Author('foo'), 'foobar'));
    }

    return $post;
}

$serializer = \JMS\Serializer\SerializerBuilder::create()->build();
$collection = createCollection();
$metrics = array();
$f = function () use ($serializer, $collection, $format) {
    $serializer->serialize($collection, $format);
};

// Load all necessary classes into memory.
benchmark($f, 1);

printf('Benchmarking collection for format "%s".' . PHP_EOL, $format);
$metrics['benchmark-collection-' . $format] = benchmark($f, $iterations);

$output = json_encode(array('metrics' => $metrics));

if (isset($_SERVER['argv'][3])) {
    file_put_contents($_SERVER['argv'][3], $output);
    echo "Done." . PHP_EOL;
} else {
    echo $output . PHP_EOL;
}
