<?php namespace Bench; /** * 1. ZEND_IS_BOOL 命令にコンパイルされる (最速期待) */ function is_bool_native(mixed $v): bool { return \is_bool($v); } /** * 2. 名前空間解決による DO_FCALL。実行時にグローバル関数を探す */ function is_bool_ns(mixed $v): bool { return is_bool($v); } /** * 3. ZEND_IN_ARRAY 命令にコンパイルされる (O(1) 最適化) */ function in_array_native(mixed $v): bool { return \in_array($v, [true, false], true); } /** * 4. 名前空間解決 + DO_FCALL + 通常の線形探索 (O(n)) */ function in_array_ns(mixed $v): bool { return in_array($v, [true, false], true); } /** * 5. ユーザー定義ロジック:キャストと比較 */ function is_bool_cast(mixed $v): bool { return $v === (bool)$v; } /** * 6. ユーザー定義ロジック:論理和 */ function is_bool_or(mixed $v): bool { return $v === true || $v === false; } /** * 7. match式 */ function is_bool_match(mixed $v): bool { return match ($v) { true, false => true, default => false, }; } /** * データセット */ $datasets = [ 'all_bool' => [true, false, true, false], 'no_bool' => [1, 0, "1", "0", "true", [], new \stdClass(), null], 'half_half' => [true, 1, false, "test", true, null, false, []], ]; $testcases = [ 'is_bool (\native)' => is_bool_native(...), 'is_bool (ns)' => is_bool_ns(...), 'in_array (\native)' => in_array_native(...), 'in_array (ns)' => in_array_ns(...), 'is_bool_cast' => is_bool_cast(...), 'logical OR' => is_bool_or(...), 'match_expression' => is_bool_match(...), ]; $iterations = 100000; echo "PHP Version: " . PHP_VERSION . "\n"; echo str_repeat('=', 60) . "\n"; foreach ($datasets as $data_name => $values) { echo "\nDataset: $data_name\n"; echo str_repeat('-', 60) . "\n"; $results = []; foreach ($testcases as $name => $test) { $start = hrtime(true); for ($i = 0; $i < $iterations; $i++) { foreach ($values as $value) { $test($value); } } $end = hrtime(true); // 合計実行回数で割って平均を出すのではなく、あえて「このデータセット一式の処理時間」とする $results[$name] = ($end - $start) / 1e+6; } asort($results); foreach ($results as $name => $ms) { printf("%-20s : %10.4f ms\n", $name, $ms); } }
You have javascript disabled. You will not be able to edit any code.