was ist schneller und wieviel index oder pointer auf array?



  • Hi Dot !!
    Es handelt sich um recht komplexe Probleme.
    Die Rechenzeit ist mit normalen Arrayoperationen jedenfalls viel zu lang.
    Es muss doch Wege geben sowas zu beschleunigen.
    ZB dauert ein Gaussfilter unter Neurocheck nur ein paar ms und bei meinem Prog mindestens 10mal so lang.
    Ich hab nur keine Ahnung wie das von Software-Schmieden gelöst wird..

    MFG T



  • ghostwhisperer schrieb:

    ZB dauert ein Gaussfilter unter Neurocheck nur ein paar ms und bei meinem Prog mindestens 10mal so lang.

    Gaußfilter sind linear separierbar, d.h. du kannst statt einem 2D Gaussfilter einen 1D Gaussfilter erst in x- und dann auf das Ergebnis in y-Richtung anwenden und bekommst das gleiche Ergebnis, die Laufzeitkomplexität des Ganzen reduziert sich aber um eine Größenordnung. Ansonsten kann man natürlich auch z.B. eben mit unsafe Code arbeiten oder die entsprechenden Programmteile in C++ schreiben...



  • Ich denke es würde sich für dich lohnen, mal einen Profiler (z.B. den EQATEC Profiler) über dein Projekt laufen zu lassen und somit die kritischen Stellen zu identifizieren.
    Ansonsten kann man nur mutmaßen, wo bei deinem Code das Problem liegt. Dass die Laufzeit so enorm viel schlechter als erwartet ist, deutet jedoch darauf hin, dass Teile des Codes nicht optimal mit .NET umgesetzt wurden.



  • Naja, wenn er jetzt O(n²) hat wo es eigentlich mit O(n) ginge...da ist einfach rein algorithmisch noch soviel zu holen dass ich mir über irgendwelche low-level Optimierungen noch nicht wirklich den Kopf zerbrechen würde...



  • Klar. Zwischen quadratischer und linearer Laufzeit liegt dann doch ein kleiner Unterschied 😉 Aber wie gesagt.. man kann nur mutmaßen ob das Problem algorithmischer oder "implementationstechnischer" Natur ist.



  • Beides !
    Ich hab erstmal die offensichtlichen Ansätze gewählt. Ich hab auch keine Ahnung wo mans anders (besser?) machen kann.
    Ich weiss net, ob ich den Code posten soll. Ist doch recht umfangreich.



  • ghostwhisperer schrieb:

    Ich weiss net, ob ich den Code posten soll. Ist doch recht umfangreich.

    Lieber nicht posten... wenn, dann als zip iwo bereitstellen. Aber ich würde erstmal mit dem Profiler drüber.



  • geht grad nicht. hab keine Admin-Rechte..

    Komme später nochmal drauf zurück !!



  • ghostwhisperer schrieb:

    Ich hab auch keine Ahnung wo mans anders (besser?) machen kann.

    Ich hab doch schon in meinem letzten Post geschrieben wie dus drastisch besser machen kannst!?



  • dot schrieb:

    ghostwhisperer schrieb:

    ZB dauert ein Gaussfilter unter Neurocheck nur ein paar ms und bei meinem Prog mindestens 10mal so lang.

    Gaußfilter sind linear separierbar, d.h. du kannst statt einem 2D Gaussfilter einen 1D Gaussfilter erst in x- und dann auf das Ergebnis in y-Richtung anwenden und bekommst das gleiche Ergebnis, die Laufzeitkomplexität des Ganzen reduziert sich aber um eine Größenordnung. Ansonsten kann man natürlich auch z.B. eben mit unsafe Code arbeiten oder die entsprechenden Programmteile in C++ schreiben...

    Ich seh nicht was das bringen soll..
    Um ALLE Punkte eines Bildes zu erreichen MUSS ich x und y indexieren.
    Und nach deinem Vorschlag sogar 2 mal.
    Der einzige Unterschied, den ich sehe ist, dass der Kernel nur linear ist statt zweidimensional.
    Nehmen wir mal Bild(1024*768) ein m^2=5*5 Kernel und ein m=15 Kernel:
    Jeder Punkt kommt pro Indexierung im ersten Fall glaub schlimmstenfalls 25mal dran.
    Das bedingt, wenn ich nicht irre, O(1*n*m^2) t1=1,96608*10^7*dt.
    Im anderen Fall O(2*n*m) t2=0,786432*10^7*dt
    t2=0,4
    t1
    oha.................
    Hab ich das richtig gerechnet? Wär dat mehr als doppelt so schnell??
    Pardon Dot



  • ghostwhisperer schrieb:

    Hab ich das richtig gerechnet? Wär dat mehr als doppelt so schnell??

    Ja und z.B. für nen 10x10 Filter wärs schon 5x so schnell. "Nur linear statt zweidimensional" macht eben doch einen riesen Unterschied 😉


Anmelden zum Antworten