[C#] Micro Benchmarking

freezzer

Grünschnabel
Hallo,
ich beschäftige mich seit einigen tagen mit dem thema micro benchmarking.
bin nun gestern auf NUnit gestoßen, was an sich eine gute sache ist.
Nun ich brauch keine oberfläche ich will eigentlich nur den part zwischen Attribut über methode schreiben und dem etwas unscheinbaren feld Time: in nunit haben, also ich will meine methode zum testen einer anderen methode markieren also sagen du sollst gemessen werden und die zeit dies braucht dann aber gerne in einer .txt datei.

versteht ihr was ich meine?

nun also habe ich mich ans werk gemacht, bin dabei dann aber auf ein blödes problem gestoßen: ich benutz die stopwatch, starte die, rufe invoke auf und stoppe die stopwatch wieder. nun in der heutigen zeit, multithreading, schön und gut nur der wartet nich drauf dass mein invoke fertig is mit zeit stoppen und misst immer zwischen 5 und 8 ms obwohl meine kleine testmethode mit ner wüsten berechnung 3 sekunden braucht.

hat jemand eine idee wie ich mein problem lösen oder umgehen kann?
ist mein ansatz von grud auf falsch?
bin ich überhaupt im richtigen forum gelandet? :-D

falls jemand was weiß was mir hilft bitte sags mir ^^

gruß
freezzer

btw hab die sufu kurz benutzt zum thema "benchmark" hab ich jetzt nix gesehn was so aussieht als würd es mein problem lösen ... bitte nicht köpfen falls ich was nich gesehn hab
 
Ich würde an das Control was invoked wird ein Ereignis anbinden das gefeuert wird wenn der Invoke fertig ist .
Der Event sollte dann die StopWatch stoppen und die Zeit ausgeben.

Gruß
 
hab grad versucht des zu machen aber hab sowas noch nie gemacht und irgendwie klappts nicht so ganz ... ich hab da noch so ein kleines verständnisproblem, der entsprechende abschnitt der geändert werde muss is der:

Code:
 ...
Type mType = Assembly.GetCallingAssembly( ).GetType( );
         
 MethodInfo mMInfo = mType.GetMethod( pMethodName );
            try {
                mStopWatch.Start( );                
                mMInfo.Invoke( pMethodName, mMInfo.GetParameters( ) );
                mStopWatch.Stop( );
            } catch {
            } // end try-catch
            return mStopWatch.ElapsedMilliseconds;
...

da brauch ich jetzt nen delegaten für Invoke, oder?
also irgendwie so:

Code:
public delegate object Invoke(object pObj, object[] pParms);

und nen event:

Code:
public event Invoke Invoked;

und dann müsste ich irgendwem ein neues event hinzufügen mit

Code:
keineahnung += new EventHandler(OnInvoked);

die OnInvoked methode sähe irgendwie so aus:

Code:
private void OnInvoked(object pSender, EventArgs pE){
if(Invoked != null){
// hier dann zeit anhalten? wo wird sie eigentlich gestartet
}
}

seh ich das so weit richtig?
wie gesagt hab sowas noch nich gemacht hab mir zwar beispiele angeschaut nur irgendwie bin ich grad verwirrt

gruß,
freezzer
 
habs gelöst war nen sau blöder fehler von mir mein MethodInfo war immer null hab jetzt so instanziert:
Code:
Type mType = Type.GetType( mClass ); 
MethodInfo mMInfo = mType.GetMethod( pMethodName );

dann hab ich noch
Code:
 [STAThread]
über meine methode die die zeit misst gesetzt weiß nicht obs jetzt speziell daran mit unter lag wegen multithreading aber es funktioniert so wie es da steht, also zur vollständigkeit meine ganze methode:

Code:
 [STAThread]
private long GetTakenTime( string pMethodName ) {
            mStopWatch = new Stopwatch( );

            GC.Collect( );
            GC.WaitForPendingFinalizers( );
            GC.Collect( );
            Type mType = Type.GetType( mClass ); 

            MethodInfo mMInfo = mType.GetMethod( pMethodName );
            if( mMInfo != null ) {
                try {
                    mStopWatch.Start( );
                    mMInfo.Invoke( pMethodName, mMInfo.GetParameters( ) );
                    mStopWatch.Stop( );
                } catch {
                } // end try-catch
                return mStopWatch.ElapsedMilliseconds;
            } // end if
            return 0;
        } // end method

kann gut sein dass die schlecht programmiert is aba ganz erlich ich bin jetzt happy und es ist mir egal falls es hässlich programmiert ist ^^

gruß,
freezzer

EDIT: weil ich vergessen hab das [STAThread] mit zu kopieren ;-)
 

Neue Beiträge

Zurück