2017-09-29 2 views
0

Wir arbeiten derzeit an einer Turnierplattform. Diese Plattform generiert Rankings völlig dynamisch, so dass wir immer unterschiedliche Punkte, unterschiedliche Teilnehmerzahlen etc. haben.PHP beschleunigen for-Schleife für Rankings

Ein Turnier kann mehrere Runden haben. Für jede Runde kann ein Admin das Ranking für einen Teilnehmer festlegen. Und hier liegt das Problem. Mein aktueller Code:

<select name="round_{{ $i }}_placements[{{ $participant->id }}]" class="form-control scoreboard-placement"> 
@for($x=0;$x<$tournament->checkedin()->count()+1;$x++) 
    <option value="{{ $x }}" @if($participant->getRanking($i)->ranking_value == $x) selected="selected" @endif>{{ $x }}</option> 
@endfor 
</select> 

Aber ich jetzt ein großes Problem mit Ladezeiten hat:

In meinem letzten Fall, dass ich 67 Teilnehmer hatte. Für jeden Teilnehmer ging er durch und fügte all diese 67 ausgewählten Optionen hinzu. Aber es hat auch 67 Mal das Ranking überprüft, was natürlich nicht passieren sollte. Dies erhöht die Ladezeit unseres Backends auf fast 30 Sekunden, was enorm ist. Als ich sie entfernte, ging es zurück zu 2.

Also was ich will, ist stattdessen: Erstellen Sie alle Optionen einmal und automatisch die ausgewählte Box. Weißt du, wie ich das erreichen kann? Das Wechseln zu JS zum Ändern wäre ebenfalls kein Problem.

+0

Sie könnten versuchen, xDebug der Installation und Anwendung Profilierung. Schau dir an, wo die Zeit ist und das hilft dir, die Geschwindigkeit zu verbessern. –

+0

Ich habe überprüft, wo ich die Geschwindigkeit verbessern muss, und das ist in diesem speziellen Teil. Ich habe das Problem, dass ich mehrere tausend Anfragen (67x67) für diese Rankings mache, während ich nur 67 brauche. – Astinox

+0

Ich habe die Antwort zurückgerollt, da dies die Basisfrage ist. Sie sollten es nicht entsprechend den Antworten typisieren, weil die Antworten keinen Sinn ergeben würden. So kann jemand vorher/nachher sehen und daraus lernen – Martijn

Antwort

7

Sie sollten $trnmntCheckedinCount = $tournament->checkedin()->count() tun und das in der Schleife verwenden. Jetzt rufst du diese Methoden einmal pro Eintrag an (also 67 mal). Mein Vorschlag macht es einmal, es sollte etwas ausmachen.

Sie überprüfen, ob das Personen-Ranking $x pro Benutzer ist, pro Option (also 10 Optionen mit 67 Teilnehmern bedeutet 670 Schecks). Sie sollten den Benutzerrang vor den Optionen for überprüfen und nur die Variable überprüfen. Dies sollte eine Menge Rolle :)


Mein Laravel kaum existent ist, aber so etwas wie dies:

@php 
// Place this out of the loop which loops through your users 
$tournementCount = $tournament->checkedin()->count(); 
@endphp 

<select name="round_{{ $i }}_placements[{{ $participant->id }}]" class="form-control scoreboard-placement"> 
    @php 
     $participantRanking = $participant->getRanking($i)->ranking_value; 
    @endphp 

    @for($x=0; $x<$tournementCount+1; $x++) 
     <option value="{{ $x }}" @if($participantRanking == $x) selected @endif>{{ $x }}</option> 
    @endfor 
</select> 
+0

Hey Martijn! Das hat geholfen. Es reduzierte die Belastung um fast 65%. Ich habe es in der Post bearbeitet. Das Ranking-Problem, das etwa 4k Anfragen erzeugt (und noch mehr, wenn mehr Teilnehmer), existiert noch. – Astinox

+1

Nachdem du es bearbeitet hast, war es klar. Vielen Dank. Manchmal sind die einfachsten Dinge aus dem Kopf, wenn man 2 Stunden davor sitzt. Das war mein Problem! Vielen Dank, viel Zeit gespart. – Astinox

+1

Merci @ Klassifiziert – Martijn