Um langsamen Code schnell zu machen, gibt es ein paar Dinge, die Sie tun können. Stellen Sie zunächst sicher, dass der Code richtig ist. Falsche Ergebnisse sind immer noch falsche Ergebnisse, auch wenn Sie sie schnell erhalten. Stellen Sie zu diesem Zweck sicher, dass Sie beim Aufruf von VirtualQuery
gültige Werte für alle Parameter übergeben. Am Anfang dieser Funktion ist mbi
nicht initialisiert, so dass das Ergebnis von DWORD(mbi.BaseAddress) + MBI.RegionSize
Wer-weiß-was ist.
Sobald Sie richtig Code gearbeitet haben, gibt es zwei Möglichkeiten, um es schneller zu machen:
die langsamen Teile finden und sie schnell zu machen. Um dies richtig zu machen, benötigen Sie einen Profiler. Ein Profiler wird Ihr Programm während der Ausführung beobachten und Ihnen dann sagen, wie viel Zeit Ihr Programm für die Ausführung der einzelnen Teile aufgewendet hat. Das sagt dir, wo du dich konzentrieren musst.
ersetzen langsam Algorithmen mit schnellen Algorithmen. Dies kann bedeuten, dass die gesamte Funktion weggeworfen wird oder dass nur bestimmte Teile des Codes repariert werden.
Zum Beispiel könnte Profilierung zeigen, dass Sie viel Zeit Anruf ProcessMessages
verbringen. Sie können diese Funktion nicht wirklich schneller machen, da es Teil der VCL ist, aber Sie können es weniger oft nennen. Möglicherweise stellen Sie sogar fest, dass Sie die Nachricht gar nicht aufrufen müssen, wenn erwartet wird, dass der Thread, mit dem Sie diesen Code ausführen, keine Nachrichten empfängt, die verarbeitet werden müssen.
Die Profilerstellung zeigt möglicherweise, dass Sie viel Zeit mit Zeichenfolgenvergleichen verbringen. Wenn die Ihrer Zeichenfolgen häufig gleich sind und sich normalerweise nur am Ende unterscheiden, dann möchten Sie möglicherweise Ihren Zeichenfolgenvergleichsalgorithmus ändern, um Strings mit dem letzten Zeichen statt mit dem ersten zu vergleichen.
Die Profilerstellung zeigt möglicherweise, dass Sie viel Zeit damit verbringen, ganze Zahlen in Zeichenfolgen umzuwandeln, bevor Sie sie vergleichen. Die meisten Programmiersprachen unterstützen den direkten Vergleich von Ganzzahlen. Anstatt einen String-Vergleichsalgorithmus zu verwenden, können Sie stattdessen einen ganzzahligen Vergleichsalgorithmus verwenden. Sie könnten scanvalue
in eine Ganzzahl mit StrToInt(scanvalue)
konvertieren und direkt mit value
vergleichen.
Die Profilerstellung zeigt möglicherweise an, dass Sie wiederholt dasselbe Ergebnis von derselben Eingabe berechnen. Wenn ein Wert sich über einen Teil eines Programms nicht ändert, ändern sich auch die daraus berechneten Werte nicht. Sie können die Kosten für das Konvertieren von Werten reduzieren, indem Sie dies nur tun, wenn sich ein Wert geändert hat. Wenn Sie beispielsweise Ganzzahlvergleiche durchführen, werden Sie wahrscheinlich feststellen, dass sich die Ganzzahlversion von scanvalue
in Ihrer Funktion nicht ändert. Sie könnten scanvalue
einmal zu Beginn der Funktion in eine Ganzzahl umwandeln und dann value
mit der innerhalb der Schleife vergleichen, anstatt StrToInt(scanvalue)
oft aufzurufen.
Wenn Ihre Frage wirklich nur ist "Warum ist dieser spezifische Code langsam?" Dann sollten Sie es stattdessen zu http://codereview.stackexchange.com bringen, da Ihre Frage zu lokal ist, um hier auf Stack Overflow von allgemeinem Interesse zu sein. Aber wenn deine Frage nur allgemein lautet: "Wie mache ich willkürlichen langsamen Code schneller?" dann solltest du das stattdessen direkt fragen. –
mbi.BaseAddress und MBI.RegionSize sind beim Eintrag in VirtualQuery() - nicht initialisierte Stapeldaten nicht definiert. –