Подсчет времени работы функции - C#
Формулировка задачи:
Нужно посчитать сколько времени отрабатывает различные функции. Хотел через таймер, но он мыслит тиками. Конечно можно отлавливать события сколько тиков прошло и их считать, но нет ли решения попроще.
p.s. А если нет решения можно готовый код по отлавливанию тиков.
Решение задачи: «Подсчет времени работы функции»
textual
Листинг программы
public partial class Form1 : Form
{
...
private void button1_Click(object sender, EventArgs e)
{
using (
var logger = new MethodLoggingTool(
"Form1.button1_Click",
new[] { new MethodParameterDescription("sender", sender) }))
{
label1.Text = "";
for (int i = 0; i < 10000; i++)
{
label1.Text += ".";
}
label1.Text = "done";
}
}
...
}
...
public sealed class MethodLoggingTool : IDisposable
{
private static readonly CultureInfo _fp = CultureInfo.InvariantCulture;
private readonly string _name;
private readonly Guid _id;
private readonly IGeneralLogger _logger;
private readonly Stopwatch _sw;
private readonly DateTime _processDate;
private readonly int _processId;
private MethodParameterDescription[] _argumentsOut;
public MethodLoggingTool(string name, params MethodParameterDescription[] argumentsIn)
{
_name = name;
_id = Guid.NewGuid();
_processDate = DateTime.Now;
_processId = 0;
_logger = Context.Resolve<IGeneralLogger>(); // получаем экземпляр логгера
_logger.LogMethodEnter(_name, _id, _processDate, _processId, Format(argumentsIn));
_sw = new Stopwatch();
_sw.Start();
}
public MethodLoggingTool(string name, DateTime processDate, int processId, params MethodParameterDescription[] argumentsIn)
{
_name = name;
_id = Guid.NewGuid();
_processDate = processDate;
_processId = processId;
_logger = Context.Resolve<IGeneralLogger>(); // получаем экземпляр логгера
_logger.LogMethodEnter(_name, _id, _processDate, _processId, Format(argumentsIn));
_sw = new Stopwatch();
_sw.Start();
}
public string ValueNull
{
get { return "null"; }
}
public string ValueEmpty
{
get { return "empty"; }
}
public string Name
{
get { return _name; }
}
public Guid Id
{
get { return _id; }
}
public DateTime ProcessDate
{
get { return _processDate; }
}
public int ProcessId
{
get { return _processId; }
}
public IGeneralLogger Logger
{
get { return _logger; }
}
public Stopwatch Sw
{
get { return _sw; }
}
public IFormatProvider FormatProvider
{
get { return _fp; }
}
public void Dispose()
{
_sw.Stop();
_logger.LogMethodExit(_name, _id, _processDate, _processId, _sw.Elapsed, Format(_argumentsOut));
}
public TaskLoggingTool GetThreadLoggingTool(int threadId)
{
return new TaskLoggingTool(this, threadId);
}
public void LogResult(params MethodParameterDescription[] argumentsOut)
{
_argumentsOut = argumentsOut;
}
private string Format(params MethodParameterDescription[] prm)
{
IList<MethodParameterDescription> lst = (prm ?? new MethodParameterDescription[0]).ToList();
if (lst.Any())
{
var sb = new StringBuilder();
sb.Append("payload: ");
int count = lst.Count, t0 = count - 1;
for (int i = 0; i < count; i++)
{
sb.AppendFormat(_fp, "({0}) -> {1} = {2}", i + 1, lst[i].Name, lst[i].Value == null ? ValueNull : lst[i].Value);
sb.Append(i < t0 ? "; " : ".");
}
return sb.ToString();
}
return string.Empty;
}
}
public class MethodParameterDescription
{
private readonly string _name;
private readonly object _value;
public MethodParameterDescription(string name, object value)
{
_name = name;
_value = value;
}
public string Name
{
get { return _name; }
}
public object Value
{
get { return _value; }
}
}