From: Zack Rusin Date: Mon, 29 Aug 2011 02:05:31 +0000 (-0400) Subject: Switch list to a vector. X-Git-Url: https://git.cworth.org/git?a=commitdiff_plain;h=4d0ef5d3d040704f61e0814c9260c1a2ca11c24d;p=apitrace Switch list to a vector. further reduces memory usage by avoiding overallocation on lists --- diff --git a/gui/apitrace.cpp b/gui/apitrace.cpp index 8b2eeec..51c4755 100644 --- a/gui/apitrace.cpp +++ b/gui/apitrace.cpp @@ -74,7 +74,7 @@ ApiTrace::FrameMarker ApiTrace::frameMarker() const return m_frameMarker; } -QList ApiTrace::calls() const +QVector ApiTrace::calls() const { return m_calls; } @@ -146,7 +146,7 @@ void ApiTrace::setFrameMarker(FrameMarker marker) void ApiTrace::addFrames(const QList &frames) { - QList calls; + QVector calls; int currentFrames = m_frames.count(); int numNewFrames = frames.count(); @@ -161,7 +161,7 @@ void ApiTrace::addFrames(const QList &frames) numNewCalls += frame->numChildren(); calls += frame->calls(); } - m_calls.reserve(m_calls.count() + calls.count()); + m_calls.reserve(m_calls.count() + calls.count() + 1); m_calls += calls; emit endAddingFrames(); diff --git a/gui/apitrace.h b/gui/apitrace.h index e2c1451..036a84c 100644 --- a/gui/apitrace.h +++ b/gui/apitrace.h @@ -40,7 +40,7 @@ public: void addEnumSignature(unsigned id, ApiTraceEnumSignature *signature); - QList calls() const; + QVector calls() const; ApiTraceCall *callAt(int idx) const; ApiTraceCall *callWithIndex(int idx) const; int numCalls() const; @@ -89,7 +89,7 @@ private: QString m_tempFileName; QList m_frames; - QList m_calls; + QVector m_calls; FrameMarker m_frameMarker; diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index ea1b3e2..bdf5591 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -979,7 +979,7 @@ void ApiTraceFrame::addCall(ApiTraceCall *call) } } -QList ApiTraceFrame::calls() const +QVector ApiTraceFrame::calls() const { return m_calls; } @@ -1003,3 +1003,10 @@ int ApiTraceFrame::binaryDataSize() const { return m_binaryDataSize; } + +void ApiTraceFrame::setCalls(const QVector &calls, + quint64 binaryDataSize) +{ + m_calls = calls; + m_binaryDataSize = binaryDataSize; +} diff --git a/gui/apitracecall.h b/gui/apitracecall.h index 9d67feb..3da1d7d 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -297,13 +297,15 @@ public: int callIndex(ApiTraceCall *call) const; ApiTraceCall *call(int idx) const; void addCall(ApiTraceCall *call); - QList calls() const; + QVector calls() const; + void setCalls(const QVector &calls, + quint64 binaryDataSize); int binaryDataSize() const; private: ApiTrace *m_parentTrace; quint64 m_binaryDataSize; - QList m_calls; + QVector m_calls; }; Q_DECLARE_METATYPE(ApiTraceFrame*); diff --git a/gui/loaderthread.cpp b/gui/loaderthread.cpp index 0545453..f311fe0 100644 --- a/gui/loaderthread.cpp +++ b/gui/loaderthread.cpp @@ -55,6 +55,8 @@ void LoaderThread::run() file.close(); Trace::Parser p; + QVector calls; + quint64 binaryDataSize = 0; if (p.open(m_fileName.toLatin1().constData())) { Trace::Call *call = p.parse_call(); while (call) { @@ -66,11 +68,20 @@ void LoaderThread::run() } ApiTraceCall *apiCall = apiCallFromTraceCall(call, helpHash, currentFrame); - currentFrame->addCall(apiCall); + calls.append(apiCall); + if (apiCall->hasBinaryData()) { + QByteArray data = + apiCall->arguments()[apiCall->binaryDataIndex()].toByteArray(); + binaryDataSize += data.size(); + } if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) { + calls.squeeze(); + currentFrame->setCalls(calls, binaryDataSize); + calls.clear(); frames.append(currentFrame); currentFrame = 0; + binaryDataSize = 0; if (frames.count() >= FRAMES_TO_CACHE) { emit parsedFrames(frames); frames.clear(); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 5072db7..34e99f5 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -856,7 +856,7 @@ void MainWindow::slotSearchNext(const QString &str, m_searchWidget->setFound(false); return; } - const QList &calls = m_trace->calls(); + const QVector &calls = m_trace->calls(); int callNum = calls.indexOf(call); for (int i = callNum + 1; i < calls.count(); ++i) { @@ -907,7 +907,7 @@ void MainWindow::slotSearchPrev(const QString &str, m_searchWidget->setFound(false); return; } - const QList &calls = m_trace->calls(); + const QVector &calls = m_trace->calls(); int callNum = calls.indexOf(call); for (int i = callNum - 1; i >= 0; --i) { @@ -1002,8 +1002,8 @@ void MainWindow::slotGoFrameStart() return; } - QList::const_iterator itr; - QList calls = frame->calls(); + QVector::const_iterator itr; + QVector calls = frame->calls(); itr = calls.constBegin(); while (itr != calls.constEnd()) { @@ -1023,8 +1023,8 @@ void MainWindow::slotGoFrameEnd() if (!frame || frame->isEmpty()) { return; } - QList::const_iterator itr; - QList calls = frame->calls(); + QVector::const_iterator itr; + QVector calls = frame->calls(); itr = calls.constEnd(); do { diff --git a/gui/saverthread.cpp b/gui/saverthread.cpp index d7f6906..5cf8818 100644 --- a/gui/saverthread.cpp +++ b/gui/saverthread.cpp @@ -210,7 +210,7 @@ SaverThread::SaverThread(QObject *parent) } void SaverThread::saveFile(const QString &fileName, - const QList &calls) + const QVector &calls) { m_fileName = fileName; m_calls = calls; diff --git a/gui/saverthread.h b/gui/saverthread.h index 5bea5b7..3da502c 100644 --- a/gui/saverthread.h +++ b/gui/saverthread.h @@ -4,7 +4,7 @@ #include "apitrace.h" #include -#include +#include class ApiTraceCall; class ApiTraceFrame; @@ -17,7 +17,7 @@ public: public slots: void saveFile(const QString &fileName, - const QList &calls); + const QVector &calls); signals: void traceSaved(); @@ -27,7 +27,7 @@ protected: private: QString m_fileName; - QList m_calls; + QVector m_calls; };