Use map to make DownloadResult lookup fast

pull/38/head
Tatsuhiro Tsujikawa 2012-12-16 18:50:45 +09:00
parent 0001f4cfbd
commit 0a4ce4fdb5
3 changed files with 32 additions and 6 deletions

View File

@ -187,6 +187,20 @@ void removeRequestGroupIndex
} }
} // namespace } // namespace
void RequestGroupMan::addDownloadResultIndex
(const SharedHandle<DownloadResult>& dr)
{
assert(drIndex_.count(dr->gid->getNumericId()) == 0);
drIndex_[dr->gid->getNumericId()] = dr;
}
void RequestGroupMan::removeDownloadResultIndex
(const SharedHandle<DownloadResult>& dr)
{
assert(drIndex_.count(dr->gid->getNumericId()) == 1);
drIndex_.erase(dr->gid->getNumericId());
}
size_t RequestGroupMan::countRequestGroup() const size_t RequestGroupMan::countRequestGroup() const
{ {
return requestGroups_.size(); return requestGroups_.size();
@ -972,13 +986,13 @@ TransferStat RequestGroupMan::calculateStat()
SharedHandle<DownloadResult> SharedHandle<DownloadResult>
RequestGroupMan::findDownloadResult(a2_gid_t gid) const RequestGroupMan::findDownloadResult(a2_gid_t gid) const
{ {
for(std::deque<SharedHandle<DownloadResult> >::const_iterator i = std::map<a2_gid_t, SharedHandle<DownloadResult> >::const_iterator i =
downloadResults_.begin(), eoi = downloadResults_.end(); i != eoi; ++i) { drIndex_.find(gid);
if((*i)->gid->getNumericId() == gid) { if(i != drIndex_.end()) {
return *i; return (*i).second;
} } else {
return SharedHandle<DownloadResult>();
} }
return SharedHandle<DownloadResult>();
} }
bool RequestGroupMan::removeDownloadResult(a2_gid_t gid) bool RequestGroupMan::removeDownloadResult(a2_gid_t gid)
@ -987,6 +1001,7 @@ bool RequestGroupMan::removeDownloadResult(a2_gid_t gid)
downloadResults_.begin(), eoi = downloadResults_.end(); i != eoi; ++i) { downloadResults_.begin(), eoi = downloadResults_.end(); i != eoi; ++i) {
if((*i)->gid->getNumericId() == gid) { if((*i)->gid->getNumericId() == gid) {
downloadResults_.erase(i); downloadResults_.erase(i);
removeDownloadResultIndex(*i);
return true; return true;
} }
} }
@ -1005,6 +1020,7 @@ void RequestGroupMan::addDownloadResult(const SharedHandle<DownloadResult>& dr)
++removedErrorResult_; ++removedErrorResult_;
} }
} }
drIndex_.clear();
downloadResults_.clear(); downloadResults_.clear();
} }
if(dr->belongsTo == 0 && dr->result != error_code::FINISHED) { if(dr->belongsTo == 0 && dr->result != error_code::FINISHED) {
@ -1022,16 +1038,19 @@ void RequestGroupMan::addDownloadResult(const SharedHandle<DownloadResult>& dr)
removedLastErrorResult_ = (*i)->result; removedLastErrorResult_ = (*i)->result;
++removedErrorResult_; ++removedErrorResult_;
} }
removeDownloadResultIndex(*i);
} }
downloadResults_.erase(downloadResults_.begin(), last); downloadResults_.erase(downloadResults_.begin(), last);
} }
downloadResults_.push_back(dr); downloadResults_.push_back(dr);
addDownloadResultIndex(dr);
} }
} }
void RequestGroupMan::purgeDownloadResult() void RequestGroupMan::purgeDownloadResult()
{ {
downloadResults_.clear(); downloadResults_.clear();
drIndex_.clear();
} }
SharedHandle<ServerStat> SharedHandle<ServerStat>

View File

@ -67,6 +67,9 @@ private:
// GID => RequestGroup index for faster retrieval. // GID => RequestGroup index for faster retrieval.
std::map<a2_gid_t, SharedHandle<RequestGroup> > groupIndex_; std::map<a2_gid_t, SharedHandle<RequestGroup> > groupIndex_;
std::deque<SharedHandle<DownloadResult> > downloadResults_; std::deque<SharedHandle<DownloadResult> > downloadResults_;
// GID => DownloadResult index for faster retrieval.
std::map<a2_gid_t, SharedHandle<DownloadResult> > drIndex_;
int maxSimultaneousDownloads_; int maxSimultaneousDownloads_;
const Option* option_; const Option* option_;
@ -113,6 +116,9 @@ private:
void addRequestGroupIndex(const SharedHandle<RequestGroup>& group); void addRequestGroupIndex(const SharedHandle<RequestGroup>& group);
void addRequestGroupIndex void addRequestGroupIndex
(const std::vector<SharedHandle<RequestGroup> >& groups); (const std::vector<SharedHandle<RequestGroup> >& groups);
void addDownloadResultIndex(const SharedHandle<DownloadResult>& dr);
void removeDownloadResultIndex(const SharedHandle<DownloadResult>& dr);
public: public:
RequestGroupMan(const std::vector<SharedHandle<RequestGroup> >& requestGroups, RequestGroupMan(const std::vector<SharedHandle<RequestGroup> >& requestGroups,
int maxSimultaneousDownloads, int maxSimultaneousDownloads,

View File

@ -37,6 +37,7 @@ SharedHandle<DownloadResult> createDownloadResult
std::vector<SharedHandle<FileEntry> > entries; std::vector<SharedHandle<FileEntry> > entries;
entries.push_back(entry); entries.push_back(entry);
SharedHandle<DownloadResult> dr(new DownloadResult()); SharedHandle<DownloadResult> dr(new DownloadResult());
dr->gid = GroupId::create();
dr->fileEntries = entries; dr->fileEntries = entries;
dr->result = result; dr->result = result;
dr->belongsTo = 0; dr->belongsTo = 0;