Cześć,
jak zmierzyć czas wykonywania procedur / funkcji w programie?
TJvProfiler robi dokładnie to co potrzebuję ale problemem jest implementacja, bo tych funkcji / procedur mam setki i dopisanie nawet tych kilku linijek do każdej to mnóstwo pracy.
Jednak poszedłbym w tym kierunku, z tym że instrumentację zamknąłbym w jednej linii kodu.
Nie znam TJvProfiler
i nie wiem jak działa, ale...
To się na pewno da zrobić (zapakować wszystko do jednej linii kodu), np. w ten sposób:
Host.Logger.LoggerDebug.TraceMethod('TSopOrderDetApprovedLogic.diEntityAfterCreate').StartProfiler;
Zauważ, że TraceMethod
zwraca interfejs, a ten posiada metodę StartProfiler
Utworzenie tego interfejsu przygotowuje instrumentację dla danego zakresu.
Kiedy kod wychodzi z metody diEntityAfterCreate
, to niszczony jest też interfejs instrumentacji.
A więc w konstruktorze klasy implementującej interfejs instrumentacji robisz pełne przygotowanie jej.
A w destruktorze, zamykasz instrumentację dla danego zakresu (tu metody diEntityAfterCreate
).
W efekcie czego, wymaga to dopisanie jednej linii kodu do każdej metody, którą chcesz śledzić.
Poza tym, łatwo wyłączyć globalnie profilowanie, co pozwoli nie usuwać kodu profilera.
Jasne, możesz do tego też użyć dyrektywy kompilatora - jak już wygodniej.
Jest jakiś sposób aby zrobić to np. jakimś komponentem automatycznie?
Tak, można. Ten kod trzeba dopisać, ale np. CodeSite (w pełnej wersji) posiada generator kodu, który wrzuci Ci instrumentację do wybranych metod.
Ps.
Próbowałem SamplinkProfiler oraz Spider ale albo nie spełnia to moich oczekiwań albo po prostu nie umiem tego odpowiednio używać.
A to nie wiem jakie potrzeby masz ;-)