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();
 | |
| }
 | |
| 
 |