Menü
Off-Topic
Alle Heise-Foren > Specials > Off-Topic > Re: shifting a negative signe…
Avatar von disturbing noise ahead
  • disturbing noise ahead

805 Beiträge seit 09.12.2015

Re: shifting a negative signed value is undefined

Member of the Inner Party schrieb am 23.04.2019 08:35:

Performance auf Kosten von Exploits? Ein guter Teil des Faktors 80 kommt von diversen Argument-Checks in der "Tonnen-API", behaupte ich jetzt einfach mal.

Nein. macht es nicht.
Lass dich von meiner Überraschung mit ~0 nicht ablenken, hat damit wenig zu tun.

Die Daten liegen binary safe im aus einer Datei Speicher und sind uchar.

unsigned long long cursor = 0; ... cursor = cursor << 8 | (unsigned char) buf[pos++];

in php:

$cursor = 0; ... $cursor = $cursor << 8) | ( ord( $buf[$pos++] ) ) ;

Das Prob ist $cursor ist int (minimal 32bit) und immer signed (aka zend_long) und wegen der fehlenden Typsicherheit muss ich ord() nehmen, da php ein '0' durchaus als 0x00 interpretieren würde. Und, ich kann die volle Breite von int nicht ausnutzen.
Dieses ord() hat im Profiler im loop fast alles an Laufzeit konsumiert, und wenn man es über ein paar MB macht summiert sich das enorm.
https://github.com/php/php-src/blob/PHP-7.3/ext/standard/string.c#L2790
Das Makro RETURN_LONG macht nach x Ersetzungen ein zend_long daraus.

https://www.php.net/manual/en/function.ord.php
ord ( string $string ) : int

Plus: ich muss in php noch ein paar Klammern wahlfrei verteilen und würde zur Sicherheit eher zu viel nehmen oder alles entwirren und schrittweise machen, damit das auch irgendjemand mal lesen kann.

Bei der Rückgabe aus meinem Kram muss ich dann ggf. wieder erneut auf das Vorzeichenbehaftung aufpassen.

Nebenerkenntnisse in php:
die Funktion unpack(), wäre bei längeren Strings ggf sinnvoll gewesen, dauert wesentlich länger als das Schieben über ord()
https://www.php.net/manual/en/function.unpack.php
unpack ( string $format , string $data [, int $offset = 0 ] ) : array

und die "neuen" Typehints in php können durchaus die Laufzeit verbessern.

Bewerten
- +
Anzeige