Hallo,
soweit ich weiß, werden von (konstanten) Eingängen an Schleifen bei jeder Iteration Kopien angelegt.
Ist es daher gängig bzw. sinnvoll, diese durch Schieberegister zu ersetzen?
Ich würde sagen: Ja
Bin mir aber nicht ganz sicher, da ich das bisher so nicht gesehen habe. Oder mir ist es nie aufgefallen.
Das Pufferzuweisungs-Tool hilft hier leider nicht weiter.
Ich habe 2 Beispiele angehängt, die das verdeutlichen (oben jeweils ohne Schieberegister, darunter mit).
Über den Sinn und Unsinn des Codes müssen wir nicht diskutieren. Das ist ledichlich zur Verdeutlichung gedacht.
[
attachment=29380]
[
attachment=29381]
Grüße
Hallo Mecha,
"soweit ich weiß, werden von (konstanten) Eingängen an Schleifen bei jeder Iteration Kopien angelegt."
Dies ist m.M.n. falsch. Wie man durch ConstantFolding gut sieht, wird bei konstanten Eingängen einmalig eine Kopie angelegt, die dann in jeder Iteration benutzt wird. (Es muss nicht mal eine Kopie sein...) Ein SR erzeugt halt nur unnötigen Overhead in einem solchen Fall... Konstanten einfach außerhalb der Schleife anlegen, fertig!
Hallo Gerd,
danke. Du hast Recht.
Schieberegister haben einen großen Overhead, wie folgendes VI zeigt:
[
attachment=29382]
Ohne Schieberegister dauert die Messung ca. 12.700 ms, mit Schieberegistern ca. 12.815 ms, aalso rund 100 ms länger.
Grüße
Hallo Mecha,
noch ein Nachtrag: Warum benutzt du bei der Array-Initialisierung SRs und ReplaceArrayElement? Bei einer FOR-Loop mit bekanntem N ist LabVIEW so smart, solche Array effizient selbst anzulegen, sobald du AutoIndeing benutzt...
Gute Frage, wieso ich das hier gemacht habe. Sonst nutze ich Auto-Indexing, wie man in der rechten Schleife sieht. *g*
' schrieb:Ohne Schieberegister dauert die Messung ca. 12.700 ms, mit Schieberegistern ca. 12.815 ms, aalso rund 100 ms länger.
Wie häufig hast du die Messung laufen lassen? Während 12 Sekunden kann ein normales Windowssystem viel nebenbei gemacht haben.
' schrieb:Wie häufig hast du die Messung laufen lassen? Während 12 Sekunden kann ein normales Windowssystem viel nebenbei gemacht haben.
Jeweils ca. 10 Mal, auch abwechselnd. Die Werte waren alle reproduzierbar (+/- wenige Millisekunden).
Ich weiss nicht was du gemessen hast bzw. wo LV Teile rausoptimiert hat, aber das Ausgangsterminal wurde in deinem Code sicher nicht komplett angelegt (es sei denn Du benutzt LV 64bit und hast richtig viel RAM im Rechner).
Mal so überschlagsweise:
X*Y*sizeof(DBL)
50000*50000*8B = 19073 MB = 18,6 GB
Anbei ein leicht abgeänderter Benchmarkversuch
[
attachment=29406] LV2010
Hm, also das gestern lief irgendwie.
Deins zeigt im Endeffekt überall die gleichen Werte an. Setze ich die Größe deutlich rauf, ist der Speicher voll.
' schrieb:Mal so überschlagsweise:
X*Y*sizeof(DBL)
50000*50000*8B = 19073 MB = 18,6 GB
Wieso 50000
*50000 ?
Ich seh in dem Screenshot ein boolsches 1D-Array und ein dbl 1D-Array ... aber kein dbl 2D-Array mit 50k*50k...
Gruß SeBa