void ConversationModelPerfTest::getEvents() { QFETCH(int, messages); QFETCH(int, contacts); QFETCH(int, limit); qRegisterMetaType<QModelIndex>("QModelIndex"); QDateTime startTime = QDateTime::currentDateTime(); addTestGroups( group1, group2 ); int commitBatchSize = 75; #ifdef PERF_BATCH_SIZE commitBatchSize = PERF_BATCH_SIZE; #endif EventModel addModel; QDateTime when = QDateTime::currentDateTime(); QList<QString> remoteUids; qDebug() << __FUNCTION__ << "- Creating" << contacts << "new contacts"; int ci = 0; while(ci < contacts) { ci++; QString phoneNumber = QString().setNum(qrand() % 10000000); remoteUids << phoneNumber; addTestContact(QString("Test Contact %1").arg(ci), phoneNumber); if(ci % commitBatchSize == 0 && ci < contacts) { qDebug() << __FUNCTION__ << "- adding" << commitBatchSize << "contacts (" << ci << "/" << contacts << ")"; waitForIdle(5000); } } qDebug() << __FUNCTION__ << "- adding rest of the contacts (" << ci << "/" << contacts << ")"; waitForIdle(5000); QTest::qWait(TIMEOUT); qDebug() << __FUNCTION__ << "- Creating" << messages << "new messages"; QList<Event> eventList; int ei = 0; while(ei < messages) { ei++; Event::EventDirection direction; direction = qrand() % 2 > 0 ? Event::Inbound : Event::Outbound; Event e; e.setType(Event::SMSEvent); e.setDirection(direction); e.setGroupId(group1.id()); e.setStartTime(when.addSecs(ei)); e.setEndTime(when.addSecs(ei)); e.setLocalUid(ACCOUNT1); e.setRemoteUid(remoteUids.at(0)); e.setFreeText(randomMessage(qrand() % 49 + 1)); // Max 50 words / message e.setIsDraft(false); e.setIsMissedCall(false); eventList << e; if(ei % commitBatchSize == 0 && ei != messages) { qDebug() << __FUNCTION__ << "- adding" << commitBatchSize << "messages (" << ei << "/" << messages << ")"; QVERIFY(addModel.addEvents(eventList, false)); eventList.clear(); waitForIdle(); } } QVERIFY(addModel.addEvents(eventList, false)); qDebug() << __FUNCTION__ << "- adding rest of the messages (" << ei << "/" << messages << ")"; eventList.clear(); waitForIdle(); int iterations = 10; int sum = 0; QList<int> times; #ifdef PERF_ITERATIONS iterations = PERF_ITERATIONS; #endif char *iterVar = getenv("PERF_ITERATIONS"); if (iterVar) { int iters = QString::fromAscii(iterVar).toInt(); if (iters > 0) { iterations = iters; } } QTest::qWait(TIMEOUT); qDebug() << __FUNCTION__ << "- Fetching messages." << iterations << "iterations"; for(int i = 0; i < iterations; i++) { ConversationModel fetchModel; bool result = false; QSignalSpy rowsInserted(&fetchModel, SIGNAL(rowsInserted(const QModelIndex &, int, int))); if (limit < 0) { fetchModel.setQueryMode(EventModel::SyncQuery); } else { fetchModel.setQueryMode(EventModel::StreamedAsyncQuery); fetchModel.setFirstChunkSize(limit); fetchModel.setChunkSize(limit); } QTime time; time.start(); result = fetchModel.getEvents(group1.id()); if(limit >= 0) { while (time.elapsed() < 10000 && rowsInserted.isEmpty()) QCoreApplication::processEvents(); } int elapsed = time.elapsed(); times << elapsed; sum += elapsed; qDebug("Time elapsed: %d ms", elapsed); QVERIFY(result); QVERIFY(fetchModel.rowCount() > 0); // With 1000 messages deleting model right away results in segfault waitForIdle(); } if(logFile) { QTextStream out(logFile); out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << ": " << metaObject()->className() << "::" << QTest::currentTestFunction() << "(" << QTest::currentDataTag() << ", " << iterations << " iterations)" << "\n"; for (int i = 0; i < times.size(); i++) { out << times.at(i) << " "; } out << "\n"; } qSort(times); float median = 0.0; if(iterations % 2 > 0) { median = times[(int)(iterations / 2)]; } else { median = (times[iterations / 2] + times[iterations / 2 - 1]) / 2.0f; } float mean = sum / (float)iterations; int testSecs = startTime.secsTo(QDateTime::currentDateTime()); qDebug("##### Mean: %.1f; Median: %.1f; Test time: %dsec", mean, median, testSecs); if(logFile) { QTextStream out(logFile); out << "Median average: " << (int)median << " ms. Test time: "; if (testSecs > 3600) { out << (testSecs / 3600) << "h "; } if (testSecs > 60) { out << ((testSecs % 3600) / 60) << "m "; } out << ((testSecs % 3600) % 60) << "s\n"; } }
void Util::importSMS(QTextStream &in) { QString line; GroupModel groupModel; groupModel.enableContactChanges(false); groupModel.setQueryMode(EventModel::SyncQuery); QList<Event> events; int count = 0; int groupId; QMap<QString, int> phoneGroupMap; while (!(line = in.readLine()).isNull()) { count ++; std::cout << "Handling " << count << " messages" << std::endl; QStringList stringList = line.split(QChar(',')); QString remoteUid = stringList.at(0); QString localUid = RING_ACCOUNT; QDateTime startTime = QDateTime::fromString(stringList.at(2), "yyyy-MM-dd hh:mm:ss"); QDateTime endTime = startTime; if (!phoneGroupMap.contains(remoteUid)) { if (!groupModel.getGroups(RING_ACCOUNT, QString(remoteUid))) { std::cout << "Error getting groups!"; return; } else { if (groupModel.rowCount() >= 1) { groupId = groupModel.group(groupModel.index(0, 0)).id(); } else { // new group Group group; group.setLocalUid(localUid); QStringList remoteUids; remoteUids << remoteUid; group.setRemoteUids(remoteUids); if (!groupModel.addGroup(group)) { qCritical() << "Error adding group"; return; } groupId = group.id(); } phoneGroupMap.insert(remoteUid, groupId); } } else { groupId = phoneGroupMap[remoteUid]; } Event::EventDirection direction = Event::UnknownDirection; if (stringList.at(1) == QString("1")) direction = Event::Inbound; else direction = Event::Outbound; Event e; e.setDirection(direction); e.setType(Event::SMSEvent); e.setLocalUid(localUid); e.setMessageToken(QUuid::createUuid().toString()); e.setStartTime(startTime); e.setEndTime(endTime); e.setIsRead(true); e.setStatus(Event::DeliveredStatus); e.setBytesReceived(0); e.setGroupId(groupId); e.setRemoteUid(remoteUid); QString freeText = QStringList(stringList.mid(3)).join(QString(",")); if (freeText.count(QChar('"')) % 2 != 0) { QString nextLine; while (!(nextLine = in.readLine()).isNull()) { freeText += "\n" + nextLine; if (nextLine.count(QChar('"')) % 2 != 0) { break; } } } freeText = freeText.mid(1, freeText.length() - 2); freeText.replace(QString("\"\""), QChar('"')); e.setFreeText(freeText); events.append(e); std::cout << "Handled " << count << " messages" << std::endl; } if (events.count() > 0) { std::cout << "About to commit the changes" << std::endl; EventModel model; Catcher c(&model); if (!model.addEvents(events, false)) { qCritical() << "Error adding events"; return; } c.waitCommit(events.count()); } }
void CallModelPerfTest::getEvents() { QFETCH(int, events); QFETCH(int, contacts); QDateTime startTime = QDateTime::currentDateTime(); int commitBatchSize = 75; #ifdef PERF_BATCH_SIZE commitBatchSize = PERF_BATCH_SIZE; #endif EventModel addModel; QDateTime when = QDateTime::currentDateTime(); QList<QString> remoteUids; qDebug() << __FUNCTION__ << "- Creating" << contacts << "new contacts"; int ci = 0; while(ci < contacts) { ci++; QString phoneNumber = QString().setNum(qrand() % 10000000); remoteUids << phoneNumber; addTestContact(QString("Test Contact %1").arg(ci), phoneNumber); if(ci % commitBatchSize == 0 && ci < contacts) { qDebug() << __FUNCTION__ << "- adding" << commitBatchSize << "contacts (" << ci << "/" << contacts << ")"; waitForIdle(5000); } } qDebug() << __FUNCTION__ << "- adding rest of the contacts (" << ci << "/" << contacts << ")"; waitForIdle(5000); QTest::qWait(TIMEOUT); qDebug() << __FUNCTION__ << "- Creating" << events << "new events"; QList<Event> eventList; int ei = 0; while(ei < events) { ei++; Event::EventDirection direction; bool isMissed = false; if(qrand() % 2 > 0) { direction = Event::Inbound; isMissed = (qrand() % 2 > 0); } else { direction = Event::Outbound; } Event e; e.setType(Event::CallEvent); e.setDirection(direction); e.setGroupId(-1); e.setStartTime(when.addSecs(ei)); e.setEndTime(when.addSecs(ei)); e.setLocalUid(ACCOUNT1); e.setRemoteUid(remoteUids.at(qrand() % contacts)); e.setFreeText(""); e.setIsDraft(false); e.setIsMissedCall(isMissed); eventList << e; if(ei % commitBatchSize == 0 && ei != events) { qDebug() << __FUNCTION__ << "- adding" << commitBatchSize << "events (" << ei << "/" << events << ")"; QVERIFY(addModel.addEvents(eventList, false)); eventList.clear(); waitForIdle(); } } QVERIFY(addModel.addEvents(eventList, false)); qDebug() << __FUNCTION__ << "- adding rest of the events (" << ei << "/" << events << ")"; eventList.clear(); waitForIdle(); int iterations = 10; int sum = 0; QList<int> times; #ifdef PERF_ITERATIONS iterations = PERF_ITERATIONS; #endif char *iterVar = getenv("PERF_ITERATIONS"); if (iterVar) { int iters = QString::fromAscii(iterVar).toInt(); if (iters > 0) { iterations = iters; } } QTest::qWait(TIMEOUT); qDebug() << __FUNCTION__ << "- Fetching events." << iterations << "iterations"; for(int i = 0; i < iterations; i++) { CallModel fetchModel; bool result = false; fetchModel.setQueryMode(EventModel::SyncQuery); fetchModel.setFilter(CallModel::SortByContact); QTime time; time.start(); result = fetchModel.getEvents(); int elapsed = time.elapsed(); times << elapsed; sum += elapsed; qDebug("Time elapsed: %d ms", elapsed); QVERIFY(result); QVERIFY(fetchModel.rowCount() > 0); waitForIdle(); } if(logFile) { QTextStream out(logFile); out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << ": " << metaObject()->className() << "::" << QTest::currentTestFunction() << "(" << QTest::currentDataTag() << ", " << iterations << " iterations)" << "\n"; for (int i = 0; i < times.size(); i++) { out << times.at(i) << " "; } out << "\n"; } qSort(times); float median = 0.0; if(iterations % 2 > 0) { median = times[(int)(iterations / 2)]; } else { median = (times[iterations / 2] + times[iterations / 2 - 1]) / 2.0f; } float mean = sum / (float)iterations; int testSecs = startTime.secsTo(QDateTime::currentDateTime()); qDebug("##### Mean: %.1f; Median: %.1f; Test time: %dsec", mean, median, testSecs); if(logFile) { QTextStream out(logFile); out << "Median average: " << (int)median << " ms. Test time: "; if (testSecs > 3600) { out << (testSecs / 3600) << "h "; } if (testSecs > 60) { out << ((testSecs % 3600) / 60) << "m "; } out << ((testSecs % 3600) % 60) << "s\n"; } }