Kom ihåg mig?
Home Menu

Menu


PHP 4 + PHP 5 construkt : kalla på PHP 4 c eller g

 
Ämnesverktyg Visningsalternativ
Oläst 2005-06-21, 17:24 #1
lord mazdak lord mazdak är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2005
Inlägg: 12
lord mazdak lord mazdak är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2005
Inlägg: 12
Vi säger att vi har denna classen :

Kod:
class DB
{
	var $host; // The hostname
	var $user; // The username
	var $password; // The password
	var $database; // The database

	function DB($host,$user,$password,$database) // PHP4 class constructor
	{
 // populate the properties thats needed for connection
 $this->host = $host;
 $this->user = $user;
 $this->password = $password;
 $this->database = $database;
	}
// lite andra metoder
}
nu vill man göra så att PHP 5 kan få använda sin egen construktor syntax och inte använda PHP 5s "backward compability"

då kan man ju göra såhär
Kod:
class DB
{
	var $host; // The hostname
	var $user; // The username
	var $password; // The password
	var $database; // The database

	function DB($host,$user,$password,$database) // PHP4 class constructor
	{
 // populate the properties thats needed for connection
 $this->host = $host;
 $this->user = $user;
 $this->password = $password;
 $this->database = $database;
	}

	function __construct($host,$user,$password,$database) // PHP5 class constructor
	{
	{
 $this->DB($host,$user,$password,$database);
	}
// lite andra metoder
}
eller såhär

Kod:
class DB
{
	var $host; // The hostname
	var $user; // The username
	var $password; // The password
	var $database; // The database

	function DB($host,$user,$password,$database) // PHP4 class constructor
	{
 // populate the properties thats needed for connection
 $this->host = $host;
 $this->user = $user;
 $this->password = $password;
 $this->database = $database;
	}

	function __construct($host,$user,$password,$database) // PHP5 class constructor
	{
 // populate the properties thats needed for connection
 $this->host = $host;
 $this->user = $user;
 $this->password = $password;
 $this->database = $database;
	}
// lite andra metoder
}
Vilket går snabbast av de 2 senare kodstyckerna ?
Och ska man ta med PHP 5s construct och göra så att prestandan sjunker för PHP 4 användarna eller ska PHP 5 användarna få sämre prestanda ( då kör man utan PHP 5s construct
lord mazdak är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-21, 18:20 #2
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
Självklart medför ett extra funktionsanrop att (när php5 konstruktorn anropar php4 konstruktorn) att det tar längre tid, men i praktiken så är nog deta en fis i havet jämfört med vad resten av sidan tar att parsa.

Skriv ett testscript som instansierar klassen flera tusen gånger och mät tiden så har du svaret.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-21, 19:41 #3
lord mazdak lord mazdak är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2005
Inlägg: 12
lord mazdak lord mazdak är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2005
Inlägg: 12
hur var det nu man fick reda på execution time?
lord mazdak är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-22, 00:14 #4
kullervos avatar
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Dec 2003
Inlägg: 1 519
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
kullervos avatar
 
Reg.datum: Dec 2003
Inlägg: 1 519
Citat:
Originally posted by lord mazdak@Jun 21 2005, 18:41
hur var det nu man fick reda på execution time?
time() och utime() finns ju alltid.
kullervo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-22, 07:48 #5
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eller varför inte microtime...
microtime hjälpen på php.net har ett bra exempel.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-22, 10:21 #6
kullervos avatar
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Dec 2003
Inlägg: 1 519
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
kullervos avatar
 
Reg.datum: Dec 2003
Inlägg: 1 519
Citat:
Originally posted by eg0master@Jun 22 2005, 06:48
eller varför inte microtime...
microtime hjälpen på php.net har ett bra exempel.
Hoppsan. Trodde den hette utime().
kullervo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-22, 14:55 #7
lord mazdak lord mazdak är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2005
Inlägg: 12
lord mazdak lord mazdak är inte uppkopplad
Nykomling
 
Reg.datum: Jun 2005
Inlägg: 12
Gjorde lite benchmarks med dessa script

1.
Kod:
<?php
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

class DB
{
	var $host;
	var $user;
	var $password;
	var $database;

	function DB($host,$user,$password,$database) // PHP4 class constructor
	{
 $this->host = $host;
 $this->user = $user;
 $this->password = $password;
 $this->database = $database;
	}

	function __construct($host,$user,$password,$database) // PHP5 class constructor
	{
 $this->host = $host;
 $this->user = $user;
 $this->password = $password;
 $this->database = $database;
	}
}

for($i = 0; $i < 100000; $i++)
{
	$instance = new DB('host','user','password','database');
}

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "execution time = $totaltime seconds<br/>instances maid = $i<br/>average execution time/instance = ".$totaltime / $i;
?>
2.
Kod:
<?php
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;

class DB
{
	var $host;
	var $user;
	var $password;
	var $database;

	function DB($host,$user,$password,$database) // PHP4 class constructor
	{
 $this->host = $host;
 $this->user = $user;
 $this->password = $password;
 $this->database = $database;
	}

	function __construct($host,$user,$password,$database) // PHP5 class constructor
	{
 $this->DB($host,$user,$password,$database);
	}
}

for($i = 0; $i < 100000; $i++)
{
	$instance = new DB('host','user','password','database');
}

$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
echo "execution time = $totaltime seconds<br/>instances maid = $i<br/>average execution time/instance = ".$totaltime / $i;
?>
1:an gav dessa resultat ( det sista fixade jag )
Kod:
execution time = 2,03122901917 seconds
instances maid = 100000
average execution time/instance = 0,0000203122901917

execution time = 2,01193809509 seconds
instances maid = 100000
average execution time/instance = 0,0000201193809509

execution time = 1,98479390144 seconds
instances maid = 100000
average execution time/instance = 0,0000198479390144

execution time = 1,99218416214 seconds
instances maid = 100000
average execution time/instance = 0,0000199218416214

execution time = 2,01383900642 seconds
instances maid = 100000
average execution time/instance = 0,0000201383900642

execution time = 2,13474011421 seconds
instances maid = 100000
average execution time/instance = 0,0000213474011421

execution time = 1,98517394066 seconds
instances maid = 100000
average execution time/instance = 0,0000198517394066

execution time = 2,01875305176 seconds
instances maid = 100000
average execution time/instance = 0,0000201875305176

execution time = 2,08163309097 seconds
instances maid = 100000
average execution time/instance = 0,0000208163309097

execution time = 2,01121997833 seconds
instances maid = 100000
average execution time/instance = 0,0000201121997833

Total (10 executions):
execution time = 20,26550436019
instances maid = 1000000
average execution time/instance = 0,00002026550436019
och 2:an gav dessa resultat
Kod:
execution time = 2,88538885117 seconds
instances maid = 100000
average execution time/instance = 0,0000288538885117

execution time = 2,87395501137 seconds
instances maid = 100000
average execution time/instance = 0,0000287395501137

execution time = 3,01868104935 seconds
instances maid = 100000
average execution time/instance = 0,0000301868104935

execution time = 3,03595113754 seconds
instances maid = 100000
average execution time/instance = 0,0000303595113754

execution time = 3,09631586075 seconds
instances maid = 100000
average execution time/instance = 0,0000309631586075

execution time = 3,01692414284 seconds
instances maid = 100000
average execution time/instance = 0,0000301692414284

execution time = 2,92553091049 seconds
instances maid = 100000
average execution time/instance = 0,0000292553091049

execution time = 3,00412797928 seconds
instances maid = 100000
average execution time/instance = 0,0000300412797928

execution time = 3,09196591377 seconds
instances maid = 100000
average execution time/instance = 0,0000309196591377

execution time = 3,02725505829 seconds
instances maid = 100000
average execution time/instance = 0,0000302725505829

Total (10 executions):
execution time = 29,97609591485
instances maid = 1000000
average execution time/instance = 0,00002997609591485
Slutsats :
Det går snabbare att ge egenskaperna ett värde igen än att kalla på PHP 4 konstruktorn
lord mazdak är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-22, 17:01 #8
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
Citat:
Originally posted by lord mazdak@Jun 22 2005, 14:55
[...]
1:an gav dessa resultat ( det sista fixade jag )
Kod:
[...]
execution time = 1,98517394066 seconds
instances maid = 100000
average execution time/instance = 0,0000198517394066
[...]
och 2:an gav dessa resultat
Kod:
[...]
execution time = 3,09631586075 seconds
instances maid = 100000
average execution time/instance = 0,0000309631586075
[...]
Slutsats :
Det går snabbare att ge egenskaperna ett värde igen än att kalla på PHP 4 konstruktorn
Ordpolisen: Jag tror du menar made och inte maid, fast egentligen menar du nog created... :P

Det du kallar slutsats är egentligen bara ett konstaterande/bevis för att något vi redan visste är sant.

Diskussion:
Jag valde snabbaste tiden för den snabba lösningen och den långsamaste för den långsamma. Detta ger en skillnad på 1,111 sekunder lite drygt. Detta då 100K instanser skapas. Detta ger en overhead på drygt 11 ms per instansiering.
Samtidigt är ju lösningen där php5 konstruktorn anropar php4 konstruktorn lättare att underhålla eftersom förändringar bara behöver göras på ett ställe istf två.

Slutsats:
Man måste titta på hur mycket man tjänar i exekveringstid kontra eventuella problem med att underhålla två identiska funktioner.

Personlig kommentar:
Jag tvivlar på att du skapar 100K instanser per sida... och även om du gjorde det så hur stor del av hela sidans exekveringstid är då 1s?
Du skall inte optimera saker som inte behöver optimeras. 11ms/anrop känns inte värt besväret med tanke på det du förlorar i underhållbarhet av koden. Möjligen är det värt det om du kansk spara flera sekunder per sida, men allvarligt talat - om du skapar ett par, tre hundra objekt per sida så känns det som något annat är fel i din design...
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-23, 01:20 #9
kullervos avatar
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Dec 2003
Inlägg: 1 519
kullervo kullervo är inte uppkopplad
Bara ett inlägg till!
kullervos avatar
 
Reg.datum: Dec 2003
Inlägg: 1 519
Citat:
Originally posted by eg0master@Jun 22 2005, 16:01
Diskussion:
Jag valde snabbaste tiden för den snabba lösningen och den långsamaste för den långsamma. Detta ger en skillnad på 1,111 sekunder lite drygt. Detta då 100K instanser skapas. Detta ger en overhead på drygt 11 ms per instansiering.
Samtidigt är ju lösningen där php5 konstruktorn anropar php4 konstruktorn lättare att underhålla eftersom förändringar bara behöver göras på ett ställe istf två.
Om det skulle ta 11ms längre tid så skulle åtminstonde jag köra den snabbare metoden. 11ms är mycket. Däremot har du räknat fel på två decimaler.
kullervo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-06-23, 11:48 #10
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
Citat:
Originally posted by kullervo@Jun 23 2005, 01:20
Om det skulle ta 11ms längre tid så skulle åtminstonde jag köra den snabbare metoden. 11ms är mycket. Däremot har du räknat fel på två decimaler.
Räknat fel på två decimaler? hur menar du? Snarare tre tiopotenser... Ser att jag söp och korrigerade för ms vid uträkningen. Rätt tid per anrop är ju 0.011 ms. Vilket ännu mer övertygande för att man inte skall använda sig av "fulvarianten" och ha redundant kod.

Och 11ms kan du inte säga är mycket utan att säga vad det jämförs med. 11ms av något som tar 3s är lite. 11ms av något som tar 12ms är mycket.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 00:32.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017