diff --git a/src/event/Event.php b/src/event/Event.php index 7437283ac..df0f6bb03 100644 --- a/src/event/Event.php +++ b/src/event/Event.php @@ -26,6 +26,7 @@ declare(strict_types=1); */ namespace pocketmine\event; +use pocketmine\timings\Timings; use function get_class; abstract class Event{ @@ -51,6 +52,9 @@ abstract class Event{ throw new \RuntimeException("Recursive event call detected (reached max depth of " . self::MAX_EVENT_CALL_DEPTH . " calls)"); } + $timings = Timings::getEventTimings($this); + $timings->startTiming(); + $handlerList = HandlerListManager::global()->getListFor(get_class($this)); ++self::$eventCallDepth; @@ -67,6 +71,7 @@ abstract class Event{ } }finally{ --self::$eventCallDepth; + $timings->stopTiming(); } } } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index 668860132..4525c217d 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -28,6 +28,8 @@ use pocketmine\entity\Entity; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\ServerboundPacket; use pocketmine\scheduler\TaskHandler; +use function get_class; +use function str_starts_with; abstract class Timings{ public const INCLUDED_BY_OTHER_TIMINGS_PREFIX = "** "; @@ -153,6 +155,9 @@ abstract class Timings{ public static TimingsHandler $playerMove; + /** @var TimingsHandler[] */ + private static array $events = []; + public static function init() : void{ if(self::$initialized){ return; @@ -294,4 +299,18 @@ abstract class Timings{ return self::$packetSendTimingMap[$pid]; } + + public static function getEventTimings(Event $event) : TimingsHandler{ + $eventClass = get_class($event); + if(!isset(self::$events[$eventClass])){ + if(str_starts_with($eventClass, "pocketmine\\event\\")){ + $name = (new \ReflectionClass($event))->getShortName(); + }else{ + $name = $eventClass; + } + self::$events[$eventClass] = new TimingsHandler($name, group: "Events"); + } + + return self::$events[$eventClass]; + } }