All in Sight Development and Digital Life 2.0

22Mrz/110

Performance Messung unter C#

All software is current

Hallo Leute! Da ich mich momentan damit beschäftige, ein paar Funktionen einer Leistungsprüfung zu unterziehen, habe ich nach einer Möglichkeit gesucht, recht bequem die Leistung der Funktionen zu messen. Auf dem Weg bin ich auf ein paar Methoden gestoßen, welche von der WinAPI bereit gestellt werden. Da aber vielleicht noch die Möglichkeit bestehen soll, dies mit .Net-Bordmitteln zu bewerkstelligen, habe ich die primitivste Möglichkeit der Messung hinzugefügt. Und zwar über DateTime. Hier meine Kleine aber feine Lösung. Ich habe die Klasse erstmal Performance genannt, da ich diese Klasse vielleicht noch erweitere.

    using System;
    using System.Runtime.InteropServices;

    /// <summary>
    /// Klasse zu Performance-Messung im Code
    /// </summary>
    public class Performance
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="QueryPerformanceCounter"></param>
        /// <returns></returns>
        [DllImport("KERNEL32")]
        public static extern bool QueryPerformanceCounter(ref long QueryPerformanceCounter);
        /// <summary>
        ///
        /// </summary>
        /// <param name="QueryPerformanceFrequency"></param>
        /// <returns></returns>
        [DllImport("KERNEL32")]
        public static extern bool QueryPerformanceFrequency(ref long QueryPerformanceFrequency);
        /// <summary>
        /// Frequenz des PerformanceCounter
        /// </summary>
        private long Frequency;
        /// <summary>
        /// Startzeit der Messung
        /// </summary>
        private long StartTime;
        /// <summary>
        /// Endzeit der Messung
        /// </summary>
        private long EndTime;
        /// <summary>
        /// Flag zur Festlegung, ob die WindowsAPI benutzt werden soll
        /// </summary>
        private bool UseWinAPI;
        /// <summary>
        /// Konstruktor
        /// </summary>
        public Performance()
        {
            this.Initialize(true);
        }
        /// <summary>
        /// Konstruktor
        /// </summary>
        /// <param name="UseWinAPI"></param>
        public Performance(bool UseWinAPI)
        {
            this.Initialize(UseWinAPI);
        }
        /// <summary>
        /// Initialisierung
        /// </summary>
        /// <returns></returns>
        protected void Initialize(bool UseWinAPI)
        {
            this.UseWinAPI = UseWinAPI;
            this.StartTime = this.EndTime = 0;
            if (UseWinAPI) QueryPerformanceFrequency(ref this.Frequency);
            else this.Frequency = 10000000;
        }
        /// <summary>
        /// Messung starten
        /// </summary>
        public void Start()
        {
            if (this.UseWinAPI) QueryPerformanceCounter(ref this.StartTime);
            else this.StartTime = DateTime.Now.Ticks;
        }
        /// <summary>
        /// Messung beenden
        /// </summary>
        /// <returns></returns>
        public double Stop()
        {
            if (this.UseWinAPI) QueryPerformanceCounter(ref this.EndTime);
            else this.EndTime = DateTime.Now.Ticks;
            return ((this.EndTime - this.StartTime) / (double)this.Frequency);
        }
    }