
|
|
|
Date_Holidays Driver isHoliday höllisch langsam |
| Hi,
danke für's Interesse. Ich habe profiled und herausgefunden, dass in Driver.php bei isHoliday - abgesehen von anderen Änderungen - 2 zusätzliche Funktionsaufrufe von $this->setYear() hinzugekommen sind:
Aktuelle Version:
function isHoliday($date, $filter = null)
{
if (! is_a($date, 'Date')) {
$date = $this->_convertDate($date);
if (Date_Holidays::isError($date)) {
return $date;
}
}
//rebuild internal array of holidays if required.
$compare_year = $date->getYear();
$this_year = $this->getYear();
if ($this_year !== $compare_year) {
$this->setYear($compare_year);
}
if (is_null($filter)) {
$filter = new Date_Holidays_Filter_Blacklist(array());
} elseif (is_array($filter)) {
$filter = new Date_Holidays_Filter_Whitelist($filter);
}
foreach (array_keys($this->_dates) as $internalName) {
if ($filter->accept($internalName)) {
if (Date_Holidays_Driver::dateSloppyCompare($date,
$this->_dates[$internalName]) != 0) {
continue;
}
$this->setYear($this_year);
return true;
}
}
$this->setYear($this_year);
return false;
}
Version 0.17.4: (in der nächsten ist es bereits geändert)
function isHoliday($date, $filter = null)
{
if (! is_a($date, 'Date')) {
$date = $this->_convertDate($date);
if (Date_Holidays::isError($date)) {
return $date;
}
}
//rebuild internal array of holidays if required.
$compare_year = $date->getYear();
if ($this->getYear() !== $compare_year) {
$this->setYear($compare_year);
}
if (is_null($filter)) {
$filter = new Date_Holidays_Filter_Blacklist(array());
} elseif (is_array($filter)) {
$filter = new Date_Holidays_Filter_Whitelist($filter);
}
foreach (array_keys($this->_dates) as $internalName) {
if ($filter->accept($internalName)) {
if (Date_Holidays_Driver::dateSloppyCompare($date,
$this->_dates[$internalName]) != 0) {
continue;
}
return true;
}
}
return false;
}
Dieser Funktionsaufruf ist sehr teuer. Er ist die direkte Ursache für mein Problem. Wenn man so wie ich einen Kalender für das ganze Jahr anzeigen lässt, wird es sehr langsam (18 Sekunden!), wenn für jeden Tag abgeprüft weden muss, ob er vielleicht ein Feiertag ist. Dies betrifft dann auch z.B. die Zählung der Dauer eines Ereignisses, bei dem Feiertage nicht mitgezählt werden dürfen (z.B. Urlaube).
Die Frage ist, WARUM hier setYear nochmal mit dem zwischengespeicherten aktuellen Jahr des Drivers gespeichert werden muss, wo doch darauf eigentlich keine Änderung durchgeführt wird.
Greetings
René |
|
|
| weiterlesen... |
Quelle: Pear Forum |
|
|
Weitere Artikel:
Sequences and auto-incrementing Hallo,
Versuche mich gerade ine bischen schlau zu machen mit die Sequences und auto-incrementing ... Lesen Prog gesucht Für eine Musikseite wird jemand in Hannover oder Umgebung (Treffen erforderlich) gesucht, der ... Lesen Mail senden Ha, habe die fehlenden File nachinstalliert.
Zumindest kommt die Fehler-Meldung nicht mehr.
Denke ... Lesen QuickForm - setSelected geht nicht bei array Grundsätzlich ist $form->setDefaults(...); allen Aufrufen wie setSelected(), setValue() ... Lesen cryptType bei AES_ENCRYPT? Hallo mal wieder :), (sorry, hatte ich vergessen)
ein Modul meines Projektes verwendet die Klasse ... Lesen fehler E200 bei DB_NestedSet und MySQL Hallo Leute,
da ich mich mit pear noch nicht viel auseinader gesetzt hab und bis jetzt ohne diese ... Lesen Mail with SMTP Bitte mal die Forumssuche bemühen - dieses Thema hatten wir schon oft genug. Wenn du damit ... Lesen Sortierung - Filter Hallo *,
vielleicht kann mir jemand von euch weiterhelfen, leider hab ich keine geeignete ... Lesen
|
|
|
|
|
|
|
|