Frage

list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

Die Frage ist, warum "N*" wenn substr Sollte 4 Bytes zurückkehren und sie werden als n ausgepackt? Und warum doppelte Aufgabe?

Aktualisierung: Dieser Code ist Teil von Sphinx Native PHP -Anschluss. Nach einigen Code-Hacking wurde klar, dass dieser Code 4-Byte-Ganzzahl extrahiert. Aber Logik hinter der Doppelzuweisung und substr / N* ist mir immer noch unklar. Ich biete ein Kopfgeld an, um es endlich zu verstehen.

War es hilfreich?

Lösung

Wir müssten die Revisionsgeschichte der Datei sehen, aber einige Möglichkeiten sind:

  1. Dies sind die Überreste eines früheren Algorithmus, der nach und nach die Funktionalität beraubt, aber nie aufgeräumt wurde.
  2. Es ist der typische Spaghetti -Code, den wir alle nach einer schlechten Nacht produzieren.
  3. Es ist eine Optimierung, die den Code für große Eingangszeichenfolgen beschleunigt.

Dies sind alles Synonyme:

<?php

$packed = pack('N*', 100, 200, 300);

// 1
var_dump( unpack('N*', $packed) );

// 2
var_dump( unpack('N*', substr($packed, 0, 4)) );
var_dump( unpack('N*', substr($packed, 4, 4)) );
var_dump( unpack('N*', substr($packed, 8, 4)) );

// 3
var_dump( unpack('N', substr($packed, 0, 4)) );
var_dump( unpack('N', substr($packed, 4, 4)) );
var_dump( unpack('N', substr($packed, 8, 4)) );

?>

Ich habe die typische Repeat-tausend-mal-Benchmark mit drei Ganzzahlen und 1 ist viel schneller. Ein ähnlicher Test mit 10.000 Ganzzahlen zeigt dies jedoch 1 ist das langsamste:-!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

Als Volltext-Engine, bei dem Leistung ein Muss ist, würde ich es wagen zu sagen, dass es eine Optimierung ist.

Andere Tipps

Der Code ist wahrscheinlich ein Fehler. Diese Art von Schleife ist genau der Grund warum * existiert ...

pack ("n*", substr ($ response, $ p, 4));

Gibt das Format an, das beim Auspacken der Daten von substr () verwendet werden soll.

N - nicht signiert lang, immer 32 Bit, Big Endian Byte Order

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top