1 Востаннє редагувалося Betterthanyou (09.09.2019 14:24:59)

Тема: Отримати час виконання для кожного методу

Як отримати час виконання кожного методу.
Наприклад:

class Program
    {
        void method1()
        {
        }

        void method2()
        {
            
        }

        void m()
        {
            method1();
            method2();
        }

        static void Main(string[] args)
        {

            StackTrace stackTrace = new StackTrace();           // get call stack
            StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)


            new Program().m();

            // write call stack method names
            foreach (StackFrame stackFrame in stackFrames)
            {
                Console.WriteLine(stackFrame.GetMethod().Name);   // write method name
            }

            Console.ReadKey();
        }
        

    }

Я хочу отримати: назву методу / час початку роботи / час завершення роботи
Ось так:
Main 09.09.2019 15:18:352 09.09.2019 15:18:353
m 09.09.2019 15:18:352 09.09.2019 15:18:353
method1 09.09.2019 15:18:354 09.09.2019 15:18:354
method2 09.09.2019 15:18:355 09.09.2019 15:18:355

Це можливо зробити за допомогою засобів C# ? Якщо так, то як

(звичайно я розумію що можна в кожний метод добавити таймер на початку, а в кінці збереження результату, але це не зручно)

2 Востаннє редагувалося koala (09.09.2019 14:29:18)

Re: Отримати час виконання для кожного методу

Почніть з https://docs.microsoft.com/uk-ua/visual … ew=vs-2019

3 Востаннє редагувалося Betterthanyou (09.09.2019 14:56:37)

Re: Отримати час виконання для кожного методу

Мені потрібно цю всю інформацію зберігати до бази даних, тобто не під час відлагодження, а вже в реліз версії (як логі)

4

Re: Отримати час виконання для кожного методу

А в цих ваших шарпах ніяк не можна викликати щось при виході з функції? У плюсах деструктор може скидати, що треба, тоді лише один рядок додати до кожної вимірюваної функції.

5

Re: Отримати час виконання для кожного методу

Y c# є Finalizers https://docs.microsoft.com/en-us/dotnet … estructors

Але я не зрозумів ідею з деструктором... можна більш детальніше, будь ласка, описати

6

Re: Отримати час виконання для кожного методу

Можу порекомендувати глянути в бік АОП.
https://www.c-sharpcorner.com/article/a … patchproxy
Не готовий щось рекомендувати для C#, досвіду нема, але думаю щось однозначно має бути.

Подякували: Betterthanyou1

7

Re: Отримати час виконання для кожного методу

Якщо там є АОП, то, мабуть, таки варто в його бік дивитися.
Я глянув швидкоруч - є using/IDisposable, і можна робити так:
1. Створюєте клас, скажімо, TimeMeasurement: IDisposable
2. В конструкторі прописуєте, щоб він зберігав поточний час і через рефлексії/параметри конструктора - ім'я функції, що його викликала і подібне
3. В Dispose прописуєте, щоб він обчислював час роботи і пхав його у ваш лог
4. В усіх функціях, які ви хочете профайлити, додаєте

void MyMethod(params ...)
{
   using (TimeMeasurement _timeMeasurement = new TimeMeasurement(ім'я_функції)) {
      тут тіло функції
   } //гарантовано при виході - виключних ситуаціях, різних return-ах і т.д. - тут викликається _timeMeasurement.Dispose
}
Подякували: Betterthanyou1

8

Re: Отримати час виконання для кожного методу

Я нагуглив таку штуку https://github.com/Fody/MethodTimer незнаю як воно точно працює але в кінцевому етапі воно в іл код інжектить свій.


Цей контент доступний тільки зареєстрованим користувачам.

Я тут швиденько приклад зробив ніби працює.

Подякували: Betterthanyou1

9

Re: Отримати час виконання для кожного методу

truesupport написав:

Я нагуглив таку штуку https://github.com/Fody/MethodTimer незнаю як воно точно працює але в кінцевому етапі воно в іл код інжектить свій.


Цей контент доступний тільки зареєстрованим користувачам.

Я тут швиденько приклад зробив ніби працює.

Цікаве рішення. Але я б остерігся юзати в комерційному проекті щось, що "в темну" інжектить додатковий код прямо в IL
Хіба що з рекомендацією від MS 8)

Надійніший варіант - від koala

Подякували: Betterthanyou1