161 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections.Generic;
 | 
						|
using System.Text;
 | 
						|
using System.Xml;
 | 
						|
 | 
						|
namespace profviewer
 | 
						|
{
 | 
						|
    enum ProfileType : int
 | 
						|
    {
 | 
						|
        ProfType_Unknown = 0,
 | 
						|
        ProfType_Native,
 | 
						|
        ProfType_Callback,
 | 
						|
        ProfType_Function
 | 
						|
    }
 | 
						|
 | 
						|
    class ProfileItem
 | 
						|
    {
 | 
						|
        public string name;
 | 
						|
        public double total_time;
 | 
						|
        public uint num_calls;
 | 
						|
        public double min_time;
 | 
						|
        public double max_time;
 | 
						|
        public ProfileType type;
 | 
						|
 | 
						|
        public double AverageTime
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return total_time / num_calls;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    class ProfileReport
 | 
						|
    {
 | 
						|
        public static string[] TypeStrings;
 | 
						|
        private DateTime m_start_time;
 | 
						|
        private double m_duration;
 | 
						|
        private List<ProfileItem> m_Items;
 | 
						|
 | 
						|
        public int Count
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_Items.Count;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        static ProfileReport()
 | 
						|
        {
 | 
						|
            TypeStrings = new string[4];
 | 
						|
 | 
						|
            TypeStrings[0] = "unknown";
 | 
						|
            TypeStrings[1] = "native";
 | 
						|
            TypeStrings[2] = "callback";
 | 
						|
            TypeStrings[3] = "function";
 | 
						|
        }
 | 
						|
 | 
						|
        public ProfileReport(string file)
 | 
						|
        {
 | 
						|
            bool in_profile;
 | 
						|
            ProfileType type;
 | 
						|
            string cur_report;
 | 
						|
            XmlTextReader xml;
 | 
						|
 | 
						|
            xml = new XmlTextReader(file);
 | 
						|
            xml.WhitespaceHandling = WhitespaceHandling.None;
 | 
						|
 | 
						|
            m_Items = new List<ProfileItem>();
 | 
						|
 | 
						|
            type = ProfileType.ProfType_Unknown;
 | 
						|
            in_profile = false;
 | 
						|
            cur_report = null;
 | 
						|
            while (xml.Read())
 | 
						|
            {
 | 
						|
                if (xml.NodeType == XmlNodeType.Element)
 | 
						|
                {
 | 
						|
                    if (xml.Name.CompareTo("profile") == 0)
 | 
						|
                    {
 | 
						|
                        int t;
 | 
						|
                        in_profile = true;
 | 
						|
                        m_duration = Double.Parse(xml.GetAttribute("uptime"));
 | 
						|
                        m_start_time = new DateTime(1970, 1, 1, 0, 0, 0);
 | 
						|
                        t = Int32.Parse(xml.GetAttribute("time"));
 | 
						|
                        m_start_time = m_start_time.AddSeconds(t);
 | 
						|
                    }
 | 
						|
                    else if (in_profile)
 | 
						|
                    {
 | 
						|
                        if (xml.Name.CompareTo("report") == 0)
 | 
						|
                        {
 | 
						|
                            cur_report = xml.GetAttribute("name");
 | 
						|
                            if (cur_report.CompareTo("natives") == 0)
 | 
						|
                            {
 | 
						|
                                type = ProfileType.ProfType_Native;
 | 
						|
                            }
 | 
						|
                            else if (cur_report.CompareTo("callbacks") == 0)
 | 
						|
                            {
 | 
						|
                                type = ProfileType.ProfType_Callback;
 | 
						|
                            }
 | 
						|
                            else if (cur_report.CompareTo("functions") == 0)
 | 
						|
                            {
 | 
						|
                                type = ProfileType.ProfType_Function;
 | 
						|
                            }
 | 
						|
                            else
 | 
						|
                            {
 | 
						|
                                type = ProfileType.ProfType_Unknown;
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                        else if (xml.Name.CompareTo("item") == 0 && cur_report != null)
 | 
						|
                        {
 | 
						|
                            ProfileItem item;
 | 
						|
 | 
						|
                            item = new ProfileItem();
 | 
						|
                            item.name = xml.GetAttribute("name");
 | 
						|
                            item.max_time = Double.Parse(xml.GetAttribute("maxtime"));
 | 
						|
                            item.min_time = Double.Parse(xml.GetAttribute("mintime"));
 | 
						|
                            item.num_calls = UInt32.Parse(xml.GetAttribute("numcalls"));
 | 
						|
                            item.total_time = Double.Parse(xml.GetAttribute("totaltime"));
 | 
						|
                            item.type = type;
 | 
						|
                            m_Items.Add(item);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else if (xml.NodeType == XmlNodeType.EndElement)
 | 
						|
                {
 | 
						|
                    if (xml.Name.CompareTo("profile") == 0)
 | 
						|
                    {
 | 
						|
                        break;
 | 
						|
                    }
 | 
						|
                    else if (xml.Name.CompareTo("report") == 0)
 | 
						|
                    {
 | 
						|
                        cur_report = null;
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
            xml.Close();
 | 
						|
        }
 | 
						|
 | 
						|
        public double Duration
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_duration;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public DateTime StartTime
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                return m_start_time;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public ProfileItem GetItem(int i)
 | 
						|
        {
 | 
						|
            return m_Items[i];
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |