xref: /plugin/avatar/benchmark_monsterid.php (revision a24d1dfa4fa24d0802b00fe7f612ab1b844b3ddc)
1a1dab272Snerun#!/usr/bin/php
2a1dab272Snerun<?php
3a1dab272Snerundeclare(strict_types=1);
4a1dab272Snerun
5a1dab272Snerun// Avatar parameters
6a1dab272Snerundefine('IMG_SIZE', 120);
7*a24d1dfaSnerundefine('ROUNDS', 30000);
8a1dab272Snerundefine('PARTS_DIR', __DIR__ . '/parts');
9a1dab272Snerun
10a1dab272Snerun$partGroups = [
11a1dab272Snerun    'arms'  => 5,
12a1dab272Snerun    'body'  => 15,
13a1dab272Snerun    'eyes'  => 15,
14a1dab272Snerun    'hair'  => 5,
15a1dab272Snerun    'legs'  => 5,
16a1dab272Snerun    'mouth' => 10,
17a1dab272Snerun];
18a1dab272Snerun
19a1dab272Snerunfunction getRandomPart(string $group, int $max): GdImage {
20a1dab272Snerun    $n = random_int(1, $max);
21a1dab272Snerun    $path = sprintf('%s/%s_%d.png', PARTS_DIR, $group, $n);
22a1dab272Snerun    return imagecreatefrompng($path);
23a1dab272Snerun}
24a1dab272Snerun
25a1dab272Snerunfunction generateMonster(): GdImage {
26a1dab272Snerun    $img = imagecreatetruecolor(IMG_SIZE, IMG_SIZE);
27a1dab272Snerun    imagesavealpha($img, true);
28a1dab272Snerun    $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127);
29a1dab272Snerun    imagefill($img, 0, 0, $transparent);
30a1dab272Snerun
31a1dab272Snerun    global $partGroups;
32a1dab272Snerun    foreach ($partGroups as $group => $count) {
33a1dab272Snerun        $part = getRandomPart($group, $count);
34a1dab272Snerun        imagecopy($img, $part, 0, 0, 0, 0, IMG_SIZE, IMG_SIZE);
35a1dab272Snerun        imagedestroy($part);
36a1dab272Snerun    }
37a1dab272Snerun    return $img;
38a1dab272Snerun}
39a1dab272Snerun
40*a24d1dfaSnerun// Start timing
41*a24d1dfaSnerun$start = microtime(true);
42*a24d1dfaSnerun
43a1dab272Snerun// Run benchmark
44a1dab272Snerun$sizes = [];
45a1dab272Snerunfor ($i = 0; $i < ROUNDS; $i++) {
46a1dab272Snerun    $img = generateMonster();
47a1dab272Snerun    ob_start();
48a1dab272Snerun    imagepng($img, null, 9);
49a1dab272Snerun    $data = ob_get_clean();
50a1dab272Snerun    $sizes[] = strlen($data);
51a1dab272Snerun    imagedestroy($img);
52a1dab272Snerun}
53a1dab272Snerun
54*a24d1dfaSnerun// End timing
55*a24d1dfaSnerun$end = microtime(true);
56*a24d1dfaSnerun$elapsed = $end - $start;
57*a24d1dfaSnerun
58a1dab272Snerun// Statistics
59a1dab272Snerun$min = min($sizes);
60a1dab272Snerun$max = max($sizes);
61a1dab272Snerun$avg = array_sum($sizes) / count($sizes);
62a1dab272Snerun$stddev = sqrt(array_sum(array_map(fn($s) => pow($s - $avg, 2), $sizes)) / count($sizes));
63a1dab272Snerun
64a1dab272Snerunprintf("Generated avatars: %d\n", ROUNDS);
65a1dab272Snerunprintf("Minimum size: %.2f KB\n", $min / 1024);
66a1dab272Snerunprintf("Maximum size: %.2f KB\n", $max / 1024);
67a1dab272Snerunprintf("Average size: %.2f KB\n", $avg / 1024);
68a1dab272Snerunprintf("Standard deviation: %.2f KB\n", $stddev / 1024);
69*a24d1dfaSnerunprintf("Elapsed time: %.2f seconds\n", $elapsed);
70*a24d1dfaSnerunprintf("Avatars per second: %.2f\n", ROUNDS / $elapsed);
71