|
Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon. |
|
View previous topic :: View next topic |
Author |
Message |
TomTo Smarty Rookie
Joined: 30 May 2009 Posts: 18
|
Posted: Sun Dec 30, 2012 4:11 pm Post subject: Array Perfomance im Loop |
|
|
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 |
|
U.Tews Administrator
Joined: 22 Nov 2006 Posts: 5068 Location: Hamburg / Germany
|
Posted: Sun Dec 30, 2012 9:28 pm Post subject: |
|
|
Die 2. Variante ist schneller wenn Du nur eine Zeile der Tabelle verarbeiten musst. |
|
Back to top |
|
ne0hype Smarty Rookie
Joined: 08 May 2010 Posts: 14
|
Posted: Mon Jan 07, 2013 12:03 am Post subject: |
|
|
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 |
|
TomTo Smarty Rookie
Joined: 30 May 2009 Posts: 18
|
Posted: Mon Jan 07, 2013 4:06 pm Post subject: |
|
|
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 |
|
ovnn Smarty Regular
Joined: 14 Apr 2010 Posts: 82 Location: Germany
|
Posted: Tue Jan 08, 2013 8:34 am Post subject: |
|
|
Was machst du mit den Usern die Javascript aus haben? |
|
Back to top |
|
TomTo Smarty Rookie
Joined: 30 May 2009 Posts: 18
|
Posted: Tue Jan 08, 2013 5:31 pm Post subject: |
|
|
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 |
|
ne0hype Smarty Rookie
Joined: 08 May 2010 Posts: 14
|
Posted: Tue Jan 08, 2013 10:50 pm Post subject: |
|
|
Stichwort: Suchmaschinen.
Soweit ich weiß haben alle Crawler noch nicht die Möglichkeit die Seite dann zu indizieren. |
|
Back to top |
|
ovnn Smarty Regular
Joined: 14 Apr 2010 Posts: 82 Location: Germany
|
Posted: Wed Jan 09, 2013 9:07 am Post subject: |
|
|
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 |
|
TomTo Smarty Rookie
Joined: 30 May 2009 Posts: 18
|
Posted: Wed Jan 09, 2013 12:29 pm Post subject: |
|
|
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 |
|
ovnn Smarty Regular
Joined: 14 Apr 2010 Posts: 82 Location: Germany
|
|
Back to top |
|
Lillilotte Smarty Rookie
Joined: 09 Jan 2013 Posts: 8
|
Posted: Thu Jan 24, 2013 5:34 pm Post subject: Re: Array Perfomance im Loop |
|
|
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 |
|
ne0hype Smarty Rookie
Joined: 08 May 2010 Posts: 14
|
Posted: Mon Apr 08, 2013 7:20 pm Post subject: |
|
|
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 |
|
|
|
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
|
|