141 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Haxe
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Haxe
		
	
	
		
			Executable File
		
	
	
	
	
 | 
						|
class Entry
 | 
						|
{
 | 
						|
   public var name:String;
 | 
						|
   public var entry:Float;
 | 
						|
   public var total:Float;
 | 
						|
   public var running:Bool;
 | 
						|
   public var children:Array<Entry>;
 | 
						|
   public var current:Entry;
 | 
						|
 | 
						|
   public function new(inName:String)
 | 
						|
   {
 | 
						|
      name = inName;
 | 
						|
      total = 0.0;
 | 
						|
      children = [];
 | 
						|
      entry = haxe.Timer.stamp();
 | 
						|
      running = true;
 | 
						|
      current = null;
 | 
						|
   }
 | 
						|
 | 
						|
   public function start()
 | 
						|
   {
 | 
						|
      if (running)
 | 
						|
         trace("===== Restarted " + name);
 | 
						|
      entry = haxe.Timer.stamp();
 | 
						|
      running = true;
 | 
						|
   }
 | 
						|
 | 
						|
   public function stop()
 | 
						|
   {
 | 
						|
      if (running)
 | 
						|
      {
 | 
						|
         total += haxe.Timer.stamp() - entry;
 | 
						|
         running = false;
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   public function find(inName:String)
 | 
						|
   {
 | 
						|
      for(c in children)
 | 
						|
         if (c.name==inName)
 | 
						|
         {
 | 
						|
            current = c;
 | 
						|
            current.start();
 | 
						|
            return current;
 | 
						|
         }
 | 
						|
      var result = new Entry(inName);
 | 
						|
      children.push(result);
 | 
						|
      current = result;
 | 
						|
      return result;
 | 
						|
   }
 | 
						|
 | 
						|
 | 
						|
   static function timeString(t:Float)
 | 
						|
   {
 | 
						|
      return Std.int(t*1000.0) + "ms";
 | 
						|
   }
 | 
						|
 | 
						|
   public function dump(indent = "")
 | 
						|
   {
 | 
						|
      if (running)
 | 
						|
         trace("========== running?");
 | 
						|
      Sys.println(indent + name + " : " + timeString(total) );
 | 
						|
      for(c in children)
 | 
						|
         c.dump( indent + "  " );
 | 
						|
   }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
class Profile
 | 
						|
{
 | 
						|
   static var valid = false;
 | 
						|
   static var t0:Float;
 | 
						|
   static var root:Entry;
 | 
						|
   static var current:Entry;
 | 
						|
   static var currentParent:Entry;
 | 
						|
   static var stack:Array<Entry>;
 | 
						|
 | 
						|
 | 
						|
   public static function start()
 | 
						|
   {
 | 
						|
      t0 = now();
 | 
						|
      root = new Entry("Program");
 | 
						|
      currentParent = root;
 | 
						|
      current = null;
 | 
						|
      stack = [];
 | 
						|
   }
 | 
						|
 | 
						|
   public static function enable()
 | 
						|
   {
 | 
						|
      valid = true;
 | 
						|
      Tools.addOnExitHook( dump );
 | 
						|
   }
 | 
						|
 | 
						|
   public static function setEntry(inName:String)
 | 
						|
   {
 | 
						|
      if (!valid) return;
 | 
						|
 | 
						|
      if (current!=null)
 | 
						|
         current.stop();
 | 
						|
      current = currentParent.find(inName);
 | 
						|
   }
 | 
						|
 | 
						|
   public static function push(inName:String)
 | 
						|
   {
 | 
						|
      if (!valid) return;
 | 
						|
 | 
						|
      stack.push(currentParent);
 | 
						|
      currentParent = current;
 | 
						|
      current = currentParent.find(inName);
 | 
						|
   }
 | 
						|
   public static function pop()
 | 
						|
   {
 | 
						|
      if (!valid) return;
 | 
						|
 | 
						|
      current.stop();
 | 
						|
      currentParent = stack.pop();
 | 
						|
      current = currentParent.current;
 | 
						|
   }
 | 
						|
 | 
						|
 | 
						|
   static function dump(inExitCode:Int)
 | 
						|
   {
 | 
						|
      if (inExitCode==0)
 | 
						|
      {
 | 
						|
         if (current!=null)
 | 
						|
            current.stop();
 | 
						|
         if (currentParent!=null)
 | 
						|
            currentParent.stop();
 | 
						|
         for(s in stack)
 | 
						|
            s.stop();
 | 
						|
         root.dump();
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   inline static function now() return haxe.Timer.stamp();
 | 
						|
}
 | 
						|
 |