2016-05-11 22 views
0

Ich habe ein Problem, das mich für eine lange Zeit verwirrt. Ich frage mich, ob irgendjemand in dieser Angelegenheit Licht ins Dunkel bringen könnte.Linux .so Leistung degeneriert im Vergleich zu direkten kompilierten ausführbaren Datei

Ich habe einen invertierten Index geschrieben, um den Textabruf zu unterstützen. Ich habe 2 Möglichkeiten implementiert, um die Benutzerabfrage zu unterstützen, aber die Leistung ist sehr unterschiedlich.

Der erste Weg: kompilieren Sie den invertierten Index mit einer zusätzlichen Testdatei, die eine Hauptfunktion enthalten, die Benutzerabfrage unterstützen.

file: InvertedIndex.cpp UserQuery.cpp

Kompilierzeit:

 g++ -g -Wall -O3 -fPIC -o textSearch1 InvertedIndex.cpp UserQuery.cpp -I ... -L ... 

Der zweite Weg: den invertierten Index als dynamische gemeinsam genutzte Bibliothek kompilieren, eine Testdatei enthält Hauptfunktion auf den dynamisch gelinkten gemeinsame Bibliothek.

Datei: InvertedIndex.cpp UserQuery.cpp

Kompilierung:

 g++ -shared -fPIC -o libInveredIndex.so InvertedIndex.cpp -I ... -L ... 
    g++ -Wall -O3 -fPIC -o textSearch2 UserQuery.cpp -I ... -L ... -l InveredIndex 

ich beide textSearch1 testen und textSearch2 auf einem invertierten Index-Datei-Pre gebaut, und die Abfragezeit ist sehr unterschiedlich. Die invertierte Indexdatei wurde mit mmap geladen.

Für dieselbe Abfrage (mehr als 2 Schlüsselwörter) ist die von textSearch2 kalkulierte Zeit doppelt so lang wie die von textSearch1 kalkulierte Zeit.

Ich habe viele Abfragen mit mehr als 2 Keywords getestet, aber das Phänomen wiederholt sich.

Ich konnte nicht herausfinden, warum. Ich habe viel gesucht und nichts gefunden.

Bitte helfen Sie mir, wenn Sie eine Idee haben.

Vielen Dank.

+0

Beachten Sie, dass Sie beim Kompilieren der ausführbaren Datei kein '-fPIC' benötigen. Dieses Flag wird nur benötigt, wenn' .o' in einer gemeinsam genutzten Bibliothek kompiliert werden soll. –

Antwort

0

In Ihrer gemeinsam genutzten Bibliothekszusammenstellungszeile geben Sie nicht den -O3 Optimierungsschalter an, der Ihre Bibliotheksroutine wahrscheinlich weniger effizient macht.

In jedem Fall, die Bibliothek separat kompilieren und dann Verknüpfung möglicherweise sowieso langsamer. Der Compiler ist nicht in der Lage, so aggressiv zu optimieren, als würde er das Ganze als eine einzige Kompilierungseinheit kompilieren (z. B. könnte es nicht Inline-Funktionen wie z. B. Bibliotheksaufruffunktionen bereitstellen), die es sonst tun würde)