effizient programmieren

Begonnen von hugo, 02. Januar 2008, 14:37:28

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

hugo

wir haben inden letzten wochen viele experimente gemacht routinen schneller zu machen und effizienter zu programmieren.

hier unsere erkenntnisse:

1. awl ist nicht schneller als st
speziell schleifen und komplexere konstrukte sind in st sehr effizient und werden in awl im schnitt sogar langsamer.
warum? nun ganz einfach weil auch awl nichts mit maschinencode zu tun hat sondern eine ebene über assembler liegt und auch wie st kompiliert werden muss.

2. bei allen funktionsaufrufen ist zu beachten das die funktion ins memory geladen werden muss, und danach die eingangsparameter übergeben werden müssen.
funktionsblöcke haben hier klar einen vorteil, sie bleiben im momory und die ausführung kann sofort starten, auchg müssen nur diejenigen parameter übergeben werden die sich verändert haben.
bei funktionsblöcken kann man mit var_in_out einen pointer anstelle der variable übergeben, was vor allem bei arrays und strings viel zeit sparen kann.

3. zumindest unter codesys kann man var_in_out in funktionen benutzen. dann wird auch hier nur ein pointer übergeben, und nicht die variable kopiert.
allerdings ist dies nicht standard iec61131-3 funktionsumfang und wir nutzen dies aus diesem grunde nicht.
über diese var_in_out wären auch mehrere ausgänge einer funktion realisierbar, aber wie gesagt ist nicht iec61131-3 standard und wird von uns aus diesem grunde nicht benutzt.

4. grundsätzlich ist es ein großes übel das an funktionen kein pointer übergeben werden kann. allerdings ist verständlich da dies aus sicherheitsgründen nicht vorgesehen wurde.

wer hat erfahrungen anregungen zur effizeinz? bitte posten

hugo

als optimierung der oscat wurde noch folgende massnahme durchgeführt

divisionen sind zu vermeiden.
sowohl auf cpu's mit gleitkommaeinheit als auch auf denen ohne gleitkommaeinhet benötigt eine division etwa 2-3 mal länger als eine multiplikation.

somit ist es sinnvoller ein * 0.5 als ein / 2 zu benutzen.

bei integer operationen kann häufig ein / 2 oder / 4 mit shr(x,1) bzw shr(x,2) ersetzt werden.
shift operationen benötigen auf allen cpus die wenigsten zyklen, im regelfall 1 zyklus. sie sind also mit die effizientesten überhaupt.

logischerweise kann auch ein *2 oder * 4 mit shl(x,1) bzw shl(x,2) ersetzt werden.