Timings: Clean up some terrible code, move namespaces

This commit is contained in:
Dylan K. Taylor 2018-03-19 19:05:51 +00:00
parent 209e28dfe5
commit 73e09392b6
20 changed files with 101 additions and 167 deletions

View File

@ -24,9 +24,9 @@ declare(strict_types=1);
namespace pocketmine;
use pocketmine\event\server\LowMemoryEvent;
use pocketmine\event\Timings;
use pocketmine\scheduler\DumpWorkerMemoryTask;
use pocketmine\scheduler\GarbageCollectionTask;
use pocketmine\timings\Timings;
use pocketmine\utils\MainLogger;
use pocketmine\utils\Utils;

View File

@ -68,7 +68,6 @@ use pocketmine\event\player\PlayerToggleSneakEvent;
use pocketmine\event\player\PlayerToggleSprintEvent;
use pocketmine\event\player\PlayerTransferEvent;
use pocketmine\event\server\DataPacketSendEvent;
use pocketmine\event\Timings;
use pocketmine\inventory\BigCraftingGrid;
use pocketmine\inventory\CraftingGrid;
use pocketmine\inventory\Inventory;
@ -153,6 +152,7 @@ use pocketmine\resourcepacks\ResourcePack;
use pocketmine\tile\ItemFrame;
use pocketmine\tile\Spawnable;
use pocketmine\tile\Tile;
use pocketmine\timings\Timings;
use pocketmine\utils\TextFormat;
use pocketmine\utils\UUID;

View File

@ -41,8 +41,6 @@ use pocketmine\event\level\LevelLoadEvent;
use pocketmine\event\player\PlayerDataSaveEvent;
use pocketmine\event\server\QueryRegenerateEvent;
use pocketmine\event\server\ServerCommandEvent;
use pocketmine\event\Timings;
use pocketmine\event\TimingsHandler;
use pocketmine\inventory\CraftingManager;
use pocketmine\item\enchantment\Enchantment;
use pocketmine\item\Item;
@ -93,6 +91,8 @@ use pocketmine\scheduler\FileWriteTask;
use pocketmine\scheduler\SendUsageTask;
use pocketmine\scheduler\ServerScheduler;
use pocketmine\tile\Tile;
use pocketmine\timings\Timings;
use pocketmine\timings\TimingsHandler;
use pocketmine\updater\AutoUpdater;
use pocketmine\utils\Binary;
use pocketmine\utils\Config;
@ -1593,6 +1593,7 @@ class Server{
Timings::init();
TimingsHandler::setEnabled((bool) $this->getProperty("settings.enable-profiling", false));
$this->consoleSender = new ConsoleCommandSender();
$this->commandMap = new SimpleCommandMap($this);
@ -1611,7 +1612,6 @@ class Server{
$this->pluginManager = new PluginManager($this, $this->commandMap);
$this->pluginManager->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this->consoleSender);
$this->pluginManager->setUseTimings($this->getProperty("settings.enable-profiling", false));
$this->profilingTickRate = (float) $this->getProperty("settings.profile-report-trigger", 20);
$this->pluginManager->registerInterface(PharPluginLoader::class);
$this->pluginManager->registerInterface(ScriptPluginLoader::class);

View File

@ -26,10 +26,10 @@ declare(strict_types=1);
*/
namespace pocketmine\command;
use pocketmine\event\TimingsHandler;
use pocketmine\lang\TextContainer;
use pocketmine\lang\TranslationContainer;
use pocketmine\Server;
use pocketmine\timings\TimingsHandler;
use pocketmine\utils\TextFormat;
abstract class Command{

View File

@ -25,16 +25,14 @@ namespace pocketmine\command\defaults;
use pocketmine\command\CommandSender;
use pocketmine\command\utils\InvalidCommandSyntaxException;
use pocketmine\event\TimingsHandler;
use pocketmine\lang\TranslationContainer;
use pocketmine\Player;
use pocketmine\scheduler\BulkCurlTask;
use pocketmine\Server;
use pocketmine\timings\TimingsHandler;
class TimingsCommand extends VanillaCommand{
public static $timingStart = 0;
public function __construct(string $name){
parent::__construct(
$name,
@ -56,18 +54,17 @@ class TimingsCommand extends VanillaCommand{
$mode = strtolower($args[0]);
if($mode === "on"){
$sender->getServer()->getPluginManager()->setUseTimings(true);
TimingsHandler::reload();
TimingsHandler::setEnabled();
$sender->sendMessage(new TranslationContainer("pocketmine.command.timings.enable"));
return true;
}elseif($mode === "off"){
$sender->getServer()->getPluginManager()->setUseTimings(false);
TimingsHandler::setEnabled(false);
$sender->sendMessage(new TranslationContainer("pocketmine.command.timings.disable"));
return true;
}
if(!$sender->getServer()->getPluginManager()->useTimings()){
if(!TimingsHandler::isEnabled()){
$sender->sendMessage(new TranslationContainer("pocketmine.command.timings.timingsDisabled"));
return true;
@ -79,25 +76,25 @@ class TimingsCommand extends VanillaCommand{
TimingsHandler::reload();
$sender->sendMessage(new TranslationContainer("pocketmine.command.timings.reset"));
}elseif($mode === "merged" or $mode === "report" or $paste){
$timings = "";
if($paste){
$fileTimings = fopen("php://temp", "r+b");
}else{
$index = 0;
$timingFolder = $sender->getServer()->getDataPath() . "timings/";
$sampleTime = microtime(true) - self::$timingStart;
$index = 0;
$timingFolder = $sender->getServer()->getDataPath() . "timings/";
if(!file_exists($timingFolder)){
mkdir($timingFolder, 0777);
}
$timings = $timingFolder . "timings.txt";
while(file_exists($timings)){
$timings = $timingFolder . "timings" . (++$index) . ".txt";
}
if(!file_exists($timingFolder)){
mkdir($timingFolder, 0777);
$fileTimings = fopen($timings, "a+b");
}
$timings = $timingFolder . "timings.txt";
while(file_exists($timings)){
$timings = $timingFolder . "timings" . (++$index) . ".txt";
}
$fileTimings = $paste ? fopen("php://temp", "r+b") : fopen($timings, "a+b");
TimingsHandler::printTimings($fileTimings);
fwrite($fileTimings, "Sample time " . round($sampleTime * 1000000000) . " (" . $sampleTime . "s)" . PHP_EOL);
if($paste){
fseek($fileTimings, 0);
$data = [

View File

@ -48,8 +48,6 @@ use pocketmine\event\entity\EntityMotionEvent;
use pocketmine\event\entity\EntityRegainHealthEvent;
use pocketmine\event\entity\EntitySpawnEvent;
use pocketmine\event\entity\EntityTeleportEvent;
use pocketmine\event\Timings;
use pocketmine\event\TimingsHandler;
use pocketmine\level\format\Chunk;
use pocketmine\level\Level;
use pocketmine\level\Location;
@ -74,6 +72,8 @@ use pocketmine\network\mcpe\protocol\SetEntityMotionPacket;
use pocketmine\Player;
use pocketmine\plugin\Plugin;
use pocketmine\Server;
use pocketmine\timings\Timings;
use pocketmine\timings\TimingsHandler;
abstract class Entity extends Location implements Metadatable, EntityIds{

View File

@ -30,7 +30,6 @@ use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\EntityDeathEvent;
use pocketmine\event\entity\EntityEffectAddEvent;
use pocketmine\event\entity\EntityEffectRemoveEvent;
use pocketmine\event\Timings;
use pocketmine\inventory\ArmorInventory;
use pocketmine\item\Armor;
use pocketmine\item\Consumable;
@ -47,6 +46,7 @@ use pocketmine\network\mcpe\protocol\EntityEventPacket;
use pocketmine\network\mcpe\protocol\LevelSoundEventPacket;
use pocketmine\network\mcpe\protocol\MobEffectPacket;
use pocketmine\Player;
use pocketmine\timings\Timings;
use pocketmine\utils\Binary;
use pocketmine\utils\Color;

View File

@ -33,7 +33,6 @@ use pocketmine\event\entity\EntityDamageEvent;
use pocketmine\event\entity\ProjectileHitBlockEvent;
use pocketmine\event\entity\ProjectileHitEntityEvent;
use pocketmine\event\entity\ProjectileHitEvent;
use pocketmine\event\Timings;
use pocketmine\level\Level;
use pocketmine\math\RayTraceResult;
use pocketmine\math\Vector3;
@ -41,6 +40,7 @@ use pocketmine\math\VoxelRayTrace;
use pocketmine\nbt\tag\ByteTag;
use pocketmine\nbt\tag\CompoundTag;
use pocketmine\nbt\tag\IntTag;
use pocketmine\timings\Timings;
abstract class Projectile extends Entity{

View File

@ -23,12 +23,12 @@ declare(strict_types=1);
namespace pocketmine\inventory;
use pocketmine\event\Timings;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\network\mcpe\protocol\BatchPacket;
use pocketmine\network\mcpe\protocol\CraftingDataPacket;
use pocketmine\Server;
use pocketmine\timings\Timings;
use pocketmine\utils\Config;
use pocketmine\utils\MainLogger;
use pocketmine\utils\UUID;

View File

@ -40,9 +40,7 @@ use pocketmine\event\level\ChunkUnloadEvent;
use pocketmine\event\level\LevelSaveEvent;
use pocketmine\event\level\LevelUnloadEvent;
use pocketmine\event\level\SpawnChangeEvent;
use pocketmine\event\LevelTimings;
use pocketmine\event\player\PlayerInteractEvent;
use pocketmine\event\Timings;
use pocketmine\item\Item;
use pocketmine\item\ItemFactory;
use pocketmine\level\format\Chunk;
@ -83,6 +81,7 @@ use pocketmine\Server;
use pocketmine\tile\Chest;
use pocketmine\tile\Container;
use pocketmine\tile\Tile;
use pocketmine\timings\Timings;
use pocketmine\utils\Random;
use pocketmine\utils\ReversePriorityQueue;

View File

@ -21,9 +21,9 @@
declare(strict_types=1);
namespace pocketmine\event;
namespace pocketmine\level;
use pocketmine\level\Level;
use pocketmine\timings\TimingsHandler;
class LevelTimings{
@ -34,36 +34,20 @@ class LevelTimings{
/** @var TimingsHandler */
public $doBlockSkyLightUpdates;
/** @var TimingsHandler */
public $mobSpawn;
/** @var TimingsHandler */
public $doChunkUnload;
/** @var TimingsHandler */
public $doPortalForcer;
/** @var TimingsHandler */
public $doTickPending;
/** @var TimingsHandler */
public $doTickTiles;
/** @var TimingsHandler */
public $doVillages;
/** @var TimingsHandler */
public $doChunkMap;
/** @var TimingsHandler */
public $doChunkGC;
/** @var TimingsHandler */
public $doSounds;
/** @var TimingsHandler */
public $entityTick;
/** @var TimingsHandler */
public $tileEntityTick;
/** @var TimingsHandler */
public $tileEntityPending;
/** @var TimingsHandler */
public $tracker;
/** @var TimingsHandler */
public $doTick;
/** @var TimingsHandler */
public $tickEntities;
/** @var TimingsHandler */
public $syncChunkSendTimer;
@ -75,15 +59,9 @@ class LevelTimings{
/** @var TimingsHandler */
public $syncChunkLoadDataTimer;
/** @var TimingsHandler */
public $syncChunkLoadStructuresTimer;
/** @var TimingsHandler */
public $syncChunkLoadEntitiesTimer;
/** @var TimingsHandler */
public $syncChunkLoadTileEntitiesTimer;
/** @var TimingsHandler */
public $syncChunkLoadTileTicksTimer;
/** @var TimingsHandler */
public $syncChunkLoadPostTimer;
public function __construct(Level $level){
$name = $level->getFolderName() . " - ";
@ -92,33 +70,22 @@ class LevelTimings{
$this->doBlockLightUpdates = new TimingsHandler("** " . $name . "doBlockLightUpdates");
$this->doBlockSkyLightUpdates = new TimingsHandler("** " . $name . "doBlockSkyLightUpdates");
$this->mobSpawn = new TimingsHandler("** " . $name . "mobSpawn");
$this->doChunkUnload = new TimingsHandler("** " . $name . "doChunkUnload");
$this->doTickPending = new TimingsHandler("** " . $name . "doTickPending");
$this->doTickTiles = new TimingsHandler("** " . $name . "doTickTiles");
$this->doVillages = new TimingsHandler("** " . $name . "doVillages");
$this->doChunkMap = new TimingsHandler("** " . $name . "doChunkMap");
$this->doSounds = new TimingsHandler("** " . $name . "doSounds");
$this->doChunkGC = new TimingsHandler("** " . $name . "doChunkGC");
$this->doPortalForcer = new TimingsHandler("** " . $name . "doPortalForcer");
$this->entityTick = new TimingsHandler("** " . $name . "entityTick");
$this->tileEntityTick = new TimingsHandler("** " . $name . "tileEntityTick");
$this->tileEntityPending = new TimingsHandler("** " . $name . "tileEntityPending");
$this->syncChunkSendTimer = new TimingsHandler("** " . $name . "syncChunkSend");
$this->syncChunkSendPrepareTimer = new TimingsHandler("** " . $name . "syncChunkSendPrepare");
$this->syncChunkLoadTimer = new TimingsHandler("** " . $name . "syncChunkLoad");
$this->syncChunkLoadDataTimer = new TimingsHandler("** " . $name . "syncChunkLoad - Data");
$this->syncChunkLoadStructuresTimer = new TimingsHandler("** " . $name . "syncChunkLoad - Structures");
$this->syncChunkLoadEntitiesTimer = new TimingsHandler("** " . $name . "syncChunkLoad - Entities");
$this->syncChunkLoadTileEntitiesTimer = new TimingsHandler("** " . $name . "syncChunkLoad - TileEntities");
$this->syncChunkLoadTileTicksTimer = new TimingsHandler("** " . $name . "syncChunkLoad - TileTicks");
$this->syncChunkLoadPostTimer = new TimingsHandler("** " . $name . "syncChunkLoad - Post");
$this->tracker = new TimingsHandler($name . "tracker");
$this->doTick = new TimingsHandler($name . "doTick");
$this->tickEntities = new TimingsHandler($name . "tickEntities");
}
}

View File

@ -25,7 +25,6 @@ namespace pocketmine\network\mcpe;
use pocketmine\event\server\DataPacketReceiveEvent;
use pocketmine\event\Timings;
use pocketmine\network\mcpe\protocol\AdventureSettingsPacket;
use pocketmine\network\mcpe\protocol\AnimatePacket;
use pocketmine\network\mcpe\protocol\BlockEntityDataPacket;
@ -65,6 +64,7 @@ use pocketmine\network\mcpe\protocol\SpawnExperienceOrbPacket;
use pocketmine\network\mcpe\protocol\TextPacket;
use pocketmine\Player;
use pocketmine\Server;
use pocketmine\timings\Timings;
class PlayerNetworkSessionAdapter extends NetworkSession{

View File

@ -23,10 +23,10 @@ declare(strict_types=1);
namespace pocketmine\permission;
use pocketmine\event\Timings;
use pocketmine\plugin\Plugin;
use pocketmine\plugin\PluginException;
use pocketmine\Server;
use pocketmine\timings\Timings;
class PermissibleBase implements Permissible{
/** @var ServerOperator */

View File

@ -23,19 +23,18 @@ declare(strict_types=1);
namespace pocketmine\plugin;
use pocketmine\command\defaults\TimingsCommand;
use pocketmine\command\PluginCommand;
use pocketmine\command\SimpleCommandMap;
use pocketmine\event\Event;
use pocketmine\event\EventPriority;
use pocketmine\event\HandlerList;
use pocketmine\event\Listener;
use pocketmine\event\Timings;
use pocketmine\event\TimingsHandler;
use pocketmine\network\mcpe\protocol\ProtocolInfo;
use pocketmine\permission\Permissible;
use pocketmine\permission\Permission;
use pocketmine\Server;
use pocketmine\timings\Timings;
use pocketmine\timings\TimingsHandler;
/**
* Manages all the plugins, Permissions and Permissibles
@ -91,8 +90,6 @@ class PluginManager{
/** @var TimingsHandler */
public static $pluginParentTimer;
public static $useTimings = false;
/**
* @param Server $server
* @param SimpleCommandMap $commandMap
@ -334,12 +331,8 @@ class PluginManager{
}
}
TimingsCommand::$timingStart = microtime(true);
return $loadedPlugins;
}else{
TimingsCommand::$timingStart = microtime(true);
return [];
}
}
@ -798,19 +791,4 @@ class PluginManager{
return $event::$handlerList;
}
/**
* @return bool
*/
public function useTimings() : bool{
return self::$useTimings;
}
/**
* @param bool $use
*/
public function setUseTimings(bool $use){
self::$useTimings = $use;
}
}

View File

@ -26,7 +26,7 @@ namespace pocketmine\plugin;
use pocketmine\event\Cancellable;
use pocketmine\event\Event;
use pocketmine\event\Listener;
use pocketmine\event\TimingsHandler;
use pocketmine\timings\TimingsHandler;
class RegisteredListener{

View File

@ -23,8 +23,8 @@ declare(strict_types=1);
namespace pocketmine\scheduler;
use pocketmine\event\Timings;
use pocketmine\Server;
use pocketmine\timings\Timings;
class AsyncPool{

View File

@ -23,8 +23,8 @@ declare(strict_types=1);
namespace pocketmine\scheduler;
use pocketmine\event\Timings;
use pocketmine\event\TimingsHandler;
use pocketmine\timings\Timings;
use pocketmine\timings\TimingsHandler;
use pocketmine\utils\MainLogger;
class TaskHandler{

View File

@ -28,8 +28,6 @@ declare(strict_types=1);
namespace pocketmine\tile;
use pocketmine\block\Block;
use pocketmine\event\Timings;
use pocketmine\event\TimingsHandler;
use pocketmine\item\Item;
use pocketmine\level\Level;
use pocketmine\level\Position;
@ -39,6 +37,8 @@ use pocketmine\nbt\tag\IntTag;
use pocketmine\nbt\tag\StringTag;
use pocketmine\Player;
use pocketmine\Server;
use pocketmine\timings\Timings;
use pocketmine\timings\TimingsHandler;
abstract class Tile extends Position{

View File

@ -21,7 +21,7 @@
declare(strict_types=1);
namespace pocketmine\event;
namespace pocketmine\timings;
use pocketmine\entity\Entity;
use pocketmine\network\mcpe\protocol\DataPacket;
@ -44,8 +44,6 @@ abstract class Timings{
/** @var TimingsHandler */
public static $titleTickTimer;
/** @var TimingsHandler */
public static $playerListTimer;
/** @var TimingsHandler */
public static $playerNetworkTimer;
/** @var TimingsHandler */
public static $playerNetworkReceiveTimer;
@ -56,20 +54,12 @@ abstract class Timings{
/** @var TimingsHandler */
public static $connectionTimer;
/** @var TimingsHandler */
public static $tickablesTimer;
/** @var TimingsHandler */
public static $schedulerTimer;
/** @var TimingsHandler */
public static $chunkIOTickTimer;
/** @var TimingsHandler */
public static $timeUpdateTimer;
/** @var TimingsHandler */
public static $serverCommandTimer;
/** @var TimingsHandler */
public static $worldSaveTimer;
/** @var TimingsHandler */
public static $generationTimer;
/** @var TimingsHandler */
public static $populationTimer;
/** @var TimingsHandler */
public static $generationCallbackTimer;
@ -83,22 +73,12 @@ abstract class Timings{
/** @var TimingsHandler */
public static $tickEntityTimer;
/** @var TimingsHandler */
public static $activatedEntityTimer;
/** @var TimingsHandler */
public static $tickTileEntityTimer;
/** @var TimingsHandler */
public static $timerEntityBaseTick;
/** @var TimingsHandler */
public static $timerLivingEntityBaseTick;
/** @var TimingsHandler */
public static $timerEntityAI;
/** @var TimingsHandler */
public static $timerEntityAICollision;
/** @var TimingsHandler */
public static $timerEntityAIMove;
/** @var TimingsHandler */
public static $timerEntityTickRest;
/** @var TimingsHandler */
public static $schedulerSyncTimer;
@ -132,19 +112,14 @@ abstract class Timings{
self::$memoryManagerTimer = new TimingsHandler("Memory Manager");
self::$garbageCollectorTimer = new TimingsHandler("Garbage Collector", self::$memoryManagerTimer);
self::$titleTickTimer = new TimingsHandler("Console Title Tick");
self::$playerListTimer = new TimingsHandler("Player List");
self::$playerNetworkTimer = new TimingsHandler("Player Network Send");
self::$playerNetworkReceiveTimer = new TimingsHandler("Player Network Receive");
self::$playerChunkOrderTimer = new TimingsHandler("Player Order Chunks");
self::$playerChunkSendTimer = new TimingsHandler("Player Send Chunks");
self::$connectionTimer = new TimingsHandler("Connection Handler");
self::$tickablesTimer = new TimingsHandler("Tickables");
self::$schedulerTimer = new TimingsHandler("Scheduler");
self::$chunkIOTickTimer = new TimingsHandler("ChunkIOTick");
self::$timeUpdateTimer = new TimingsHandler("Time Update");
self::$serverCommandTimer = new TimingsHandler("Server Command");
self::$worldSaveTimer = new TimingsHandler("World Save");
self::$generationTimer = new TimingsHandler("World Generation");
self::$populationTimer = new TimingsHandler("World Population");
self::$generationCallbackTimer = new TimingsHandler("World Generation Callback");
self::$permissibleCalculationTimer = new TimingsHandler("Permissible Calculation");
@ -152,15 +127,10 @@ abstract class Timings{
self::$entityMoveTimer = new TimingsHandler("** entityMove");
self::$tickEntityTimer = new TimingsHandler("** tickEntity");
self::$activatedEntityTimer = new TimingsHandler("** activatedTickEntity");
self::$tickTileEntityTimer = new TimingsHandler("** tickTileEntity");
self::$timerEntityBaseTick = new TimingsHandler("** entityBaseTick");
self::$timerLivingEntityBaseTick = new TimingsHandler("** livingEntityBaseTick");
self::$timerEntityAI = new TimingsHandler("** livingEntityAI");
self::$timerEntityAICollision = new TimingsHandler("** livingEntityAICollision");
self::$timerEntityAIMove = new TimingsHandler("** livingEntityAIMove");
self::$timerEntityTickRest = new TimingsHandler("** livingEntityTickRest");
self::$schedulerSyncTimer = new TimingsHandler("** Scheduler - Sync Tasks", PluginManager::$pluginParentTimer);
self::$schedulerAsyncTimer = new TimingsHandler("** Scheduler - Async Tasks");

View File

@ -21,42 +21,19 @@
declare(strict_types=1);
namespace pocketmine\event;
namespace pocketmine\timings;
use pocketmine\command\defaults\TimingsCommand;
use pocketmine\entity\Living;
use pocketmine\plugin\PluginManager;
use pocketmine\Server;
class TimingsHandler{
/** @var TimingsHandler[] */
private static $HANDLERS = [];
private $name;
/** @var TimingsHandler */
private $parent = null;
private $count = 0;
private $curCount = 0;
private $start = 0;
private $timingDepth = 0;
private $totalTime = 0;
private $curTickTotal = 0;
private $violations = 0;
/**
* @param string $name
* @param TimingsHandler $parent
*/
public function __construct(string $name, TimingsHandler $parent = null){
$this->name = $name;
if($parent !== null){
$this->parent = $parent;
}
self::$HANDLERS[spl_object_hash($this)] = $this;
}
/** @var bool */
private static $enabled = false;
/** @var float */
private static $timingStart = 0;
/**
* @param resource $fp
@ -92,23 +69,39 @@ class TimingsHandler{
fwrite($fp, "# Entities " . $entities . PHP_EOL);
fwrite($fp, "# LivingEntities " . $livingEntities . PHP_EOL);
$sampleTime = microtime(true) - self::$timingStart;
fwrite($fp, "Sample time " . round($sampleTime * 1000000000) . " (" . $sampleTime . "s)" . PHP_EOL);
}
public static function isEnabled() : bool{
return self::$enabled;
}
public static function setEnabled(bool $enable = true) : void{
self::$enabled = $enable;
self::reload();
}
public static function getStartTime() : float{
return self::$timingStart;
}
public static function reload(){
if(Server::getInstance()->getPluginManager()->useTimings()){
if(self::$enabled){
foreach(self::$HANDLERS as $timings){
$timings->reset();
}
TimingsCommand::$timingStart = microtime(true);
self::$timingStart = microtime(true);
}
}
public static function tick(bool $measure = true){
if(PluginManager::$useTimings){
if(self::$enabled){
if($measure){
foreach(self::$HANDLERS as $timings){
if($timings->curTickTotal > 0.05){
$timings->violations += round($timings->curTickTotal / 0.05);
$timings->violations += (int) round($timings->curTickTotal / 0.05);
}
$timings->curTickTotal = 0;
$timings->curCount = 0;
@ -127,8 +120,39 @@ class TimingsHandler{
}
}
/** @var string */
private $name;
/** @var TimingsHandler */
private $parent = null;
/** @var int */
private $count = 0;
/** @var int */
private $curCount = 0;
/** @var float */
private $start = 0;
/** @var int */
private $timingDepth = 0;
/** @var float */
private $totalTime = 0;
/** @var float */
private $curTickTotal = 0;
/** @var int */
private $violations = 0;
/**
* @param string $name
* @param TimingsHandler $parent
*/
public function __construct(string $name, TimingsHandler $parent = null){
$this->name = $name;
$this->parent = $parent;
self::$HANDLERS[spl_object_hash($this)] = $this;
}
public function startTiming(){
if(PluginManager::$useTimings and ++$this->timingDepth === 1){
if(self::$enabled and ++$this->timingDepth === 1){
$this->start = microtime(true);
if($this->parent !== null and ++$this->parent->timingDepth === 1){
$this->parent->start = $this->start;
@ -137,7 +161,7 @@ class TimingsHandler{
}
public function stopTiming(){
if(PluginManager::$useTimings){
if(self::$enabled){
if(--$this->timingDepth !== 0 or $this->start === 0){
return;
}
@ -167,5 +191,4 @@ class TimingsHandler{
public function remove(){
unset(self::$HANDLERS[spl_object_hash($this)]);
}
}