Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czas generowania
Forum PHP.pl > Forum > Gotowe rozwiązania
Tobi
Witam

Mam stworzony dośc ładny skrypt generowania, który pięknie działa, ponieważ w odróżnieniu od reszty [a przynajmniej takiego nie widziałem w Internecie] można zamieścić gdzie się chce, a i tak zamieszcza przybliżoną długość ładowania strony. Oto kod:

Początek strony:

[php:1:08f88ee669]<? $start=microtime(); ?>[/php:1:08f88ee669]

Koniec strony:

[php:1:08f88ee669]<? $end = microtime() - $start; ?>[/php:1:08f88ee669]
Kod
<script type="text/javascript" language="JavaScript">

<!--

document.getElementById('czas').innerHTML='<? printf("%2.4f", $end); ?>';

//-->

</script>


I tam gdzie gdzie chcę ujrzeć czas generowania strony:

Kod
<span id="czas"></span>


Ale mam problem... Nieraz przed czasem generowania pokazuje się znak "-" przykładem jest ten zrzut z ekranu Prosiłbym Was o pomoc jak można zrobić, aby on nie wyskakiwał...

PS. Używałem funkcji str_replace, ale coś nie działała, ale możliwość jest, że źle ją stosowałem
Yarecki
Mozesz uzyc str_replace( '-', '', $end);
e4you
albo

[php:1:acbd7d18d2]<?php

substr("$end", 1, 8);

?>[/php:1:acbd7d18d2]

ucina ci 1 znak i pokazuje 8 następnych potem znowu ucina
Jojo
Twój skrypt wcale tak dobrze nie działa bo skoro pokazuje czasem liczby ujemne, to jest kompletnie niedokładny. Uciąć minus możesz na conajmniej sto sposobów choćby tak jak napisane jest wyżej, możesz też użyć funkcji [manual:8e12d6b2dc]abs[/manual:8e12d6b2dc], ale to nie zmieni faktu, że skrypt ma błędy.
Otóż podstawowym błędem jest to, że funkcja [manual:8e12d6b2dc]microtime[/manual:8e12d6b2dc] nie zwraca liczby tylko string. Możesz sobie wyświetlić parę razy na ekran wynik działania funkcji microtime, a wtedy zobaczysz jak to wygląda.
Aby wyeliminować błąd ujemnej liczby powinieneś na początku skryptu wstawić taką funkcję:
[php:1:8e12d6b2dc]<?php
function GetTime()
{
$arrTime = explode( ' ', microtime() );
return $arrTime[0] + $arrTime[1];
}
?>[/php:1:8e12d6b2dc]
Teraz możesz zaraz pod nią napisać:
[php:1:8e12d6b2dc]<?php
$start = GetTime();
?>[/php:1:8e12d6b2dc]
gdzieś na końcu strony piszesz takie coś:
[php:1:8e12d6b2dc]<?php
$end = GetTime() - $start;
?>[/php:1:8e12d6b2dc]
Z tego kodu korzystam już od dawna przy pomiarach czasu wykonania skryptów i jeszcze nigdy nie miałem wyników ujemnych!
scanner
Na podstawie http://forum.php.pl/viewtopic.php?t=154&hi...light=microtime
Napisałem poniższy kod:[php:1:8adcdd097c]<?php
class Timers
{
var
$arrTimers;

/**
* Konstruktor
*/
function Timers( )
{
$intTimer = 0;
$arrTimers = array();
}

/**
* @access public
* @return void
* @param int $intTimerID identyfikator zegara
* @desc Uruchamia zegar o podanym ID
*/
function Start( $intTimerID )
{
$this->arrTimers[$intTimerID] = $this->MyMicrotime();
}

/**
* @access public
* @return void
* @param int $intTimerID identyfikator zegara
* @desc Zatrzymuje zegar o podanym ID. Brakuje kontroli czy zegar został uruchomiony
*/
function Stop( $intTimerID )
{
$this->arrTimers[$intTimerID] = ($this->MyMicrotime() - $this->arrTimers[$intTimerID]);
}

/**
* @access public
* @return float
* @param int $intTimerID identyfikator zegara
* @desc Odczytuje stan podanego zegara
*/
function Read( $intTimerID )
{
return $this->arrTimers[$intTimerID];
}

/**
* @access private
* @return float
* @desc Zwraca liczbe sekund i mikrosecund od Unix Epoch.
*/
function MyMicrotime()
{
$arrTime = explode( ' ', microtime() );
$fltTime = floatval( $arrTime[0] ) + floatval( $arrTime[1] );

return $fltTime;
}
}
?>[/php:1:8adcdd097c]Wywołanie:[php:1:8adcdd097c]<?php
// Wywołanie
$Timers = new Timers();
$Timers->Start( 1 );
$Timers->Start( 2 );

for ( $intLoop = 0; $intLoop < 10000; $intLoop++ )
{
$null = $intLoop; // opozniocz
}

$Timers->Stop( 2 );
echo 'Timer 2: '.$Timers->Read( 2 );
echo ' sec.<br />';

for ( $intLoop = 0; $intLoop < 5000; $intLoop++ )
{
$null = $intLoop; // opozniocz
}

$Timers->Stop( 1 );
echo 'Timer 1: '.$Timers->Read( 1 );
echo ' sec. <br />';
?>[/php:1:8adcdd097c]
orson
witam ...

wow scanner ... masakra ... ale jednak sie zastanawiam czy nie za duzo tego ... do 1 timerka ?

podrawiam
scanner
Po usunięciu komentarzy zostaje kilkanaście linii kodu zapewniajacych możliwosć uruchomienia w bardzo prosty sposób dowolnej liczby timerów - w końcu kod powinien byc uniwersalny.

Tak w zasadzie to metoda Stop() powinna zostać zmodyfikowana do postaci:[php:1:a6b51fbae1]<?php
/**
* @access public
* @return false gdy zegar nie zostal uruchomiony
* @param int $intTimerID identyfikator zegara
* @desc Zatrzymuje zegar o podanym ID.
*/
function Stop( $intTimerID )
{
if( isset( $this->arrTimers[$intTimerID] )
{
$this->arrTimers[$intTimerID] = ($this->MyMicrotime() - $this->arrTimers[$intTimerID]);
}
else
{
return false;
}
}

?>[/php:1:a6b51fbae1]
e4you
albo tak

na początku strony :

[php:1:d08c731649]

<?
// na początku strony
$czas = explode(" ",microtime());
$poczatek = $czas[1] + $czas[0];
?>

?>[/php:1:d08c731649]

na końcu :

[php:1:d08c731649]

<?
// na końcu strony
$czas = explode(" ",microtime());
$koniec = $czas[1] + $czas[0];

$wynik = sprintf("%0.5f",$koniec-$poczatek);

?>[/php:1:d08c731649]

można też dodać, zaokrąglanie wyniku.

PS. to nie moje dzielo jak by kto pytal
Tobi
Sposoby są super, ale proszę teraz mi doradzić, który najlepszy i komu mam dać magiczne pomógłquestionmark.gif
FiDO
Wg mnie najlepszy bedzie kod scanner'a i to bez zadnych dyskusji, poprostu deklasuje reszte. Tylko wsadzic sobie ta klase do jakiegos pliku php i potem includowac go tam gdzie potrzeba.
e4you
kod ktory ja przedstawilem tez mozna includowac . kod taki sam jak inne moim zdaniem tym mnie kodu tym lepiej
Majdan
e4you, ja uważam, że scanner podał lepszy kod. Sam piszesz, że im mniej kodu tym lepiej, to po co przypisujesz zmiennej wynik dodawania, a później ją tylko raz używasz, nie lepiej od razu użyć jej wyniku?! Lepiej jest z funkcją, ale to już pryszcz. Lepsze też jest OOP.
e4you
jak napisalem w poscie to nie ja jestem autorem skryptu znalazlem go na necie mysle ze temat jest juz wiadomy i mozna go zamknać smile.gif
Tobi
No więc po waszych doradzaniach jak i jednego z forumowiczów na komunikatorze wybrałem skrypt scannera... oczywiście nie obeszło się bez problemów [jest jeden mały błąd w skrypcie], ale wkońcu udało się go wrzucić na stronkę i można ujrzeć czas wykonywania skryptu...
scanner
W którym miejscu jest błąd?
Kod klasy testowałem i działao dobrze.
Yarecki
Cytat
W którym miejscu jest błąd?
Kod klasy testowałem i działao dobrze.

W konstruktorze nie uzywasz $this-> dla arrTimers. intTimer chyba nie jest potrzebne bo nigdzie tej zmiennej nie uzywasz.

Wydaje mi sie ze wygodniej zrobic automatyczne zwiekszanie indeksu tablicy arrTimers bo wykluczaloby to pomylki w stylu podwojnego start( 1 ).

BTW. Ja napisalem sobie takie cos:
[php:1:48e1e91097]
1 <?php
2
3 class Timer
4 {
5 var $fltStartTime;
6 var $fltStopTime;
7
8 function start()
9 {
10 $arrTime = explode( ' ', microtime() );
11 $this->fltStartTime = $arrTime[1] . substr( $arrTime[0], 1 );
12 }
13
14 function stop()
15 {
16 $arrTime = explode( ' ', microtime() );
17 $this->fltStopTime = $arrTime[1] . substr( $arrTime[0], 1 );
18 }
19
20 function getElapsedTime()
21 {
22 return bcsub( $this->fltStopTime, $this->fltStartTime, 6 );
23 }
24 }
25
26 ?>
[/php:1:48e1e91097]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.