Приложение на Qt + sqlite работает в Windows медленнее чем в Mac OS?
Не сочтите за троллинг, но так получилось.
Пишу анализатор текстовых файлов — для каждого файла: считывает в ОП, обрабатывает, пишет результат в sqlite.
Разрабатывал на Mac OS — все устраивало, не мог нарадоваться. Попробовал на Windows и был крайне удивлен. Скорость работы конечного приложения явно меньше — причем на Mac OS общая загрузка процессора во время работы программы обычно была под процентов 80-90, а тут в районе 10-20. На Mac OS — GCC, на Windows — mingv и vs2010.
Ещё придумал. Возможно проблемы из-за разных скорости отзывчивости ФС или из-за разницы в системных вызовах для блокировки файлов (попытайтесь вынести весь код для работы с ФС в отдельную библиотекуи переписать под API каждой ОС отдельно). Надо код смотреть.
Спасибо, флаги оптимизации не использовал и не шарю. Что за «зверь», где посоветуете почитать о нем?
Вообще приложение небольшое, весь код для работы непосредственно с ФС вынесен в отдельный файл и использует Qt API — QFile, QFileInfo, QTextStream. Еще смущает то, что используется sqlite — может он как-то неправильно себя ведет и стоит пытаться буферизировать его работу. Но тогда непонятно как будут работать запросы из sqlite пока не «сбросишь» буфер.
Спасибо! Когда создаю в памяти, программа отрабатывает быстро… Нагуглил что это практически классическая проблема, которая возникает если не используются транзакции. Попробовал использовать — теперь в "*.db" файл ничего не сохраняется, после завершения программы остается "*.db-journal". Наверное тема «кривизны рук» не раскрыта…
Похоже у меня проблема в неправильном подходе к организации работы с БД… Например так пытаюсь открывать транзакцию: bool QDBModel::transaction()
{
QSqlDatabase db = QSqlDatabase::database();
if ( !db.open() ) {
QMessageBox::critical( 0,
qApp->tr( "Cannot open database" ),
qApp->tr( "Unable to establish a database connection." ),
QMessageBox::Cancel );
return false;
} else {
//bool flag = db.transaction();
bool flag = db.driver()->beginTransaction();
qDebug() << db.lastError();
return flag;
//return db.transaction();
}
}
Т.е. идея была в том, чтоб вынести всю работу с базой в один клас, включить его где надо и дергать его методы. Но в данном случае при очистке автоматической переменной db транзакция «умирает». Так?
Простите, во-первых почему-то не сработал тег код, а во-вторых я не показал что дебаг-консоль изобразила. Сделал логирование для старта транзакции и коммита (для роллбека тоже есть, но, судя по пошаговой отладке, он никогда не вызывается). Вижу такое:
Debugging starts
QSqlError(-1, "", "")
QSqlError(-1, «Unable to commit transaction», «cannot commit — no transaction is active»)
QSqlError(-1, «Unable to commit transaction», «cannot commit — no transaction is active»)
QSqlError(-1, «Unable to commit transaction», «cannot commit — no transaction is active»)
…
QSqlError(-1, «Unable to commit transaction», «cannot commit — no transaction is active»)
QSqlError(-1, «Unable to commit transaction», «cannot commit — no transaction is active»)
QSqlError(-1, «Unable to commit transaction», «cannot commit — no transaction is active»)
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
Debugging has finished
Может быть на Windows ваше приложение упирается в скорость работы жесткого диска (в мониторе ресурсов можно посмотреть)? Если да, то нужно заставить систему кэшировать нужные данные в память: изменить настройки sqlite, перенести какие-то файлы на ram диск или еще как-то.
Диспетчер задач -> Быстродействие -> Монитор ресурсов -> Диск. Там будет видно скорость чтения/записи для каждого процесса и суммарную, а также файлы, к которым идет активный доступ. Нужно будет сравнить скорость с максимальной скоростью диска (можно прикинуть в зависимости от модели или замерить ее какой-нибудь утилитой).