Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: kibsoft от Ноябрь 09, 2009, 14:25



Название: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 09, 2009, 14:25
Код:
QApplication app(argc,argv);
    QWidget w;
    QString str1("Number: "),str2(" Sum: ");
    QStringList str;
    QListWidget s(&w);
    uint sum=0;
    w.show();
    for(int i=0;i<150000;++i)
    {
        sum+=i;
        str << (str1+QString::number(i)+str2+QString::number(sum));
    }
    s.addItems(str);
    app.exec();
Данный код выполняется 8 секунд, можно ли как-то ускорить?


Название: Re: Оптимизировать код...
Отправлено: Alex Custov от Ноябрь 09, 2009, 14:29
Код:
QApplication app(argc,argv);
    QWidget w;
    QString str1("Number: "),str2(" Sum: ");
    QStringList str;
    QListWidget s(&w);
    uint sum=0;
    w.show();
    for(int i=0;i<150000;++i)
    {
        sum+=i;
        str << (str1+QString::number(i)+str2+QString::number(sum));
    }
    s.addItems(str);
    app.exec();
Данный код выполняется 8 секунд, можно ли как-то ускорить?

Код
Diff
-str << (str1+QString::number(i)+str2+QString::number(sum));
+str << QString("Number: %1, Sum: %2").arg(i).arg(sum);
 

И поробуй s.setUniformItemSizes(true);


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 09, 2009, 14:43
setUniformItemSizes(true) сработало! теперь за секунду выводит..прочитал в документации, что это свойство дожно быть тру, только когда все элементы одинакового размера..что это значит? у меня же все строки разного размера...


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 10, 2009, 14:19
Один товарищ зае...л меня с WPF и C#, написали прогу, которая выводит сумму предыдущих элементов, но он создает уже инициализированный массив, т.е. string[] str=new string[150000] и естественно она работает быстрее... у меня тормоз проявляется в строке lw->addItems(str), подскажите, как можно ускорить работы программы, чтобы он от меня отстал наконец  :)

Код:
QListWidget *lw;
 lw=new QListWidget();
    lw->setUniformItemSizes(true);
QString str1("Number: "),str2(" Sum: ");
    QStringList str;
    uint sum=0;
    for(int i=0;i<=150000;++i)  {
        sum+=i;
        str << ((str1+QString::number(i)+str2+QString::number(sum)));
    }
    lw->addItems(str);


Название: Re: Оптимизировать код...
Отправлено: Авварон от Ноябрь 10, 2009, 14:27
QVector vector (150000);
блаблабла
QStringList str(QList<QString>::fromVector(vector));

и сделай таки
QString("Number: %1, Sum: %2").arg(i).arg(sum);


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 10, 2009, 14:42
Если вы имели ввиду так:
Код:
QVector<QString> vector(150000);
    uint sum=0;
    for(int i=0;i<150000;++i)  {
        sum+=i;
        vector[i]= QString("Number: %1 Sum: %2").arg(i).arg(sum);;
    }
    QStringList str(QList<QString>::fromVector(vector));
    lw->addItems(str);
то результат тот же :(


Название: Re: Оптимизировать код...
Отправлено: Авварон от Ноябрь 10, 2009, 14:49
имхо тут уже ограничение вьюхи... Можно попробовать сделать QStringListModel, запихать ее во QListView и настроить его как в примере fetchMore. Да, и показывать вьюху после добавления


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 10, 2009, 14:55
Представление+модель ускорило работу приложения :) спасибо! еще наверное можно использовать не QString, а массивы char  ;D


Название: Re: Оптимизировать код...
Отправлено: Авварон от Ноябрь 10, 2009, 15:00
не QString ты не засунешь в модель... Я думал о QLatin1String, но ее все равно надо конвертировать в QString
а ты делал fetch?


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 10, 2009, 15:10
Не, я так делал:
Код:
uint sum=0;
    for(int i=0;i<=150000;++i)  {
        sum+=i;
        str.append(QString("Number: %1 Sum: %2").arg(i).arg(sum));

    }
    model->setStringList(str);
    lv->setModel(model);


Название: Re: Оптимизировать код...
Отправлено: Авварон от Ноябрь 10, 2009, 15:12
попробуй дополнительно глянуть этот пример. По идее должно сделать мгновенной работу


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 10, 2009, 15:22
Не совсем понимаю, что мне оттуда может помочь? Там же элементы добавляются во время скрола?


Название: Re: Оптимизировать код...
Отправлено: Авварон от Ноябрь 10, 2009, 15:38
да, я тоже глянул, там надо модель переделывать... Работы минут на 10, отнаследовавшись от QStringListModel. В том-то и вся фича, что грузить не все, а частями (к примеру Ворд так делает). Заставь лучше того чела сделать аналогично и посмотрите у кого больше кода выйдет


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 10, 2009, 15:41
Нашел хорошее решение :)
Код:
QStringList str;
    uint sum=0;
    char x[100];
    for(int i=0;i<=150000;++i)  {
        sum+=i;
        sprintf(x,"Number: %i Sum: %i",i,sum);
        str.append(x);
    }
    model->setStringList(str);
    lv->setModel(model);
450мс работа программы :) было 800 с QString..


Название: Re: Оптимизировать код...
Отправлено: Авварон от Ноябрь 10, 2009, 15:45
а шарп сколько?


Название: Re: Оптимизировать код...
Отправлено: kibsoft от Ноябрь 10, 2009, 15:48
Незнаю точно, просто я у себя в Process Explorer мерял, а у друга прога сама выводит мс, вывела 500, но я чето не очень верю этим цифрам, как его увижу сравним, отпишусь :)
P.S. Если еще есть какие-нибудь идеи насчет оптимизации, пишите :)