Optimieren eines Suchalgorithmus in C

8

Kann die Leistung dieses sequentiellen Suchalgorithmus (aus Die Praxis des Programmierens ) kann verbessert werden, indem irgendwelche nativen Dienstprogramme von C verwendet werden, z Wenn ich die Variable i als Registervariable festlege?

%Vor%     
David 19.08.2008, 07:28
quelle

10 Antworten

24

Ja, aber nur sehr geringfügig. Eine viel größere Leistungsverbesserung kann durch die Verwendung besserer Algorithmen erreicht werden (zum Beispiel die Sortierung der Liste und eine binäre Suche).

Die Optimierung eines bestimmten Algorithmus bringt Sie im Allgemeinen nur soweit. Die Wahl eines besseren Algorithmus (auch wenn dieser nicht vollständig optimiert ist) kann zu einer erheblichen Leistungssteigerung führen.

    
Grey Panther 19.08.2008, 07:33
quelle
2

Ich denke, es wird keinen großen Unterschied machen. Der Compiler wird es bereits in dieser Richtung optimieren.

Außerdem hat die Variable i keinen großen Einfluss, das Wort bleibt während der gesamten Funktion konstant und der Rest ist zu groß, um in ein beliebiges Register zu passen. Es ist nur eine Frage, wie groß der Cache ist und ob das ganze Array dort hineinpassen könnte.

String-Vergleiche sind ziemlich rechenintensiv.

Können Sie vielleicht vor der Suche eine Art Hash für das Array verwenden?

    
HS. 19.08.2008 07:36
quelle
2

Es gibt eine bekannte Technik als Sentinal-Methode. Um die Sentinal-Methode zu verwenden, müssen Sie die Länge von "array []" kennen. Sie können "array [i]! = NULL" entfernen, indem Sie sentinal vergleichen.

%Vor%     
popopome 19.08.2008 09:19
quelle
1

Wenn Sie TPOP lesen, werden Sie als nächstes sehen, wie sie diese Suche mit verschiedenen Datenstrukturen und Algorithmen um ein Vielfaches beschleunigen.

Aber Sie können Dinge ein wenig schneller machen, indem Sie Dinge wie

ersetzen %Vor%

mit

%Vor%

Wenn am Ende des Arrays ein bekannter Wert ist (z. B. NULL), können Sie den Schleifenzähler eliminieren:

%Vor%

Viel Glück, das ist ein großartiges Buch!

    
Mark Harrison 19.08.2008 08:05
quelle
0

Um diesen Code zu optimieren, wäre es am besten, die strcmp-Routine neu zu schreiben, da Sie nur auf Gleichheit prüfen und nicht das gesamte Wort auswerten müssen.

Ansonsten kann man nicht viel anderes machen. Sie können nicht so sortieren, wie es aussieht, wenn Sie nach Text in einem größeren Text suchen. Die binäre Suche funktioniert auch nicht, da der Text wahrscheinlich nicht sortiert wird.

Mein 2p (C-psuedocode):

%Vor%     
graham.reeds 19.08.2008 12:46
quelle
0

Mark Harrison: Deine for-Schleife wird niemals enden! (++ p ist eingerückt, ist aber nicht wirklich innerhalb der for: -)

Auch der Wechsel zwischen Zeigern und der Indexierung hat im Allgemeinen keinen Einfluss auf die Performance und das Hinzufügen von Register-Schlüsselwörtern (wie bereits erwähnt) - der Compiler ist schlau genug, um diese Transformationen gegebenenfalls anzuwenden, und wenn Sie genug darüber erzählen Ihr CPU-Bogen, wird es eine bessere Arbeit von diesen als manuelle puedo-micro-Optimierungen tun.

    
0124816 16.09.2008 12:26
quelle
0

Ein schnellerer Weg, Strings zu finden, wäre, sie im Pascal-Stil zu speichern. Wenn Sie nicht mehr als 255 Zeichen pro String benötigen, speichern Sie sie ungefähr so, wobei der Zähler im ersten Byte steht:

%Vor%

Dann können Sie tun:

%Vor%

Und um wirklich schnell zu werden, fügen Sie Speicher-Prefetch-Hinweise für String-Start + 64, + 128 und den Beginn der nächsten Zeichenfolge hinzu. Aber das ist einfach verrückt. : -)

    
Zan Lynx 31.10.2008 04:50
quelle
0

Ein anderer schneller Weg ist es, Ihren Compiler dazu zu bringen, ein SSE2-optimiertes memcmp zu verwenden. Verwenden Sie Char-Arrays mit fester Länge und richten Sie sie so aus, dass der String bei einer 64-Byte-Ausrichtung beginnt. Dann glaube ich, dass Sie die guten memcmp-Funktionen erhalten können, wenn Sie const char match [64] anstelle von const char * in die Funktion übergeben oder strncpy in ein 64,128,256 Byte-Array einordnen.

Wenn Sie darüber nachdenken, könnten diese SSE2-Matchfunktionen Teil von Paketen wie den Accelerator-Bibliotheken von Intel und AMD sein. Schau sie dir an.

    
Zan Lynx 31.10.2008 05:09
quelle
0

Realistisch gesehen wird die Einstellung von I als Registervariable nichts tun, was der Compiler nicht schon tun würde.

Wenn Sie bereit sind, eine gewisse Zeit damit zu verbringen, das Referenz-Array vorab zu bearbeiten, sollten Sie "Das schnellste Scrabble-Programm der Welt" googlen und das implementieren. Spoiler: Es ist eine DAG, die für Charakter-Lookups optimiert ist.

    
Mat Noguchi 19.08.2008 23:33
quelle
-1
%Vor%     
alchak 21.11.2013 09:13
quelle