From patchwork Sun Dec 23 21:46:28 2007 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Reinhard Nissl X-Patchwork-Id: 12557 Received: from mail.gmx.net ([213.165.64.20]) by www.linuxtv.org with smtp (Exim 4.63) (envelope-from ) id 1J6Yeu-0000GZ-AH for vdr@linuxtv.org; Sun, 23 Dec 2007 22:46:56 +0100 Received: (qmail invoked by alias); 23 Dec 2007 21:46:25 -0000 Received: from p549314DA.dip0.t-ipconnect.de (EHLO [192.168.101.15]) [84.147.20.218] by mail.gmx.net (mp034) with SMTP; 23 Dec 2007 22:46:25 +0100 X-Authenticated: #527675 X-Provags-ID: V01U2FsdGVkX19XHYMKhElXIYL0Ly7qIRWbUKLQNCMFOm+n8C4LsH u3fQybZdTZZPWr Message-ID: <476ED734.4010802@gmx.de> Date: Sun, 23 Dec 2007 22:46:28 +0100 From: Reinhard Nissl User-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.9) Gecko/20070801 SUSE/2.0.0.9-0.1 Thunderbird/2.0.0.9 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: VDR Mailing List X-Y-GMX-Trusted: 0 Subject: [vdr] [ANNOUNCE] VDR-1.5.12: some "micro" speed improvements X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.9 Precedence: list Reply-To: VDR Mailing List List-Id: VDR Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 23 Dec 2007 21:46:56 -0000 Status: O X-Status: X-Keywords: X-UID: 14879 Hi, the attached patches speed up starting and stopping VDR on slow machines with huge channels.conf files, by avoiding some n / 2 * (n + 1) loops. Please test them and report bugs here. Bye. --- ../vdr-1.5.12-orig/epg.h 2006-10-07 15:47:19.000000000 +0200 +++ epg.h 2007-12-23 22:10:31.000000000 +0100 @@ -164,11 +164,15 @@ class cSchedules : public cList schedulesHash; static cSchedules schedules; static const char *epgDataFileName; static time_t lastCleanup; static time_t lastDump; static time_t modified; + void HashSchedule(cSchedule *Schedule); + void UnhashSchedule(cSchedule *Schedule); + static unsigned int HashKey(tChannelID ChannelID); public: static void SetEpgDataFileName(const char *FileName); static const cSchedules *Schedules(cSchedulesLock &SchedulesLock); --- ../vdr-1.5.12-orig/epg.c 2007-06-10 14:52:19.000000000 +0200 +++ epg.c 2007-12-23 22:10:31.000000000 +0100 @@ -1045,6 +1045,7 @@ cSchedule *cSchedules::AddSchedule(tChan if (!p) { p = new cSchedule(ChannelID); Add(p); + HashSchedule(p); cChannel *channel = Channels.GetByChannelID(ChannelID); if (channel) channel->schedule = p; @@ -1055,10 +1056,14 @@ cSchedule *cSchedules::AddSchedule(tChan const cSchedule *cSchedules::GetSchedule(tChannelID ChannelID) const { ChannelID.ClrRid(); - for (cSchedule *p = First(); p; p = Next(p)) { - if (p->ChannelID() == ChannelID) - return p; - } + cList *list = schedulesHash.GetList(HashKey(ChannelID)); + if (list) { + for (cHashObject *hobj = list->First(); hobj; hobj = list->Next(hobj)) { + cSchedule *p = (cSchedule *)hobj->Object(); + if (p->ChannelID() == ChannelID) + return p; + } + } return NULL; } @@ -1074,7 +1079,23 @@ const cSchedule *cSchedules::GetSchedule if (Channel->schedule == &DummySchedule && AddIfMissing) { cSchedule *Schedule = new cSchedule(Channel->GetChannelID()); ((cSchedules *)this)->Add(Schedule); + ((cSchedules *)this)->HashSchedule(Schedule); Channel->schedule = Schedule; } return Channel->schedule != &DummySchedule? Channel->schedule : NULL; } + +void cSchedules::HashSchedule(cSchedule *Schedule) +{ + schedulesHash.Add(Schedule, HashKey(Schedule->ChannelID().ClrRid())); +} + +void cSchedules::UnhashSchedule(cSchedule *Schedule) +{ + schedulesHash.Del(Schedule, HashKey(Schedule->ChannelID().ClrRid())); +} + +unsigned int cSchedules::HashKey(tChannelID ChannelID) +{ + return (unsigned int)((ChannelID.Nid() << 16 | ChannelID.Source()) ^ (ChannelID.Tid() << 16 | ChannelID.Sid()) ^ ChannelID.Rid()); +}