4

VB6アプリケーションでは、関数に費やされた時間を追跡するためのユーティリティ関数をいくつか追加しました。パフォーマンスのボトルネックを追跡するためにこれを行いました。vb.netでの関数呼び出しの追跡時間

基本的には、2つのユーティリティ関数StartTickCount()とEndTickCount()がありました。 StartTickCount()が呼び出されたときにはティックカウントを取得するためにディクショナリを使用し、EndTickCount()が呼び出されたときにはティックカウントを減算します。これは完璧ではありませんでした。なぜなら、ティックカウントに時間がかかるなどの呼び出しは考慮しなかったのですが、基本的には私たちの目的のために働いていました。バット部分の痛みは、各出口点での各機能とEndTickCount()の先頭にStartTickCount()を呼び出してください作っていました:とにかく

Private Function SomeFuction() as String 
    ' indicate the function started 
    StartTickCount("MyClass.SomeFunction") 


    ' some logic that causes the function to end 
    If (some logic) Then 
     EndTickCount("MyClass.SomeFunction") 
     Return "Hello!" 
    End If 

    ' final exit point 
    EndTickCount("MyClass.SomeFunction") 
    Return "World" 
End Function 

、内蔵任意の機能は、いずれかのVS 2010を通じて、そこにありますデバッガまたはSystem.Reflection名前空間で、VB.NETで同様のことをするには?

基本的には、各関数が呼び出された回数、その関数で費やされた時間の合計、その関数で費やされた平均秒数、および関数で費やされた最大時間をログに記録します。その関数内の単一の呼び出し。

私は確かにこれを手書きで書くことができます(既にVB6で1回行ったので)。しかし、既存のツールを使用して簡単にすると、むしろ使いたいと思います。

+0

考えがありますプロファイラ? –

+0

プロファイラーのようなサウンドは、少なくともデバッグモードで動作していると動作します。しかし、クライアントサーバ(VS2010ツールを持たない)で性能をチェックする必要があるかもしれないので、コーディングオプションもありますか? –

答えて

3

私はストップウォッチクラスを見ています。このタイプのもののために設計されています。

しかし、これを行うには素晴らしいツールがあります。実際には、ほとんど仕事をしていないと、より良い仕事をします。それにも10日間の無料試用版があります。

http://www.jetbrains.com/profiler/

(私は動作しないとジェットブレーンズと提携していないのです - しかし、彼らはいくつかの本当にクールな製品を作るので、私は私がいたことを望む)

+1

StopwatchクラスのMSDN URL:https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch%28v=vs.100%29.aspx。 –

6

あなたのニーズに次のコードを適応/修正することによって、同じ結果を得ることができます。

'Create a variable for start time: 
    Dim TimerStart As DateTime 
    TimerStart = Now 
' 
'place your computing here 
' 
    Dim TimeSpent As System.TimeSpan 
    TimeSpent = Now.Subtract(TimerStart) 
    MsgBox(TimeSpent.TotalSeconds & " seconds spent on this task") 

あなたはミリ秒単位で、または他の形式で時刻を直接取得するためのTimeSpanについてのドキュメントを確認することができます。

2

あなたは、いくつかのプロファイリングを追加する必要があるようですねあなたの申請。 beginner's guide to profiling with VSから始めたいと思うかもしれません。

実行時メトリックのためにアプリケーションにパフォーマンスカウンターを追加することもできます。 http://msdn.microsoft.com/en-us/library/w8f5kw2e(v=vs.100).aspxを参照してください。

ツールとテクニックの完全な一覧については、http://msdn.microsoft.com/en-us/magazine/hh288073.aspxを参照してください。

0

このヘルパークラスを使用しています。それは基本的に@AndreaAntonangeliが示唆されたがクリーンなコードを持つように配置されたものを行います。使用の

Public Class TimeSpanHelper 

    Dim caller_name As String 
    Dim timer_start As DateTime 
    Dim time_spent As System.TimeSpan 
    Dim prev_time As DateTime 
    Dim time_diff As System.TimeSpan 

    Public Sub New(caller As String) 
     caller_name = caller 
    End Sub 

    Public Sub startClock() 
     timer_start = DateTime.Now 
     Console.WriteLine(caller_name & " starts at:" & timer_start.ToString) 
     prev_time = timer_start 
    End Sub 

    Public Sub getElapsedTime(Optional flag As String = "") 
     time_spent = Now.Subtract(timer_start) 
     time_diff = Now.Subtract(prev_time) 
     prev_time = DateTime.Now 
     Console.WriteLine(caller_name & "-" & flag & " " & time_spent.TotalSeconds & "s from start (" & time_diff.TotalSeconds & "s from previous flag)") 
    End Sub 

    Public Sub stopClock() 
     Dim timer_stop As DateTime = DateTime.Now 
     time_spent = Now.Subtract(timer_start) 
     time_diff = Now.Subtract(prev_time) 
     Console.WriteLine(caller_name & " ends at:" & timer_stop.ToString & " - " & time_spent.TotalSeconds & " seconds elapsed from start (" & time_diff.TotalSeconds & "s from previous flag)") 
    End Sub 

End Class 

例:

'Put this wherever you want to start to count 
Dim timer As TimeSpanHelper = New TimeSpanHelper("MyFunctionName") 
timer.startClock() 
'Do something ... 
timer.getElapsedTime("flag1") 
'Do something ... 
timer.getElapsedTime("flag2") 
'Do something ... 
timer.stopClock() 

あなたの出力のようなものでなければなりません:あなたは使用して

MyFunctionName starts at 30/03/2017 16:57:21 
MyFunctionName - flag1 Xs from start (Xs from previous flag) 
MyFunctionName - flag2 Xs from start (Xs from previous flag) 
MyFunctionName ends at 30/03/2017 16:59:14 - 120s elapsed from start (Xs from previous flag) 
関連する問題