Hi
wir haben leider keine Ahnung wie groß eine Referenz bei der 1200/1500 ist. Bei der 300/400 war das entweder 6 (pointer) oder 10 (any) Bytes. Bei den neuen bekommt man leider keine, nicht mal indirekte - über den Platz im DB, Hinweise darauf wie viele Bytes das kostet. Der DB tut so als würden die Referenzen gar nix kosten. Das glaub ich nicht, denn S. muss ja immer noch das nehmen, was MIPS, Intel, ARM, Renesas oder sonstwer in die µ-Controller einbaut. Aber genau darin, liegt vermutlich der Vorteil. Wenn man uns nicht verrät was es ist, dann können die das bei der 1214 anders wie bei der 1215 anders wie bei der 1513 und bei der 1518 nochmal anders machen. Irgendwie wird ein Zeiger übergeben. Der ist dann vermutlich eben nur 4 Bytes groß. Und nun kann man ohne das Gehampel mit DB und Adressregister einfach mit dem was die Hardware hergibt indirekt zugreifen. Das ist auf jeden Fall schneller als bei der 400. Problematisch ist nun jedoch der Aufbau eines Zeigers. Hier muss irgendwie immer noch geprüft werden. Aber eben nur einmal, draußen, bei der Parameterübergabe. Wenn ich mir das so überlege, ist das vermutlich der Grund für das mitunter so lästige konsistente Download.
Ich hab mal heute ein bisschen gemessen. Wie viele Calls schafft die 1516 in 100ms? Sehr schwierig raus zu finden. Die Ergebnisse schwanken wie verrückt. Auf dem weg nach Hause - im Stau :-( kam mir dann der Gedanke, dass das vermutlich daran liegt, dass ich das im OB1, der ja mit einer recht niedrigen Priorität läuft, liegt und durch alles mögliche unterbrochen wird, gemessen habe. Trotzdem, was kommt so bei raus?
Der Bausteinaufruf eines leeren Bausteins CALL FC1() oder CALL FB1, DB1() braucht rund 700µs.
Der direkte Zugriff auf ein Element in einem globalen DB DB2.bool1 braucht rund 30ns.
Der direkte Zugriff auf ein Element in der Instanz #s_int1 braucht rund 35ns.
Dann habe ich mir einen UDT aus bool, int, real gemacht und dieses im DB2 verwendet und in der stat des FB verwendet.
Der direkte Zugriff auf ein Element in einem globalen DB DB2.udt1.bool1 braucht rund 30ns. Der Datentyp scheint keine große Rolle zu spielen -- war alles innerhalb der Schwankung.
Der direkte Zugriff auf ein Element in der Instanz #s_udt1.int1 braucht rund 35ns.
Nun habe ich die Schnittstelle erweitert und den DB2.udt1 an einen io Parameter des FB1 übergeben ohne darauf zuzugreifen.
Die Übergabe des DB2.udt1 braucht rund 15µs. Manchmal aber auch nur 4µs -- das verstehe ich nicht.
Und als nächstes ein Zugriff auf diesen Parameter #io_udt1.int1 braucht rund 35ns.
Nun habe ich die Schnittstelle erweitert und den DB2.udt1 an einen i Parameter des FB1 übergeben ohne darauf zuzugreifen.
Die Übergabe des DB2.udt1 braucht rund 120ns -- hier wird der udt aus dem DB2 in den DB1 kopiert, wie man in einer Beobachtungstabelle sehen kann.
Und als nächstes ein Zugriff auf diesen Parameter #i_udt1.int1 braucht rund 35ns.
Also globale Zugriffe sind einen Tick schneller wie lokale Zugriffe.
Der Aufbau des Zeigers dauert.
Kopieren dauert aber auch.
Wenn der UDT 1000 Elemente hat, dann sollte das 30*1000 also vielleicht 30µs dauern -- kommt beim Nachmessen aber nicht raus, sondern nur 12µs.
Bei andere Gelegenheit ist mir schon mal aufgefallen, dass die Zahl der Verschachtelungen eine Rolle spielt, jedoch war das für mich nicht nachvollziehbar -- jede Messung bringt da neue Überraschungen.
Die Zugriffe auf die Referenzen sind sehr schnell. Deutlich schneller als ich das im Verhältnis zur 317 oder 416 kenne.
Wenn also viele Daten über die Schnittstelle eine Bausteins müssen, dann ist die Referenz überlegen.
Bei wenig Daten spielt es eh keine Rolle.
Alle genannten Zahlen sind wie bereits erwähnt mit einem Fehler verbunden -- von 30% bis 300%. Jede Messung bringt da neue Überraschungen. Reproduzierbar ist was anderes :-(
Genug Licht auf den Schatten geworfen?
'n schön' Tach auch
HB
PS: Ich habe ja gehofft, dass uns die V13 zum Thema VARIANT was bringt, aber ... nei nei nei .. ich bin sehr enttäuscht und noch am Messen. Was VariantPut und VariantGet wirklich machen ist noch viel schleierhafter wie die Parameterübergabe. Das dauert noch ein paar Wochen.