switch vs. assoziatives Array

09/12/2011 - 16:51 von Stefan+Usenet | Report spam
Ich habe eine Klasse, die diverse, per Name referenzierbare Parameter
bereitstellt. Fast Immer(TM) werden gar keine oder nur einige wenige der
moeglichen Parameter benoetigt, weshalb ich ein:

| public static function getParameter($name) {
| switch ($name) {
| case 'a': ...
| case 'b': ...
| }
| }

gegenueber einem statischen Array (welches zunaechst einmal komplett
initialisiert werden muss) und

| public static function getParameter($name) {
| if (is_null(self::$array)) {
| self::$array = array();
| self::$array['a'] = ...
| self::$array['b'] = ...
| }
| return self::$array[$name];
| }

bevorzuge - der Performance-Gewinn ist makroskopisch erkennbar.

Nun kommt aber leider alle paar 1000 Aufrufe jemand daher und moechte
_alle_ moeglichen Parameter wissen. Bei einem Array waere das mit einer
Zeile erledig. Beim switch - faellt mir nichts ein, wie ich eine Liste
aller verfuegbaren Zweige bekaeme (wobei die Performance zwar nicht
voellig gleichgueltig, aber doch eher sekundaer ist).

Hat jemand eine Idee, wie man den Code gestalten koennte, um beiden
Anforderungen gerecht zu werden?

Servus,
Stefan

http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Glück im Kaufrausch: Stefan!
(Sloganizer)
 

Lesen sie die antworten

#1 Thomas PointedEars Lahn
09/12/2011 - 19:16 | Warnen spam
Stefan Froehlich wrote:

Ich habe eine Klasse, die diverse, per Name referenzierbare Parameter
bereitstellt. Fast Immer(TM) werden gar keine oder nur einige wenige der
moeglichen Parameter benoetigt, weshalb ich ein:

| public static function getParameter($name) {
| switch ($name) {
| case 'a': ...
| case 'b': ...
| }
| }

gegenueber einem statischen Array (welches zunaechst einmal komplett
initialisiert werden muss) und

| public static function getParameter($name) {
|if (is_null(self::$array)) {
|self::$array = array();
|self::$array['a'] = ...
|self::$array['b'] = ...
|}
| return self::$array[$name];
| }

bevorzuge - der Performance-Gewinn ist makroskopisch erkennbar.



Der Ansatz ergibt auch keinen Sinn. Weshalb erzeugst Du das Array beim
(ersten) Aufruf? Weshalb verwendest Du nicht die Parameter von array(),
sondern weist einzeln zu?

Nun kommt aber leider alle paar 1000 Aufrufe jemand daher und moechte
_alle_ moeglichen Parameter wissen. Bei einem Array waere das mit einer
Zeile erledig. Beim switch - faellt mir nichts ein, wie ich eine Liste
aller verfuegbaren Zweige bekaeme (wobei die Performance zwar nicht
voellig gleichgueltig, aber doch eher sekundaer ist).

Hat jemand eine Idee, wie man den Code gestalten koennte, um beiden
Anforderungen gerecht zu werden?



Ich würd's so machen:

protected static $params = @array_combine(
array('p', 'o', 's', 's', 'i', 'b', 'l', 'e', '_',
'p', 'a', 'r', 'a', 'm', 's'),
array());

public static function getParam($name)
{
$params =& self::$params;
return array_key_exists($name, $params) ? $params[$name] : null;
}

public static function getParams($sorted = false)
{
$a = self::$params;

if ($sorted)
{
asort($a);
}

return &$a;
}

Wenn Du unbedingt Mikro-Optimierung betreiben willst, kannst Du das Array
natürlich in dieser Art auch in getParam() dynamisch initialisieren.
getAllParams() wird aber dann nichts Brauchbares liefern, bevor getParam()
aufgerufen wurde.

Alternativ

public static function getParam($name = null)
{
static $params = @array_combine(
array('p', 'o', 's', 's', 'i', 'b', 'l', 'e', '_',
'p', 'a', 'r', 'a', 'm', 's'),
array());

if (is_null($name))
{
return &$params;
}

return array_key_exists($name, $params) ? $params[$name] : null;
}

Schön ist aber anders.

Ungetestet.


HTH
PointedEars

Please do not Cc: me. / Bitte keine Kopien per E-Mail.

Ähnliche fragen