Avatar billede glenn007 Nybegynder
28. februar 2009 - 08:46 Der er 9 kommentarer

timer spørgsmål

Hejsa,

Er der nogle der ligger ind med en god ide til hvordan jeg kan lave en timer der viser mig i millisikunder hvor lang tid en kode har været om at afvikles.

Jeg sidder og leger lidt med at loade billeder på en masse forskellige måder og ville mægtigt gerne se hvor effektiv min kode er med at måle i millisekunder på hver af de metoder jeg har brugt.
Avatar billede mbm2016 Nybegynder
28. februar 2009 - 12:13 #1
Avatar billede glenn007 Nybegynder
28. februar 2009 - 12:59 #2
hmm den kan jo ikke gå ind i MIT program og se hvad der foregår.  måler den ikke kune hele programmet.  ville gerne i mit program kunne trykke på en knap og den starter alle tråde og så kommer frem med et resultat i tid pr kode stump

bare lidt alla en normal timer men bare hvor den måler i millisekunder da det jo går stærkt
Avatar billede glenn007 Nybegynder
28. februar 2009 - 13:12 #3
undskyld var vist for hurtig... det kan den tydeligvis
Avatar billede glenn007 Nybegynder
28. februar 2009 - 13:24 #4
havde dog forestillet mig en lidt mere simpel styk kode jeg kunne kompile i min kode uden videre
Avatar billede arne_v Ekspert
28. februar 2009 - 13:35 #5
Jeg bruger ofte:

DateTime dt1 = DateTime.Now;
// gør noget der tager tid - helst over et sekund
DateTime dt2 = DateTime.Now;
double delta = (dt2 - dt1).TotalSeconds;

Men der er andre muligheder i .NET frameworket også.
Avatar billede mbm2016 Nybegynder
28. februar 2009 - 13:54 #6
En normal timer f.eks. System.Windows.Forms.Timer har en egenskab der hedder Interval som er lig med millisekunder.

Men det passer ikke helt, så det er bedst at gøre det i hundrede dele.

Så hvis du laver en Timer og sætter Interval til 100, så vil den ved hver hundrede del af et sekund udfører en bestemt opgave som er defineret i Timerens EventHandler Tick.

Og så kan du jo før du kører en kodestump starte timeren, og derefter stoppe timeren igen, og så omregne resultatet til millisekunder og dermed se hvor lang tid det tog. (Dene rikke helt præcis), til det kunne du bruge System.Threading.Timer

Lille eksempel(kan ikke kompileres direkte):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;

namespace TilGlennProjekt
{
    public partial class Form1 : Form
    {
        public static double res = 0;
        public static double resultat = 0;
        public Form1()
        {
            InitializeComponent();
            StartTimerenOgTråden();

        }
        public static Timer t = new Timer();
           
        public void StartTimerenOgTråden()
        {
            t.Tick += new EventHandler(t_Tick);
            t.Interval = 100;
            t.Start();
            System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ThreadStart(Tråd));
            thr.Start();
        }

        void Tråd()
        {
           
            WebClient wb = new WebClient();
            string indhold = wb.DownloadString("http://www.microsoft.dk");


            //Kodeslut
            t.Stop();
            resultat = ((double)res / (double)10) * (double)1000;
            MessageBox.Show("Det tog " + resultat + " millisekunder at køre dette kodestykke.");
        }

        void t_Tick(object sender, EventArgs e)
        {
            // Dette kodestykke udføres hvert millisekund når timeren er startet.
            res++;
        }
    }
}
Avatar billede aaberg Nybegynder
28. februar 2009 - 22:16 #7
Hvis du ønsker at have en nogenlunde præcis måling, bør du ikke bruge forslaget som mbm2007 kommer med. For det første mener jeg det er totalt overkill at begynde med multithreading, for at måle hvor lang tid en metode tager at køre. For det andet, så kan du ikke regne med at der går 100ms imellem hver timer-tick. For det tredje får du en usikkerhed på 100 ms.

Det forslag arne_v kommer med er 100 gange simplere og viser tiden mere præcist. Denne måde at gøre det på, har dog en opløsning på ca 16 ms. Det vil sige, hvis en metode tager 10 ms, og en anden metode tager 20 ms, vil de begge rapportere at de tager 16 ms. Dette er en begrænsning i timeren som som DateTime klassen bruger.

Nogle computere (alle nye computere) har en "high performance counter". Dette er en timer med meget højere opløsning. System.Diagnostics.Stopwatch klassen kan bruge computeren high performance counter. Hvis computeren ikke har en High performance counter, bruger den system timeren.

Her er et eksempel copy/pasted fra MSDN:

using System;
using System.Diagnostics;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        SomeMethod(); //Det er denne metode du måler tiden på.
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine(elapsedTime, "RunTime");
    }
}


Du kan læse mere om StopWatch klassen her:
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx
Avatar billede arne_v Ekspert
01. marts 2009 - 20:31 #8
Jeg vil generelt anbefale at man gentager operationen så mange gange at opløsningen ikke betyder noget.

Det løser nemlig et andet problem. Der kan jo godt køre andre tings mens man laver sin test. Hvis en email klient lige henter email kan du godt påvirke tid i XX millisekunders klassen en del, mens det vil uden betydning for tid i X sekunders klassen.
Avatar billede arne_v Ekspert
01. marts 2009 - 20:31 #9
Timeren er en meget dårlig måde at måle tid på. Den vil tælle et sted melle 0% og 95% forkert alt afhængigt af interval.

95% forkert er ligesom noget der vil noget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester