Smarty Forum Index Smarty
The discussions here are for Smarty, a template engine for the PHP programming language.
Array Perfomance im Loop

 
Post new topic   Reply to topic    Smarty Forum Index -> Language: German
View previous topic :: View next topic  
Author Message
TomTo
Smarty Rookie


Joined: 30 May 2009
Posts: 18

PostPosted: Sun Dec 30, 2012 4:11 pm    Post subject: Array Perfomance im Loop Reply with quote

Ich habe mal wieder eine Frage bezüglich Perfomance.
Ich erstelle gerade ein Mitglieder Portal, dort sollen Kundendaten wie Name, Alter, Strasse, usw. gelistet werden.

Nun habe ich mal eine Frage zu Ausgabe der Daten im Template.
Ist es besser das Array in einem Loop auszugeben, oder nicht ??
Mit geht es wirklich nur um die Perfomance, nicht um was anderes.

Eigentlich mache ich das immer wie folgt, die Art DB Abfrage ist dabei nur als Beispiel gedacht..

Code:

$abfrage = "SELECT * FROM TABELLE WHERE `id` = 1";
$RESULT = mysql_query($abfrage);
while($row = mysql_fetch_assoc($RESULT)) {

$kartendata[] =  array(
         'KartenName' => $row['name'],
         'KartenStrasse' => $row['strasse']);
}
$smarty->assign('kundendaten', $kartendata);



Code:

{section name=data loop=$kundendaten}   
{$kundendaten[data].KartenName}
{$kundendaten[data].KartenStrasse}
usw..
{/section}


Aber wie sieht es damit aus ?

Code:
   
$abfrage = mysql_query("SELECT * FROM TABELLE WHERE `id` = 1");

$kartendata = mysql_fetch_assoc($abfrage);

$smarty->assign('kundendaten', $kartendata);



Code:

{$kundendaten.name}
{$kundendaten.strasse}


Die zweite Methode finde ich schneller, mal davon abgesehn vom unterschiedlichen Stil der DB Abfrage.

Danke für die zahlreichen Antworten..

.
Back to top
View user's profile Send private message
U.Tews
Administrator


Joined: 22 Nov 2006
Posts: 4656
Location: Hamburg / Germany

PostPosted: Sun Dec 30, 2012 9:28 pm    Post subject: Reply with quote

Die 2. Variante ist schneller wenn Du nur eine Zeile der Tabelle verarbeiten musst.
Back to top
View user's profile Send private message
ne0hype
Smarty Rookie


Joined: 08 May 2010
Posts: 14

PostPosted: Mon Jan 07, 2013 12:03 am    Post subject: Reply with quote

Also ich finde das Problem gar nicht so trivial.

Ich selber verwendete auch die 1. Variante wenn ich mehrere Daten aus der Datenbank an Smarty übergeben will.

Praktisch wäre es wenn Smarty eine interne Funktion hätte mit der ich Datenbank-Resources über eine Schleite jagen kann ohne vorher das ganze in ein Array zu packen und dann wieder mit foreach im Template auszugeben.
Back to top
View user's profile Send private message
TomTo
Smarty Rookie


Joined: 30 May 2009
Posts: 18

PostPosted: Mon Jan 07, 2013 4:06 pm    Post subject: Reply with quote

ne0hype wrote:
Also ich finde das Problem gar nicht so trivial.

Ist es auch nicht, aber trotzdem scheint es niemanden hier groß zu interesieren !?

Schon alleine die reine Tip Ersparnis, wie zb. die Array Elemente zu deklarieren, ist schon ein guter Grund.
Von dem ganzen Schleifenbalast Template ganz zu schweigen.

Aber mal was anderes..
Ohne jetzt Smarty schlecht zu machen, aber ich gehe bei vielen Sachen ich immer mehr von Smarty weg.
In den letzten Jahren hatte ich fast jedes neue Projekt mit Smarty umgesetzt, aber in der letzten Zeit steige ich in punkto Template Management immer weiter auf Javascript um.

Der letzte Anstoß war der Umbau eines Smarty Portals auf ein JQuery Template mit der Datenbindung über JSON.
Nicht nur durch die Auslagerung auf die Clients hat sich die Server Perfomance um fast 40% verbessert, nur die Belastung des DB Server ist etwas gestiegen.

Durch die ganzen spielchen des JQuery Framework sieht das ganze Front-End auch noch viel moderner aus.
JQuery bindet man doch sowieso schon fast standardmäßig immer mit ein.

Gerade wenn man viele Interaktive Sachen wie Formulare usw hat, ist diese Methode prädestiniert und man schlägt gleich zwei Fliegen mit einer Klappe.
Ich kann nur jedem ans Herz legen das mal zu probieren, die Template Syntax ist sehr ähnlich.
Viele große Portale wie Facebook,Twitter und co. setzen schon lange auf die Ajax Methode mit dem JSON(P) Datenformat.
Am Anfang war es nur das reine API calling, aber alle erweitern und setzen immer mehr auf diese Art des Daten Management.


Last edited by TomTo on Fri Jan 25, 2013 4:49 pm; edited 1 time in total
Back to top
View user's profile Send private message
ovnn
Smarty Regular


Joined: 14 Apr 2010
Posts: 78
Location: Germany

PostPosted: Tue Jan 08, 2013 8:34 am    Post subject: Reply with quote

Was machst du mit den Usern die Javascript aus haben?
Back to top
View user's profile Send private message
TomTo
Smarty Rookie


Joined: 30 May 2009
Posts: 18

PostPosted: Tue Jan 08, 2013 5:31 pm    Post subject: Reply with quote

Teilweise hast Du schon Recht, aber die Konformität ist ein generelles Problem.
Denn es betrifft viele Bereiche, ich nehme nur mal das Beispiel Browser.
Laut der Heise Statistik benutzen noch 12% den veralteten IE6 Browser, der weder sicher, noch für moderne Webseiten geeignet ist.
Im Grunde verstehe ich auch nicht, warum User überhaupt Javascript deaktiviert haben, aus Sicherheitsgründen ?
Es gibt doch kaum Seiten die ohne Javascript laufen, nehme nur mal Facebook und co.

Aber wie schon gesagt, es ist natürlich ein Problem, laut meinen Server-Logs haben etwa 5-8% kein Javascript aktiviert, womit "ich" aber leben kann.
Back to top
View user's profile Send private message
ne0hype
Smarty Rookie


Joined: 08 May 2010
Posts: 14

PostPosted: Tue Jan 08, 2013 10:50 pm    Post subject: Reply with quote

Stichwort: Suchmaschinen.

Soweit ich weiß haben alle Crawler noch nicht die Möglichkeit die Seite dann zu indizieren.
Back to top
View user's profile Send private message
ovnn
Smarty Regular


Joined: 14 Apr 2010
Posts: 78
Location: Germany

PostPosted: Wed Jan 09, 2013 9:07 am    Post subject: Reply with quote

Jo Sumas sind auch ein Problem bei reinen JS Seiten.

Zu der Frage warum JS aus. Es gab mal eine Zeit, da wurde das von Heise und co Empfohlen.

Ich mach auch viel mit Jquery aber alles was sehr wichtig ist geht auch ohne JS auf den Seiten.
Back to top
View user's profile Send private message
TomTo
Smarty Rookie


Joined: 30 May 2009
Posts: 18

PostPosted: Wed Jan 09, 2013 12:29 pm    Post subject: Reply with quote

ne0hype wrote:
Stichwort: Suchmaschinen.

Soweit ich weiß haben alle Crawler noch nicht die Möglichkeit die Seite dann zu indizieren.


Wurde ja schon gesagt, Suchmaschinen haben damit eigentlich keine grösseren Probleme.

Es ist ja auch nicht für alles die erste Wahl, aber wenn man viele Formulare, Listen ect. benötigt und sowieso Javascript einsetzt, kann man auch noch gleich das Template darüber generieren.

Wir ich schon sagte, wir hatten ein gekanntes Erotikportal Portal umgebaut, wo sehr viele Daten für die ganzen Setkarten aus der DB übergeben werden mussten.
Wir generieren jetzt die ganzen Sachen zum grossen Teil über Ajax mit Datenbindung über JSON.
Die Seite ist x-mal moderner, der Traffic hat sich verringert, die Server Perfomance hat sich verbessert und die Seitenrelevanz hat sich auch nicht negativ verändert,
Der Kunde und die User sind begeistert, also was will man mehr !?

Klar gibt es auch Nachteile und man muss vieles dabei bedenken..
Das fängt schon an wie und wo man JS einbindet, viele packen alles nach oben, was natürlich falsch ist, JS gehört so weit wie möglich nach unten in eine Seite.

Und das JS out sein soll, kann ich eigentlich auch nicht sagen, ich finde eher im Gegenteil, alle setzen immer mehr drauf.
Back to top
View user's profile Send private message
ovnn
Smarty Regular


Joined: 14 Apr 2010
Posts: 78
Location: Germany

PostPosted: Fri Jan 11, 2013 10:58 am    Post subject: Reply with quote

Wenn ich das richtig sehe, wurde die Entwicklung sogar eingestellt:
https://github.com/jquery/jquery-tmpl#readme

scheint wohl keine Zukunft zu haben.
Back to top
View user's profile Send private message
Lillilotte
Smarty Rookie


Joined: 09 Jan 2013
Posts: 8

PostPosted: Thu Jan 24, 2013 5:34 pm    Post subject: Re: Array Perfomance im Loop Reply with quote

TomTo wrote:

Code:

$abfrage = "SELECT * FROM TABELLE WHERE `id` = 1";
$RESULT = mysql_query($abfrage);
while($row = mysql_fetch_assoc($RESULT)) {

$kartendata[] =  array(
         'KartenName' => $row['name'],
         'KartenStrasse' => $row['strasse']);
}
$smarty->assign('kundendaten', $kartendata);


Code:

{section name=data loop=$kundendaten}   
{$kundendaten[data].KartenName}
{$kundendaten[data].KartenStrasse}
usw..
{/section}



TomTo wrote:

Code:
   
$abfrage = mysql_query("SELECT * FROM TABELLE WHERE `id` = 1");

$kartendata = mysql_fetch_assoc($abfrage);

$smarty->assign('kundendaten', $kartendata);


Code:

{$kundendaten.name}
{$kundendaten.strasse}


Also irgendwie habe ich das Gefühl, dass hier Äpfel mit Birnen verglichen werden. Zum einen habe ich 1 Datensatz, welchen ich anzeigen möchte, zum anderen habe ich n Datensätze, welche ich anzeigen möchte. Um lediglich 1 Datensatz anzuzeigen ist natürlich, wie U.Tewes bereits erwähnte, Variante 2 zu bevorzugen, da u.a. schneller. Um allerdings n Datensätze anzuzeigen ist diese Variante nicht zu gebrauchen.

TomTo wrote:

Schon alleine die reine Tip Ersparnis, wie zb. die Array Elemente zu deklarieren, ist schon ein guter Grund.
Von dem ganzen Schleifenbalast im Script und Template ganz zu schweigen.


Variante 1 kann und würde ich persönlich auch, wie folgt abändern, wodurch man letztlich, mit Ausnahme der benötigten Schleifen, den gleichen Aufbau wie in Variante 2 hat.

Code:

$abfrage = mysql_query('SELECT * FROM `TABELLE` WHERE `id` = 1');
while ($row = mysql_fetch_assoc($abfrage)) {
  $kartendata[] = $row;
}
$smarty->assign('kundendaten', $kartendata);


Code:

{foreach $kundendaten as $data}
  {$data.name}
  {$data.strasse}
{/foreach}


Letztlich hat man hier 4 zusätzliche Zeilen, welche allerdings, vorausgesetzt man möchte mehrere Datensätze ausgeben, nicht wirklich zu vermeiden sind.
Back to top
View user's profile Send private message
jacz
Smarty Pro


Joined: 13 Nov 2010
Posts: 249

PostPosted: Fri Jan 25, 2013 2:06 pm    Post subject: Reply with quote

Wegen Performance würde ich mir an dieser Stelle keine Gedanken machen.

Ich würde mir aber Gedanken darüber machen ob man nicht lieber besser eine DB - Klasse einsetzt welche direkt die Ergebnisse auswirft, dann würde das Geschreibsel für die Zuweisung auch erheblich kleiner ausfallen:
Code:

$smarty->assign('kundendaten', $db->GetArray("SELECT * FROM TABELLE WHERE `id` = 1"));
Back to top
View user's profile Send private message Visit poster's website
ne0hype
Smarty Rookie


Joined: 08 May 2010
Posts: 14

PostPosted: Mon Apr 08, 2013 7:20 pm    Post subject: Reply with quote

Hi

um vielleicht den Thread nochmals zu pushen..

Ich hab nun folgendes gemacht:

Ich verwende die in PHP 5 eingeführte Iterator-Klasse

Code:
<?php

/**
 * @package      22-CMS 3.0
 * @internal   creation date:  10.3.2013  18:14
 *
 * @author       Julian Kern
 * @copyright    Copyright (c) 2007-2013 Julian Kern, twentytwo Solutions (http://www.22-solutions.de)
 *   
 * @package       22-CMS 3.0
 * @subpackage       Workbench library
 * @name         MySQL
 * @filesource      MySQLIterator.lib.class.php
 *
 */
 
 
namespace twentytwo\workbench\lib\mysql;

use twentytwo\workbench\lib\exception\UserException;
use twentytwo\workbench\lib\exception\FatalException;


class MySQLIterator implements \Iterator, \Countable {
   
    private $resource = null; 
    private $fetch = 'assoc';
   
    /**
     *
     */
    public function __construct($resource) {
       
        if(gettype($resource) != 'resource'){
            throw new FatalException('$resource ist nicht vom Typ "resource"');
        }
        $this->resource = $resource;
    }


    /**
     *
     */
    public function setFetchMethode($methode) {
        switch($methode){
            default:
            case "assoc":
                $this->fetch = 'assoc';
            break;
           
            case "object":
                $this->fetch = 'object';
            break;
           
            case "array":
                $this->fetch = 'array';
            break;
        }       
    }


    /**
     *
     */
    public function rewind() {
        mysql_data_seek($this->resource, 0);
    }


    /**
     *
     */
    public function current() {
        return $this->row;
    }
       
       
    /**
     *
     */
    public function key() {
        return $this->position;
    }


    /**
     *
     */
    public function next() {
        ++$this->position;
    }


    /**
     *
     */
    public function valid() {
        if($this->fetch == 'assoc'){
            $this->row = mysql_fetch_assoc($this->resource);   
        }elseif($this->fetch = 'object'){
            $this->row = mysql_fetch_object($this->resource);   
        }elseif($this->fetch = 'array'){
            $this->row = mysql_fetch_array($this->resource);   
        }
       
        if($this->row == false){
            return false;
        }else{
            return true;
        }
    }
   
   
    /**
     *
     */
    public function count() {
        return mysql_num_rows($this->resource);
    }
}
?>


in meiner MySQL Klasse steht dann sowas:

Code:
/**
     * Übergibt das Result dem MySQL-Iterator.
     * Iteration über foreach mittels Iterator interface
     *
     * @param           resource        $resource
     * @return          obj             MySQLIterator
     *
     */
    public function getIterator($result = false) {
       
        $result = ($result == false) ? $this->getResult() : $result;
        $iterator = new MySQLIterator($result);   
        return $iterator;
    }


Der Aufruf ist dann einfach

$smarty->assign('foo', $mysql->getIterator(mysql_query(...));

im Template dann

{foreach $foo as $bar}
{$bar.test}
{/foreach}
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Smarty Forum Index -> Language: German All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group
Protected by Anti-Spam ACP