Toon posts:

[delphi] optimalisatie probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een programmaatje dat nog wel wat snelheid kan gebruiken.
Ik heb een grote array of byte daar wil op elke willekeurig plaats een byte,word of cardinal uitlezen. Dat lukt op zich wel maar als ik bekijk wat de compiler er van maakt dan vrees ik toch dat de optimizer er niet slim genoeg voor is.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
 VAR
ba : array[0..veel] of byte;
w : word;
c : cardinal;
n : integer;

begin
...........
w := ba[n] shl 8 + ba[n+1];

...........

c := ba[n] shl 24 + ba[n+1] shl 16 + ba[n+2] shl 8 +ba[n+3]

Dit zou sneller moeten kunnen maar hoe?
ps c++ en assambler zijn (voorlopig nog) geen optie voor mij.

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 00:36
Ik denk dat je dan toch aan de gang moet met ASM, want volgens mij gaat de compiler er nooit wat van snappen.. Ik zou zeggen, zoek wat x86 ASM doc's op het net op en ga aan de slag :)

Verwijderd

Misschien kun je beter move gebruiken, dus
code:
1
2
3
4
5
  Move(ba[n], w, 2);
  Move(ba[n], C, 4);
  { of }
  PWord(@ba[n])^ := 10;
  w := PWord(@ba[n])^;

Je moet er dan wel op letten wat de high/low byte is.

En 'or' is denk ik sneller dan '+'.

Verwijderd

Topicstarter
Op donderdag 31 januari 2002 15:33 schreef DiFool het volgende:
Misschien kun je beter move gebruiken, dus
En 'or' is denk ik sneller dan '+'.
move is niet sneller want het is een functie die ook nog een paar controles uitvoert.
Het gebruik van or is wel een beetje sneller dan + :)

  • RickN
  • Registratie: December 2001
  • Laatst online: 14-06-2025
Kun je niet een pointer naar een cardinal of word nemen. Zo'n pointer vervolgens laten wijzen naar de eerste byte van de waarde die je wilt lezen, em dan dereferencen en het resultaat toekennen aan een variable van het gewenste type. Ik denk dat zoiets iig in C wel zou kunnen en ook redelijk snel zou zijn.

edit:

Dit is dus eigenlijk wat DiFool na zijn '{of}' assertie vertelt. Had ik niet gezien.


[edit2]
Het werkt.
[/edit2]

He who knows only his own side of the case knows little of that.


Verwijderd

Topicstarter
Zo eindelijk heb ik de beste oplossing voor dat probleem gevonden het is niet mooi maar ja ik kan er ook niks aan doen doen dat words en integers op die rare manier in het geheugen worden op geslagen.
code:
1
2
3
4
5
6
var
c,n : cardinal
ba : array[0..veel] of byte;

c := Pcardinal(@ba[n])^;
c := (swap(c mod 65536) shl 16) or swap(c shr 16));
Pagina: 1