So optimieren Sie diese Array-Schleife

8

Ich habe ein Array, das Informationen über viele Flüge enthält. Ich möchte nur die fünf niedrigsten Preise.

Zuerst mache ich eine Schleife, um die Anordnung nach Preis zu sortieren.

Zweitens drucke ich zuerst das fünfte Array

Aber es braucht mehr Zeit ... Wie kann ich diese Zeit reduzieren?

%Vor%

Array Beispiel

%Vor%

)

    
user1080247 26.09.2013, 16:37
quelle

8 Antworten

4

Um Ihre Fragen zu beantworten:

  

aber es braucht mehr Zeit..wie reduziert man diese große Zeit?

Bevor Sie reduzieren können, müssen Sie genau herausfinden, woher more kommt. Wie Sie in einem Kommentar geschrieben haben, verwenden Sie eine Remote-Anforderung, um die Daten zu erhalten.

Wenn Sie nach Arrays sortieren, funktionieren die von Ihnen bereitgestellten Daten extrem schnell. Daher würde ich annehmen, dass Sie die Array-Sortierung nicht optimieren müssen, sondern nur die Art und Weise, wann und wie Sie die Daten von der Ferne erhalten. Ein Weg, dies zu tun, besteht darin, das zwischenzuspeichern oder es vorab abzurufen oder eine parallele Verarbeitung durchzuführen. Aber die Details sind bis jetzt überhaupt nicht wichtig, es sei denn, Sie haben herausgefunden, woher das mehr kommt, damit klar ist, was für big time verantwortlich ist, und dann kann man versuchen, es zu reduzieren.

Ich hoffe, dass dies bisher hilfreich ist, und fühlen Sie sich frei, die fehlenden Informationen zu Ihrer Frage hinzuzufügen.

Sie können den Array-only-Code hier in Aktion sehen, er ist wirklich schnell:

Sie können die Ausführungsstatistiken direkt unter der Ausgabe finden, beispielhaft von dort:

  

OK (0.008 sec real, 0.006 sec wall, 14 MB, 99 syscalls)

    
hakre 01.10.2013, 12:14
quelle
2

Sie sollten wirklich einen Profiler (XHProf) installieren und prüfen, was genau so lange dauert.

Ich nehme an, es ist die Sortierung, denn foreach bis zum letzten Array von 5 Elementen sollten schnell leuchten. Warum sortierst du es dann? Wenn der einzige Zweck des Sortierens darin besteht, 5 "niedrigste" Elemente zu finden, dann wäre der schnellste Weg, nur die fünf niedrigsten Elemente zu finden:

%Vor%

Es wird 5 Artikel mit etwa O(6n) finden, die in Ihrem Fall besser als das potenzielle O(n²) beim Sortieren sein sollten; Dann kannst du es einfach wie folgt verwenden:

%Vor%

Dies sollte viel schneller sein, vorausgesetzt, es war die Sortierung ! Also hol den XHprof und prüfe:)

    
siergiej 29.09.2013 08:58
quelle
1

Folgendes hätte ich getan:

%Vor%

Entweder das oder eine rekursive Funktion schreiben, um alle Daten durchzugehen. Beachten Sie, dass dies nur funktioniert, wenn Ihre Daten in der von Ihnen gewünschten Reihenfolge vorliegen.

    
Jason 26.09.2013 17:04
quelle
0

Ich würde folgende Dinge tun:

%Vor%     
SamA 26.09.2013 16:47
quelle
0

Buffer echo / print (dh nicht Echo / Drucken aus der inneren Schleife):

%Vor%

Dies ist in Ihrem Fall wahrscheinlich vernachlässigbar, lohnt sich aber für größere Iterationszählungen.

Sie müssen nicht das gesamte Array sortieren, wenn Sie nur an den 5 niedrigsten Preisen interessiert sind.

Durchstreichen Sie das Array unter Beibehaltung einer Liste der Schlüssel mit den 5 niedrigsten Preisen.

Ich bin in PHP zu rostig, um eine Probe zu erstellen.

    
Jo Are By 26.09.2013 16:50
quelle
0

Ich sehe zwei mögliche Bereiche, die den Code verlangsamen:

  • Sortieren des Arrays
  • Echo + String verkettet alle diese Strings

Ich würde zuerst herausfinden, welcher Bereich die Verzögerung verursacht. Wenn das Profiling schwierig ist, können Sie Debuganweisungen in Ihren Code einfügen, wobei jede Anweisung die aktuelle Uhrzeit ausgibt. Dies gibt Ihnen eine ungefähre Vorstellung davon, welcher Codebereich die meiste Zeit beansprucht. Etwas wie:

%Vor%

Sobald wir diese Ergebnisse haben, können wir weiter optimieren.

    
Nikhil 30.09.2013 17:51
quelle
0

Probieren Sie das aus ...

%Vor%     
Nes 01.10.2013 11:22
quelle
0

Das erste, was zu verstehen ist, ist, welcher Teil des Codes lange braucht, um ausgeführt zu werden. Eine schnelle und schmutzige, aber einfache Möglichkeit ist es, Ihren Logger zu benutzen. Welches ich nehme an, dass Sie bereits verwenden, um alle Ihre anderen Informationen zu protokollieren, die Sie behalten möchten, während Ihr Code läuft, wie Speicherverbrauch, Disc - Nutzung, Benutzeranfragen, getätigte Einkäufe usw.

Ihr Logger kann ein hochentwickeltes Tool sein (googeln Sie einfach nach "loggin framework" oder Ähnlichem) oder so einfach wie Nachrichtenschreiber zu Ihrer Datei. Um einen schnellen Start zu bekommen, können Sie etwas wie folgt verwenden:

%Vor%

Jetzt können Sie über Ihren Code gehen und Ihre Logger an allen wichtigen Punkten danach platzieren alles, was möglicherweise zu lange dauern kann. Fügen Sie Ihre Nachrichten hinzu, um zu wissen, was passiert ist. Es kann möglicherweise viele Orte für Verzögerungen geben. Normalerweise sind Array-Manipulationen, die im Speicher ausgeführt werden, blitzschnell. Für zeitaufwändigere Vorgänge wie:

muss jedoch mehr Aufmerksamkeit geschenkt werden
  • Lesen / Schreiben von Dateien, Verzeichniszugriff
  • Datenbankzugriff
  • HTTP-Anfragen

Zum Beispiel http-Anfragen - werden Ihre echo s sofort über ein Netzwerk an den Browser gesendet? Werden sie jedes Mal in der Schleife gesendet? Wenn ja, möchten Sie es wahrscheinlich vermeiden. Speichern Sie sie entweder in einem Array, wie von anderen Antworten angezeigt, oder verwenden Sie Ausgabepuffer .

Um HTTP-Anfragen an Ihren Server zu minimieren, können Sie weitere Funktionen hinzufügen auf der Client-Seite und verwenden Sie ajax, um nur das abzurufen, was wirklich vom Server benötigt wird.

Vergessen Sie auch nicht Dinge, die versteckt sind. Zum Beispiel sehe ich den Zugriff auf Objekteigenschaften:

%Vor%

Wie wird dieses Objekt implementiert? Ist es nur im Speicher? Ruft es externe Dienste an? Wenn ja, ist das vielleicht Ihr Schuldiger. Dann musst du daran arbeiten, das zu optimieren. Reduzieren Sie die Anzahl der Abfragen, indem Sie sie zwischenspeichern, optimieren Sie Ihre Daten, so dass Sie nur die Änderungen abfragen müssen usw. All dies hängt von der Struktur Ihrer Anwendung ab und hat möglicherweise nichts mit dem Rest Ihres Codes zu tun. Wenn Sie dabei Hilfe benötigen, müssen Sie diese Informationen natürlich in Ihre Frage einfügen.

Grundsätzlich kann alles, was nicht komplett im Speicher gemacht wird, zu Verzögerungen führen. Was die In-Memory-Operationen betrifft, außer wenn Ihre Daten riesig sind oder Ihre Operationen intensiv sind, ihre Wirkung wird wahrscheinlich vernachlässigbar sein. Wenn Sie irgendwelche Zweifel haben, platzieren Sie Ihre Logger einfach an allen "verdächtigen" Orten.

Nun zu deinem spezifischen Code, er mischt alle möglichen Dinge, so dass externe Objekt Zugriff, Array-Wert-Zugriff, Array-Sortierung, Echo-Ausgaben, vielleicht andere Dinge, die versteckt sind. Dies macht es schwierig zu wissen, wo Sie Ihre Zeit Logger platzieren.

Was es viel einfacher machen würde, ist den objektorientierten Ansatz zu verwenden und folge unter anderem dem Prinzip der Trennung von Interessen (google dazu). Auf diese Weise haben Ihre Objekte und ihre Methoden einzelne Verantwortlichkeiten und Sie werden leicht sehen, wer was macht und wo Sie Ihre Logger platzieren.

Ich kann das legendäre Buch von "Uncle Bob" nicht empfehlen, um mehr darüber zu erfahren. Ich nehme an, dass Ihr Code von einer Funktion kommt. Laut Onkel Bob:

  

Die erste Regel von Funktionen ist, dass sie klein sein sollten. Die zweite Regel ist, dass sie kleiner sein sollten.

und

  

Funktionen sollten eine Sache tun. Sie sollten es gut machen. Sie sollten es nur tun.

Wenn Sie Ihren Code in mehrere Funktionen aufteilen, müssen Sie diesen Funktionen sinnvolle Namen geben, die die Lesbarkeit Ihres Codes erheblich verbessern. Unnötig zu erwähnen, dass alle Funktionen, die nicht für die Verwendung außerhalb der Klasse vorgesehen sind, privat sein sollten, damit Sie Ihre Klassen einfach über die Vererbung wiederverwenden können.

Es gibt eine Menge, die getan werden kann, aber nur um Sie zu beginnen, hier sind einige Ideen:

  • Verkapseln Sie Ihr Daten-Array in ein Objekt mit Methoden, die nur das tun, was Sie brauchen. So ähnlich:

    %Vor%

Beachten Sie, dass sich Ihre Array-Struktur vollständig ändern sollte, Sie müssen nur die Methode _getPrice anpassen und die einzige Linie, um dein Objekt zu instantiieren! Der Rest Ihres Codes bleibt erhalten!

Dies ist ein Teil Ihrer Modellschicht im Model-View-Controller-Paradigma. Sie können googeln, um viele Informationen zu finden. Das Modell weiß mit seinen Daten umzugehen, weiß aber nichts darüber die Quelle von ihnen, keine Browser-Ausgabe, keine HTTP-Anfragen etc.

  • Dann geht alles, was für die Erzeugung der Benutzerausgabe verantwortlich ist, in Ihre Ansichtsschicht oder in die sogenannte Presenter-Ebene. wo Sie andere Objekte haben, die sich damit beschäftigen. Alle deine Echos werden hier hingehen. So ähnlich:

    %Vor%

Ich bin jedoch persönlich dagegen, HTML auf dem Server zu generieren. Es ist nur eine Verschwendung von Bandbreite und die Zeit der Benutzer warten auf Antwort.Jedes Mal, wenn ich darauf warte, dass mein Browser die ganze Seite neu lädt, möchte ich, dass der Entwickler dies liest. Sie können JSON anstelle von HTML ausgeben und es mit Ajax oder anderen Möglichkeiten auf der Client-Seite anfordern.

Außerdem kann der Browser Ihres Benutzers einige der Daten zwischenspeichern, anstatt sie erneut anzufordern. und entscheide, wonach du fragen sollst. Das wird die Verzögerung für Ihre Benutzer weiter minimieren, am Ende des Tages ist genau das, was Sie beschäftigen.

    
Dmitri Zaitsev 03.10.2013 18:15
quelle

Tags und Links