2017-03-12 3 views
0

Ich versuche, das Quadtree-System von jemandem zu implementieren, aber es ist wahnsinnig langsam, also versuche ich herauszufinden, warum. Ich habe einige Tests gemacht, und es dauert unglaubliche zwei Sekunden, um 1000 gegen 1000 damit abzufragen. Es ist wahnsinnig schneller, stattdessen einfach durch die ganze Sache zu iterieren.Code-Profiler (gprof) lesen

Ich habe Code-Code-Profiler verwendet, um zu versuchen, herauszufinden, warum, aber es gibt ziemlich viel drin, ich verstehe nicht, nämlich die PThread Dinge. Ich verwende Multithreading für Netzwerke, aber das Quadtree-System berührt es nie, soweit ich das beurteilen kann.

Bild der Anzeige unten.

http://imgur.com/a/i1PnH

Ich habe ein Gefühl, das ich es falsch, nur bin mit, aber es nicht zu erfahren, was all jene Pthread verletzt und entspannen die Dinge sind. Ich habe sie oft gesehen, aber sie waren noch nie so prominent vor dieser Quadtree-Sache.

Antwort

0

Sie könnten etwas über die Leistung lernen.

Einer ist, dass es Code gibt, den Sie ändern können (manchmal "Ihr Code" genannt) und Code, den Sie nicht ändern können, wie Bibliothekscode mit all dem Pthread und Unwind-Zeug. Das letzte, was letzteres tun kann, ist vielleicht geben Sie einen entfernten Hinweis darüber, was in Ihrem Code dauern kann. Es ist wahrscheinlicher, Sie entweder mystifiziert zu lassen oder einen falschen Weg zu erkunden.

Eine andere ist, dass "Self-Time" selten nützlich ist. In allen außer den einfachsten Spielzeugprogrammen geht der Befehlszeiger des Computers nicht sehr weit in Ihrem Code vor dem Aufruf einer Unterroutine (Funktion, Methode, wie auch immer es genannt wird). Dann geht es in dieser Routine nicht sehr weit vor einem anderen Aufruf. Sie werden also sehen, dass es in Ihrem Programm nicht viel zu tun gibt, wenn Sie viel Eigenzeit haben.

Eine andere ist, dass die Genauigkeit der Messung nicht wirklich wichtig ist. Wenn ein Programm ein Faktor wie 100 ist, langsamer als es sein wird, nachdem es behoben ist, was bedeutet das? Das bedeutet, dass normalerweise nur 1 von 100 Nanosekunden in Richtung der Ziellinie verbracht wird. Die anderen 99 machen etwas nutzlos, wenn du wüsstest, was es ist, würdest du es leicht als nutzlos erkennen, also würdest du es loswerden. SO, wenn Sie das Programm unter einem IDE oder Debugger ausführen, und klicken Sie einfach auf die Schaltfläche "Pause", um es zu einem zufälligen Zeitpunkt zu stoppen, was ist die Chance, dass Sie es sehen, die nutzlose Sache zu tun? Praktisch sicher - die Wahrscheinlichkeit, dass es in der 1% ist, ist 1%. Wenn Sie nicht sicher sind, ob es in der 1% ist, tun Sie es erneut. Was ist die Chance, dass es wieder in der 1% - 1% im Quadrat oder 0,0001 ist. So ist die Wahrscheinlichkeit, dass Sie den Geschwindigkeitsfehler gesehen haben, fast sicher. Das ist zwei Proben, nicht Tausende.

Verallgemeinern, angenommen, nur 30% werden verschwendet. Dann ist die Anzahl der Proben, im Durchschnitt, benötigt, um das Problem zweimal zu sehen ist 2/30% oder 6,67 Proben. Normalerweise gibt es mehrere Probleme, so dass Sie jedes Mal, wenn Sie einen Fehler beheben, einen Beschleunigungsfaktor erhalten, und der von den anderen eingenommene Prozentsatz wächst um diesen Faktor. Das bedeutet, dass Sie schließlich zu denen kommen, die zuerst klein waren.

Das ist das Prinzip hinter random pausing, die Methode, die viele Menschen und ich verwenden, und es ist sehr effektiv.

Verwandte Themen