php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.06.2007, 22:53  
Erfahrener Benutzer
 
Benutzerbild von GelaMu
 
Registriert seit: 05.03.2006
Beiträge: 183
GelaMu
Standard

KingCrunch,

wenn die Funktion einmal am Laufen ist, gibt es ja auch keine Geschwindkeitsunterschiede, es sei denn, man greift auf die Klasse zu, in dem man $this->var oder klass::$var benutzt (oder ähnliches).
Schleifen in dem Sinne wie for($i=0; $i<9999; $i++) { $x=$x*$i*x; } machen da fast keine Unterschiede.

Ich hab`s ganz einfach gestestet:
PHP-Code:
<?php

$GLOBALS
["*x*"] = array();
function 
meine_funktion() {
    
$GLOBALS["*x*"][] = microtime(true);
}

class 
meine_klasse {
    static 
$s = array();
    function 
meine_funktion() {
        
meine_klasse::$s[] = microtime(true);
    }
}

class 
meine_classe {
    var 
$s = array();
    function 
meine_funktion() {
        
$this->s[] = microtime(true);
    }
}

# Platz 1
$t1 microtime(true);
for(
$i=0$i<99999$i++) {
   
meine_funktion();
}
$t2 microtime(true);
echo (
$t2-$t1)."\n";

# Platz 2
$t1 microtime(true);
for(
$i=0$i<99999$i++) {
   
meine_klasse::meine_funktion();
}
$t2 microtime(true);
echo (
$t2-$t1)."\n";

# Platz 3
$o = new meine_classe;
$t1 microtime(true);
for(
$i=0$i<99999$i++) {
   
$o->meine_funktion();
}
$t2 microtime(true);
echo (
$t2-$t1)."\n";

?>

EDIT: Also, da hat sich wohl einiges geändert seit meinen letzten Tests
Platz 3 ist jetzt im Gegenteil Platz 1

Übrigens: sowas hier echo (microtime (true) - $stamp) * 1000 * 1000; ist immer etwas ungenauer. Besser zuerst sich die Timestamp in eine Variable holen, dann subtrahieren...
GelaMu ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.06.2007, 00:23  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Jetzt vergleichst du allerdings Äpfel mit Birnen: Du kannst doch nicht Klassenvariablen mit Objektvariablen und schon garnicht mit globalen Variablen (wobei diese sowieso furchtbar sind) vergleichen. Vergleichbarer wäre es, wenn du in deinen Methoden ebenfalls globale Variablenzugriff nutzen würdest. Zudem ist dein Beispiel beim Objekt sowieso nicht ganz durchdacht, weil du nun 100000 Objekte, mit einer Objektvariable als Array mit genau einem Element besitzt. Ich sachs ja: Äpfel und Birnen.

Etwas vergleichbares, wie Klassen- oder Objektvariablen gibt es nun mal in Funktionen nicht. Und da du ja eh nur die Klassen als "Funktionscontainer" benutzen wolltest, brauchst du sie auch garnicht Willst du allerdings mehr mit den Klassen oder Objekten machen, wird es immer schwieriger äquivalente Funktionen zu finden.

Die for-Schleife diente bei mir nur dazu PHP etwas zu beschäftigen. Im Endeffekt läuft es darauf hinaus, dass Klassen und Funktionen nunmal zwei verschiedene Dinge sind. Sich aber auf Funktionen zu beschränken, weil die vermeintlich schneller sind, ist allerdings nicht zu Ende gedacht. Man kann sich auch zu Tode optimieren

Zitat:
Zitat von GelaMu
Übrigens: sowas hier echo (microtime (true) - $stamp) * 1000 * 1000; ist immer etwas ungenauer. Besser zuerst sich die Timestamp in eine Variable holen, dann subtrahieren...
Das ist mir neu, kannst du mir das vielleicht erläutern? Meinem Wissensstand wird es ziemlich gleich behandelt. Oder meinst zu bezogen auf korrekte Zeitmessung und nicht Werteungenauigkeit? Dann wiederum ist es vernachlässigbar, da ja alle Werte von dieser Ungenauigkeit betroffen sind
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 09.06.2007, 00:30  
Erfahrener Benutzer
 
Registriert seit: 11.01.2005
Beiträge: 106
MerlinderZauberer ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo,

ich habe ein ähnliches Problem gehabt. Um zu prüfen, ob eine Funktion vorhanden ist, benutze ich folgendes Codeschnipsel:

PHP-Code:
    if (!function_exists('[name_der_funktion]'))
        {
        
trigger_error('Benötigte Funktionen [name_der_funktion] wurden nicht geladen!',E_USER_ERROR);
        } 
Statt trigger_error kannst hier dann eine include-Anweisung einbauen, um Deine fehlende Funktion aufzurufen.

Gruß

Merlin der Zauberer
__________________
www.Sternenwelt.net - Astronomie im Internet -
www.SternenweltForum.net - Antworten rund um die Astronomie -
MerlinderZauberer ist offline  
Alt 09.06.2007, 00:31  
Erfahrener Benutzer
 
Benutzerbild von GelaMu
 
Registriert seit: 05.03.2006
Beiträge: 183
GelaMu
Standard

KingCrunch,
ich weiß, dass das Benutzen der globalen Variable nicht so eine gute Idee ist, aber um mehreren Funktionen die Möglichkeit zu geben, untereinander Werte zu tauschen, ist es die einzige Möglichkeit für mich.

Und das zweitere: ja, ich meinte damit die Ungenauigkeit, aber wie du schon gesagt hast, spielt es keine Rolle, wenn es wo anders genau so benutzt wird und man keine genaueren Werte haben möchte, sondern Vergleiche.
GelaMu ist offline  
Alt 09.06.2007, 00:36  
Erfahrener Benutzer
 
Benutzerbild von GelaMu
 
Registriert seit: 05.03.2006
Beiträge: 183
GelaMu
Standard

Zitat:
Zitat von MerlinderZauberer
Hallo,

ich habe ein ähnliches Problem gehabt. Um zu prüfen, ob eine Funktion vorhanden ist, benutze ich folgendes Codeschnipsel:

PHP-Code:
<?php
if (!function_exists('[name_der_funktion]')) {
   
trigger_error('Benötigte Funktionen [name_der_funktion] wurden nicht geladen!',E_USER_ERROR);
}
?>
Statt trigger_error kannst hier dann eine include-Anweisung einbauen, um Deine fehlende Funktion aufzurufen.

Gruß

Merlin der Zauberer
Also, bei mir geht das noch einfacher: load("func.beispiel");
PHP-Code:
<?php

function load() {
    static 
$JustLoad = array();
    
$Files func_get_args();
    foreach(
$Files as $Name) {
        
$File STDINC_PATH."/inc/".$Name.".php";
        if(!
in_array($Name$JustLoad)) {
            if(
file_exists($File) AND is_readable($File)) {
                
$JustLoad[] = $Name;
                
__load($File$Name);
            } else {
                
debug::ferror(
                    
"load(".varexp($Name).")",
                    
"Konnte die Datei nicht includen: ".$File
                
);
            }
        }
    }
    return 
TRUE;
}
function 
__load($__File$__Name) {
    
$__Self substr($__Namestrpos($__Name".")+1);
    include(
$__File);
}

?>
GelaMu ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Templatesystem mit Funktionen und Variablen drin? BartTheDevil89 PHP Tipps 2008 6 01.07.2008 09:32
rekursive Funktionen ?? usima PHP Tipps 2008 2 04.05.2008 11:25
public, protected, private Funktionen ecomeback PHP Tipps 2007 10 21.08.2007 02:21
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
eine Variable für alle Funktionen definieren Wing PHP Tipps 2007 16 24.06.2007 21:02
komische arrays werden in funktionen nicht angenommen! mollitz PHP Tipps 2007 8 08.03.2007 18:50
Anweisungen, Befehlen und Funktionen guenterfrosch PHP Tipps 2006 7 08.10.2006 13:37
Funktionen überprüfen und Grafik Funktionen hans.karl2 PHP Tipps 2006 10 31.07.2006 20:08
Funktionen in Funktionen - ist das gut? Schneckenkind PHP Tipps 2006 23 10.06.2006 13:39
Globale Variabeln in Funktionen finerip PHP Tipps 2007 3 28.11.2005 16:00
Funktionen aufrufen PHP Tipps 2005 5 31.01.2005 10:57
Eure Ideen sind gefragt: eigene Funktionen verwalten PHP-Fortgeschrittene 12 17.01.2005 15:00
mySQL Funktionen TheSkaterFriend Off-Topic Diskussionen 1 20.06.2004 13:36
Funktionen Erklärung TheSkaterFriend PHP Tipps 2004 14 11.06.2004 22:05


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.