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];
|
|
}
|
|
}
|
|
}
|