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