31. august 2006 - 15:36Der er
11 kommentarer og 1 løsning
Hurtigste måde at hente en gemt streng
Hej Eksperter!
Jeg har tænkt på følgende:
Hvordan henter man hurtigst/mindst resourcekrævende en gemt streng? (jeg tænker ikke sessions eller cookies men fysisk et sted på serveren)
Følgende måder er tænkt, men der er sikkert bedre: - Gemt i en database - Gemt i en txt-fil hentet med file() - Gemt i en txt-fil hentet med file_get_contents()
Hvad siger I?
Jeg skal gemme oplysninger om seneste vinder i en konkurrence og det skal hentes på alle sider og kræver derfor at være så optimalt servermæssigt som muligt.
Jeg ved ikke meget om hastigheds- og resourceoptimering af php-kode, men jeg vil foreslå at ligge oplysningerne i en fil og bruge include(). Det virker på en eller anden måde nemt og hurtigt. Du kan evt. "benchmarke" forskellige muligheder med følgende kode. Lad os høre hvad du kommer frem til.
mcgoat: De to kommentarer du har lavet viser jo STORT SET de samme tal - forholds mæssigt i hvert fald.
Første kommentar: Tid: 9.89437103271E-05 Tid: 6.79492950439E-05 Tid: 6.48498535156E-05
Anden kommentar: Tid: 0.000119924545288 = 11.9924545288E-5 Tid: 7.10487365723E-05 Tid: 6.60419464111E-05
Den samme kode kørt to gange vil jo aldrig give eksakt det samme resultat, idet serveren har andet at lave end at udføre din kode ;-) Et passende antal gentagelser af testen og så et gennemsnit vil give et mere stabilt billede.
Du mangler forøvrigt at sige hvilken metode(r) du bruger. Er de 3 tre den samme metode eller 3 forskellige?
elskermad.dk: Har du nogle resultater du vil dele med os?
Yep! include() ser langsomst ud. Der er en ting der kan spille ind her, nemlig cache. Hvis det skal være helt fair skal alle tre metoder hente hver deres fil med samme indhold.
Har prøvet følgende: <? function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); }
$fgcres=0; $fimres=0; $fferes=0; $incres=0;
function fgc(){ global $fgcres; echo "<br>file_get_contents :"; $time = getmicrotime(); echo file_get_contents ("file_get_contents_txt.php"); $fgcres += getmicrotime() - $time; }
function fim(){ global $fimres; echo "<br>file (implode):"; $time = getmicrotime(); echo implode('', file("file_implode_txt.php")); $fimres += getmicrotime() - $time; }
function ffe(){ global $fferes; echo "<br>file (foreach):"; $time = getmicrotime(); $lines = file("file_foreach_txt.php"); foreach ($lines as $line_num => $line) { echo "$line"; } $fferes += getmicrotime() - $time; }
function inc(){ global $incres; echo "<br>include:"; $time = getmicrotime(); include("include_txt.php"); $incres += getmicrotime() - $time; }
Når jeg kører det på min lokal windows maskine får jeg typisk:
. . . ile_get_contents :HURRA! Viggo har vundet konkurrencen. file (implode):HURRA! Viggo har vundet konkurrencen. file (foreach):HURRA! Viggo har vundet konkurrencen. include:HURRA! Viggo har vundet konkurrencen.
include() er generelt langsomst, mens de 3 andre metoder ligger og vipper lidt for hver kørsel. MEN - Vi er vist nede i småtings afdelingen, så konklutionen må være:
elskermad.dk: Brug den metode DU synes ser pænest ud i din kode og glem alt om server belastning (i dette tilfælde)!
Havde slet ikke set at tidsangivelserne ikke var ens - Men dvs at file er hurtigst hvis man skal gå virkelig i detaljer? (er nødvendigt da systemet ikke køre optimalt som det er nu)
Hvordan tester jeg det bedst sammenlignet med en database?
Jeg har lagt en ny udregning op som vist viser at database ikke er bedre... Kan i lige se om scriptet ser fornuftigt ud, også må I alle gerne lægge nogen svar :)
@mysql_connect ("xxxx","xxxxxx","xxxxxx"); @mysql_select_db ("xxxxxxxx") or die ("Da sidens MySQL-database ikke er tilgængelig kan siden ikke vises!");
$time = getmicrotime();
print mysql_result(mysql_query("SELECT navn FROM shop_shop LIMIT 0,1"),0);
Jeg har ikke kigget så meget på de tal I bruger. Som udgangspunkt siger man at databasen er langsomst. Mht. file_get_contents() og fopen() osv, vil jeg mene at de vil tage næsten lige lang tid, da file_get_contents() svarer til at kalde fopen osv.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.