Подсчет времени работы функции - 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; }
     }
 }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы