Russian Qt Forum
Ноябрь 24, 2024, 17:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Как в QString сменить указатель на массив данных ?  (Прочитано 27494 раз)
SABROG
Гость
« Ответ #30 : Май 31, 2007, 22:05 »

Сделал проверку. Вот код:

Код:

/// TEST SECTION BEGIN
listExec(dbSPO,qList);
QTime tt1,tt2,tt3;
QVariantList thotels,trooms,tplaces,tmeals,tnights,tcheckins,tprice;
QSqlQuery tq(dbSPO);
/*
Inc int
Hotel int
Room int
Place int
Meal int
Night int
Checkin int
Price float
*/
tq.prepare("insert into price (hotel,room,place,meal,night,checkin,price) values (?,?,?,?,?,?,?);");
tt2.start();
xmlChar *tstr = (xmlChar *)"1234";
        for (int i=0; i < 154740; i++)
        {
            thotels << QString((const char *)tstr);
            trooms << QString((const char *)tstr);
            tplaces << QString((const char *)tstr);
            tmeals << QString((const char *)tstr);
            tnights << QString((const char *)tstr);
            tcheckins << QString((const char *)tstr);
            tprice << QString((const char *)tstr);
        }
qDebug("Generate queries: %d ms", tt2.elapsed());
tt3.start();
        tq.addBindValue(thotels);
        tq.addBindValue(trooms);
        tq.addBindValue(tplaces);
        tq.addBindValue(tmeals);
        tq.addBindValue(tnights);
        tq.addBindValue(tcheckins);
        tq.addBindValue(tprice);
qDebug("Bind values: %d ms", tt3.elapsed());
tt1.start();
if (!tq.execBatch())
     qDebug() << tq.lastError();
qDebug("Execute queries: %d ms", tt1.elapsed());
return true;
/// TEST SECTION END


Результат:

[31.05.07 22:58:52] [D] Generate queries: 1625 ms
[31.05.07 22:58:52] [D] Bind values: 0 ms
[31.05.07 23:00:53] [D] Execute queries: 120343 ms

Понравилась скорость генерирования запросов. Но вот 120 секунд на выполнение запроса, у меня сейчас запрос из 154740 строк вида "INSERT INTO .." в QStringList выполняется за 30 секунд, но вполне возможно, что это из-за того, что я не включил транзакцию.

Щас буду замерять скорость генерирования INSERTов отдельно от парсинга xmlя.

Такой тест еще провел:

Код:

/// TEST SECTION BEGIN 2
listExec(dbSPO,qList);
qList.clear();
QTime tt1,tt2;
tt2.start();
xmlChar *tstr = (xmlChar *)"1234";
        for (int i=0; i < 154740; i++)
        {
            qList << QString("INSERT INTO price (hotel,room,place,meal,night,checkin,price) VALUES (%1,%2,%3,%4,%5,%6,%7);")
            .arg(QString((const char *)tstr))
            .arg(QString((const char *)tstr))
            .arg(QString((const char *)tstr))
            .arg(QString((const char *)tstr))
            .arg(QString((const char *)tstr))
            .arg(QString((const char *)tstr))
            .arg(QString((const char *)tstr));
        }
qDebug("Generate queries: %d ms", tt2.elapsed());
tt1.start();
listExec(dbSPO,qList);
qDebug("Execute queries: %d ms", tt1.elapsed());
return true;
/// TEST SECTION END 2


Результаты:
[31.05.07 23:24:18] [D] Generate queries: 2750 ms
[31.05.07 23:24:36] [D] Execute queries: 18438 ms

Щас для первого теста попробую транзакцию включить.

Включил транзакцию, результаты первого теста превзлошли все мои ожидания:

Код:

dbSPO.transaction();
if (!tq.execBatch())
     qDebug() << tq.lastError();
dbSPO.commit();


[31.05.07 23:30:33] [D] Generate queries: 1469 ms
[31.05.07 23:30:33] [D] Bind values: 0 ms
[31.05.07 23:30:39] [D] Execute queries: 6484 ms
Записан
Вудруф
Гость
« Ответ #31 : Июнь 01, 2007, 08:13 »

Цитировать
в даном примере разницы не будет вообще

Почему это? Вариант a+b+c+d+e создаёт временные переменные, вариант с += - не создаёт.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #32 : Июнь 01, 2007, 08:48 »

Цитировать

Вариант a+b+c+d+e создаёт временные переменные, вариант с += - не создаёт.


Совершенно не факт. И в первом примере можно обойтись без временных переменных. Особенно если оптимизация компиля включена.

А вот уважаемый SABROG таки оптимизировал свой код Улыбающийся Молодец Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Tonal
Гость
« Ответ #33 : Июнь 01, 2007, 10:14 »

Цитата: "SABROG"
Включил транзакцию, результаты первого теста превзлошли все мои ожидания:
Код:

dbSPO.transaction();
if (!tq.execBatch())
     qDebug() << tq.lastError();
dbSPO.commit();


[31.05.07 23:30:33] [D] Generate queries: 1469 ms
[31.05.07 23:30:33] [D] Bind values: 0 ms
[31.05.07 23:30:39] [D] Execute queries: 6484 ms

Т.е. время выполнения запроса превышает время его генерации от 5-ти раз в лучшем случае до 2-х порядков ...
Не кажется ли тебе, что ты что-то не то оптимизируешь? ;-)
Записан
SABROG
Гость
« Ответ #34 : Июнь 01, 2007, 10:28 »

Ну движок SQLITE'a я оптимизировать врятли смогу, исходники есть конечно, но у меня своих тараканов в голове полно Улыбающийся

Еще я думал, что если из XMLя данные перенесу в базу, то база будет в несколько раз меньше весить чем XML, все-таки числа не строки. Но был разочарован, размер почти такой же у файла. А был еще больше, пришлось отказаться от типа данных DATE,DATETIME, т.к. все даты в SQLITE хранятся в виде текста, поставил intы и использую поле как unix timestamp.
Записан
Tonal
Гость
« Ответ #35 : Июнь 01, 2007, 11:19 »

Если нужно максимально компактно - можно XML упаковать. Или свой бинарный формат изобресть. ;-)
А движок базы оптимизирован по скорости выборок, а не по размеру данных.
Записан
Вудруф
Гость
« Ответ #36 : Июнь 01, 2007, 11:19 »

С другой стороны выборка информации из базы данных происходит явно быстрее, чем из XML-файла. Да и изменение тоже.
Так что нечего горевать о большом размере, плюсов-то гораздо больше.

У нас вон база несколько гигов занимает, и ничего, не страдаем Улыбающийся
Записан
SABROG
Гость
« Ответ #37 : Июнь 01, 2007, 12:34 »

Просто у меня планы были, организовать обмен SQLITE базами между компаниями, вместо неудобного XMLя. Сжимаемость SQLITE баз в 3 раза хуже чем у текстового XMLя, а значит все-таки траффика будет расходываться больше. Но да, плюсы в том, что можно сделать выборку тут же без парсинга и положить данные в основную базу.
Записан
Tonal
Гость
« Ответ #38 : Июнь 01, 2007, 21:11 »

Если таки обмен то зачем выборки?
Парсешь всё SAX-ом и заливаешь по ходу. Ну может какую фильтрацию делаешь.
Обменные форматы вроде бы под обмен м затачиваются - чтоб без особых раздумий  и тормозов сгенерить и влить...
Записан
SABROG
Гость
« Ответ #39 : Июнь 04, 2007, 11:29 »

Заметил, что часто в исходниках Qt используется QLatin1String:

Код:

QDebug operator<<(QDebug debug, QDir::Filters filters)
{
    QStringList flags;
    if (filters == QDir::NoFilter) {
        flags << QLatin1String("NoFilter");
    } else {
        if (filters & QDir::Dirs) flags << QLatin1String("Dirs");
        if (filters & QDir::AllDirs) flags << QLatin1String("AllDirs");
        if (filters & QDir::Files) flags << QLatin1String("Files");
        if (filters & QDir::Drives) flags << QLatin1String("Drives");
        if (filters & QDir::NoSymLinks) flags << QLatin1String("NoSymLinks");
        if (filters & QDir::NoDotAndDotDot) flags << QLatin1String("NoDotAndDotDot");
        if ((filters & QDir::AllEntries) == QDir::AllEntries) flags << QLatin1String("AllEntries");
        if (filters & QDir::Readable) flags << QLatin1String("Readable");
        if (filters & QDir::Writable) flags << QLatin1String("Writable");
        if (filters & QDir::Executable) flags << QLatin1String("Executable");
        if (filters & QDir::Modified) flags << QLatin1String("Modified");
        if (filters & QDir::Hidden) flags << QLatin1String("Hidden");
        if (filters & QDir::System) flags << QLatin1String("System");
        if (filters & QDir::CaseSensitive) flags << QLatin1String("CaseSensitive");
    }
    debug << "QDir::Filters(" << qPrintable(flags.join(QLatin1String("|"))) << ")";
    return debug;
}


Почитав описание, я так понял, что отличие его от QString в том, что QString делает копирование строки, а QLatin1String использует уже имеющийся указатель. Там даже есть такой пример:

Код:

 QLabel *label = new QLabel(QLatin1String("MOD"), this);


Т.е. если я запишу так, то строка "MOD" продублируется ?
Код:

 QLabel *label = new QLabel("MOD", this);


А как же implicit sharing ?
Записан
goer
Гость
« Ответ #40 : Июнь 04, 2007, 12:13 »

Цитировать
Почитав описание, я так понял, что отличие его от QString в том, что QString делает копирование строки


Assitant:

Цитировать
The QLatin1String class provides a thin wrapper around an ASCII/Latin-1 encoded string literal.


и дальше:

Applications that define QT_NO_CAST_FROM_ASCII don't have access to QString's const char * API, следовательно им нужно вызывать конструкторы копирования, присванивание и прочие "тяжелые" операции, для того чтобы "кастить" char* к QString. Вместо этого предлагают использовать QLatin1String для избежания этих тяжелых опраций и одновременно работой с char* как с QString.
Записан
SABROG
Гость
« Ответ #41 : Июнь 04, 2007, 12:59 »

Ну я не определял нигде QT_NO_CAST_FROM_ASCII, значит мне не надо использовать QLatin1String. А почему тогда тролли его используют, если его можно не использовать не понятно.
Записан
goer
Гость
« Ответ #42 : Июнь 04, 2007, 14:04 »

Потому что он "thin" :-)

Можно например юзать QTimer или QBasicTimer. Если QBasicTimer удовлетворяет потребностям, почему бы не заюзать его как более легкий класс.

Вообще не думаю что в бизнес-апликухах это столь важно, а для серьезных вычислений никто кути использовать не будет.
Записан
SABROG
Гость
« Ответ #43 : Июнь 04, 2007, 14:27 »

Ну "thin" переводится как "тонкий", т.е. все дело в экономии на отведение памяти под класс ?

А что используют под серьезные вычисления ? Чистый Си и Intel Compiler Улыбающийся ?
Записан
goer
Гость
« Ответ #44 : Июнь 04, 2007, 14:37 »

Иногда даже специальное железо. Хотя в последнее время "иногда" стало очень частым явлением.
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.342 секунд. Запросов: 23.