Avatar billede elskermad.dk Nybegynder
31. august 2006 - 15:36 Der 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.
Avatar billede datasource Nybegynder
31. august 2006 - 17:16 #1
Der vil jeg nok sige at gemme det i en database er det hurtigste.
Avatar billede skagen Nybegynder
31. august 2006 - 17:33 #2
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.

function getmicrotime()
{
  list($usec, $sec) = explode(" ",microtime());
  return ((float)$usec + (float)$sec);
}
$time = getmicrotime();
#
# benchmark code here
#
echo "<p>Time elapsed: ",getmicrotime() - $time, " seconds";
Avatar billede elskermad.dk Nybegynder
31. august 2006 - 18:12 #3
Skagen havde ret ang. include klart er den hurtigste (http://alvision.dk/test.php 1. include, 2. file_get_content, 3. file)

Smart metode at tjekke hastigheder ud på :) Er hastighed = serverkræft?
Avatar billede mcgoat Nybegynder
31. august 2006 - 18:18 #4
hdjgn jkdfsn gjkdfsn gjkdf gnjkfndsjkg d
Tid: 9.89437103271E-05

hdjgn jkdfsn gjkdfsn gjkdf gnjkfndsjkg d
Tid: 6.79492950439E-05

hdjgn jkdfsn gjkdfsn gjkdf gnjkfndsjkg d
Tid: 6.48498535156E-05

syntes den hopper noget rundt med tiderne hvis man bliver ved med at opdatere
Avatar billede mcgoat Nybegynder
31. august 2006 - 18:18 #5
andre gange:

hdjgn jkdfsn gjkdfsn gjkdf gnjkfndsjkg d
Tid: 0.000119924545288

hdjgn jkdfsn gjkdfsn gjkdf gnjkfndsjkg d
Tid: 7.10487365723E-05

hdjgn jkdfsn gjkdfsn gjkdf gnjkfndsjkg d
Tid: 6.60419464111E-05
Avatar billede skagen Nybegynder
31. august 2006 - 21:15 #6
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?
Avatar billede mcgoat Nybegynder
31. august 2006 - 21:32 #7
var fra elskermad.dk's side jeg kørte.
Avatar billede mcgoat Nybegynder
31. august 2006 - 21:32 #8
men hvis 1 er include. så er det vel den langsommeste?
Avatar billede skagen Nybegynder
31. august 2006 - 22:33 #9
I see ......

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;
}

for ($i=0; $i<1000; $i++) {
    fgc();
    fim();
    ffe();
    inc();
}
echo "<br><br>";
echo "file_get_content: ".$fgcres." sec<br>";
echo "file (implode): ".$fimres." sec<br>";
echo "file (foreach): ".$fferes." sec<br>";
echo "include : ".$incres." sec<br>";
?>

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.

file_get_content: 0.400086164474 sec
file (implode): 0.381649255753 sec
file (foreach): 0.379784107208 sec
include : 0.463164806366 sec


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)!
Avatar billede elskermad.dk Nybegynder
31. august 2006 - 22:48 #10
havde brugt denne kode:
<?

$fil = "test2.txt";

function getmicrotime() {
    list($usec, $sec) = explode(" ",microtime());
    return ((float)$usec + (float)$sec);
}

$time = getmicrotime();

include($fil);

echo "<br>Tid: " . (getmicrotime()-$time) . "<br><br>";

$time = getmicrotime();

print file_get_contents($fil);

echo "<br>Tid: " . (getmicrotime()-$time) . "<br><br>";

$time = getmicrotime();

$output = file($fil);
echo $output[0];

echo "<br>Tid: " . (getmicrotime()-$time) . "<br><br>";

?>

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?
Avatar billede elskermad.dk Nybegynder
31. august 2006 - 23:12 #11
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 :)

<?

$include    = 0;
$file_get    = 0;
$file        = 0;
$db        = 0;

function getmicrotime($inms = true){
    $utime = preg_match("/^(.*?) (.*?)$/", microtime(), $match);
    $utime = $match[2] + $match[1];
   
    return ($inms)? ($utime *= 1000000) : $utime;
}

echo"<div style='display:none'>";

for($i=0;$i<100;$i++) {
    $time = getmicrotime();
   
    include("test2.txt");
   
    $include += (getmicrotime()-$time);
   
    $time = getmicrotime();
   
    print file_get_contents("test4.txt");
   
    $file_get += (getmicrotime()-$time);
   
    $time = getmicrotime();
   
    $output = file("test3.txt");
    echo $output[0];
   
    $file += (getmicrotime()-$time);
   
    @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);
   
    $db += (getmicrotime()-$time);
}

echo"
</div>

include: $include<br>
file_get_contents: $file_get<br>
file: $file<br>
database: $db<br>
";

?>
Avatar billede fcknet Nybegynder
01. september 2006 - 00:32 #12
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester