Frage zur Code Optimierung



  • Hallo zusammen,

    ich habe eine Funktion, die 100mal/sec aufgerufen wird.

    die Funktion holt Bilddaten aus aus Image buffer und und lade in Picturebox.

    soweit alles gut.

    Sobald folgendes Code zufüge, sehe ich nur die Bild-Speicherung fast 100ms dauert( siehe unten die Ausgabe:).

    Kann jemand einen Tipp geben, wie ich dieses Problem im Griff bekommen kann?

    gespeichertes Bild ist ca 500KB. Warum dauert es so lange?

    PC : AMD dual core 3,2MHZ, 4GB RAM, SATA Platte, WIN 7 Home Premium 64bit.

    if (icounter < 2000)
    {
    DateTime time_temp = DateTime.Now;
    logbook.AppendText("start :" +time_temp.Millisecond.ToString() + " ");
    m_bitmap.Save("D:\\image\" + icounter.ToString() + ".bmp");

    time_temp = DateTime.Now;
    logbook.AppendText("End :"+time_temp.Millisecond.ToString() + " ");
    logbook.Refresh();

    }

    Ausgabe :

    start :634 End :725 start :728 End :817 start :818 End :907 start :909 End :995 start :997 End :89 start :90 End :178

    😕
    Danke im Voraus



  • Ich nehme an bei

    m_bitmap.Save("D:\\image\\" + icounter.ToString() + ".bmp");
    

    wird auf die Harddisk geschrieben. Das ist immer langsam - da kannst du den Code noch lange optimieren, das bleibt langsam.



  • Dein Ansatz ist falsch. Du solltest Datenverarbeitung und GUI auf jeden Fall trennen. Das menschliche Auge kann eh nicht mehr als 24 Bilder/s unterscheiden. Du solltest einen Timer oder ähnliches verwenden, um die Daten darzustellen aber nicht ausgehen von deiner Datenverarbeitung gleich die GUI mitzuaktualisieren.



  • Ich habe GUI Aktualisierung auf 25Bilder/sec reduziert.

    macht es Sinn 6 Schreiber Threads zu haben?



  • smathi schrieb:

    macht es Sinn 6 Schreiber Threads zu haben?

    Eher nein. Auf ner traditionellen Festplatte muss dann viel öfter der Schreibkopf umpositioniert werden da jeder Thread ja andere Daten schreibt und dann kann das länger dauern als wenn man nur mit einem Thread die Daten hintereinander schreibt.



  • Da muss ich meinem Vorredner recht geben.

    Bastelt Dir da lieber einen Threadsafe Memory FIFO puffer in
    denen du die Bitmaps reinhaust und ein schreiber Thread
    holt sich die Daten nacheinander aus dem puffer und schreibt diese
    auf die platte.

    greetz



  • Ich berichte nachher ob ich erfolgreich umgesetzt habe.

    Gruß
    Mathi



  • Dir ist aber schon klar das du immer nur den ms-Teil der aktuellen Uhrzeit wegschreibst, nicht die Zeitspanne zwischen laden und speichern?

    Logg doch mal string.Format("Dauer: {0}ms", (startZeit-endZeit).TotalMilliseconds );


Anmelden zum Antworten