Ein Teil eines Programms muss prüfen, ob zwei C-Strings identisch sind, während der Suche durch eine geordnete Liste (z. B. {"AAA", "AAB", "ABA", "CLL", "CLZ"}
). Es ist möglich, dass die Liste ziemlich groß wird, so dass kleine Verbesserungen der Geschwindigkeit die Lesbarkeit beeinträchtigen. Angenommen, Sie sind auf C++ beschränkt (schlagen Sie nicht vor, zur Baugruppe zu wechseln). Wie kann das verbessert werden?C++ if Anweisung Reihenfolge
typedef char StringC[5];
void compare (const StringC stringX, const StringC stringY)
{
// use a variable so compareResult won't have to be computed twice
int compareResult = strcmp(stringX, stringY);
if (compareResult < 0) // roughly 50% chance of being true, so check this first
{
// no match. repeat with a 'lower' value string
compare(stringX, getLowerString());
}
else if (compareResult > 0) // roughly 49% chance of being true, so check this next
{
// no match. repeat with a 'higher' value string
compare(stringX, getHigherString());
}
else // roughly 1% chance of being true, so check this last
{
// match
reportMatch(stringY);
}
}
können Sie davon ausgehen, dass stringX
und stringY
sind immer gleich lang, und Sie werden keine ungültige Dateneingabe erhalten.
Von was ich verstehe, wird ein Compiler den Code so machen, dass die CPU die erste if-Anweisung überprüft und springt, wenn sie falsch ist, also wäre es am besten, wenn diese erste Aussage am wahrscheinlichsten wahr ist Sprünge stören die Pipeline. Ich habe auch gehört, dass bei einem Vergleich eine [n Intel] CPU eine Subtraktion durchführt und den Status von Flags betrachtet, ohne das Ergebnis der Subtraktion zu speichern. Wäre es möglich, die strcmp
einmal auszuführen, ohne das Ergebnis in einer Variablen zu speichern, aber dieses Ergebnis während der beiden ersten if-Anweisungen noch überprüfen zu können?
Ich würde vorschlagen, Sie zu C wechseln ++ (derzeit C-Code mit einem _touch_ von C++ Syntax). Über diesen Code Pfad Microoptimization: nicht zu raten versuchen, ** generierte Assembly ** Ausgabe überprüfen (Sie können überrascht sein ...) Auch häufiger als nicht ist ** wichtiger Eingabemuster ** (wie viele aufeinanderfolgende '< 0?) Als der gängigste Codepfad. Schlussbemerkung: Wenn Sie es in C machen, möchten Sie vielleicht 'memcmp' anstelle von' strcmp' für Strings ** fester Länge verwenden ** –
* "Möglichkeit, die strcmp einmal auszuführen, ohne das Ergebnis in einer Variablen zu speichern," * Warum?! 'strcmp' erzeugt sowieso ein Ergebnis in Form von 'int'. Eine Variable ist bereits für den Zweck zugewiesen. Sie werden nichts gewinnen, wenn Sie nicht in 'compareResult' speichern. Ihr aktueller Code scheint gut zu sein, sollten Sie C-Stil-Syntax wählen. – iammilind
'vergleichen' ist die falsche Ebene, auf der die Laufzeit Ihres Programms verbessert werden kann. Du hast erwähnt, dass es sich um eine geordnete Sequenz handelt, also wäre es viel besser, wenn du deine Sequenz (was ich denke) nicht übersegeln, sondern eine binäre Suche machen willst. Da Sie C++ verwenden, könnten Sie einen geeigneten Container verwenden (sagen Sie: 'std :: set'), der für solche algorithmischen Verbesserungen sorgt. –