415 Stimmen

Schnellster Weg, um festzustellen, ob eine ganze Zahl zwischen zwei ganzen Zahlen (einschließlich) mit bekannten Wertemengen liegt

Gibt es einen schnelleren Weg als x >= start && x <= end in C oder C++, um zu testen, ob eine Ganzzahl zwischen zwei Ganzzahlen liegt?

UPDATE: Mein spezifisches Betriebssystem ist iOS. Dies ist Teil einer Feldunschärfe-Funktion, die Pixel auf einen Kreis in einem gegebenen Quadrat beschränkt.

UPDATE: Nachdem ich die akzeptierte Antwort ausprobiert habe, erzielte ich eine Geschwindigkeitssteigerung um eine Größenordnung bei einer Codezeile gegenüber der normalen Art des Testens x >= start && x <= end.

UPDATE: Hier ist der Code nach und vorher mit Assembler aus XCode:

NEUER WEG

// diff = (end - start) + 1
#define POINT_IN_RANGE_AND_INCREMENT(p, range) ((p++ - range.start) < range.diff)

Ltmp1313:
 ldr    r0, [sp, #176] @ 4-Byte-Neuladen
 ldr    r1, [sp, #164] @ 4-Byte-Neuladen
 ldr    r0, [r0]
 ldr    r1, [r1]
 sub.w  r0, r9, r0
 cmp    r0, r1
 blo    LBB44_30

ALTER WEG

#define POINT_IN_RANGE_AND_INCREMENT(p, range) (p <= range.end && p++ >= range.start)

Ltmp1301:
 ldr    r1, [sp, #172] @ 4-Byte-Neuladen
 ldr    r1, [r1]
 cmp    r0, r1
 bls    LBB44_32
 mov    r6, r0
 b      LBB44_33
LBB44_32:
 ldr    r1, [sp, #188] @ 4-Byte-Neuladen
 adds   r6, r0, #1
Ltmp1302:
 ldr    r1, [r1]
 cmp    r0, r1
 bhs    LBB44_36

Ziemlich erstaunlich, wie eine Reduzierung oder Eliminierung von Verzweigungen eine so dramatische Geschwindigkeitssteigerung bewirken kann.

0voto

user500123 Punkte 609

Ich kann Ihnen genau sagen, warum das wichtig ist. Stellen Sie sich vor, Sie simulieren eine MMU. Sie müssen ständig sicherstellen, dass eine bestimmte Speicheradresse mit einem bestimmten Seitensatz vorhanden ist. Diese kleinen Bits addieren sich sehr schnell, weil Sie immer sagen:

  • Ist diese Adresse gültig?
  • Zu welcher Seite gehört diese Adresse?
  • Welche Rechte hat diese Seite?

-4voto

icedwater Punkte 4432

Ist es nicht möglich, einfach eine bitweise Operation auf die Ganzzahl durchzuführen?

Weil es zwischen 0 und 128 liegen muss, wenn das 8. Bit gesetzt ist (2^7), sind es 128 oder mehr. Der Randfall wird jedoch schwierig sein, da Sie einen inklusiven Vergleich wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X