Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Ну Очеень медленное удаление элементо QVector


Автор: AndAnd 5.5.2008, 09:17
проблема в следующем.
Очень долго удаляются элементы списка, но нужно работать именно с QString...
как быть?

Код

//...................
#include <QVector>
#include <QString>
#include <QTime>

//...................

QVector<QString> vect;
QTime time;
QString vr;

//засекаем время на создание списка элементов
vr = time.currentTime().toString("mm:ss.zzz");
qDebug() << str;
for(int i=0;i<200000;i++)
     vect.append("строка");
vr = time.currentTime().toString("mm:ss.zzz");
qDebug() << str;
//теперь очищаем vect и смотрим на время :)
vect.clear();
vr = time.currentTime().toString("mm:ss.zzz");
qDebug() << str;

//...................



Автор: archimed7592 5.5.2008, 09:37
Ну для начала: маленький lifehack:
Код

QString str = QLatin1String("строка");
// ...
for(...)
    vect.append(str); // добавление будет многим быстрее за счёт того, что каждый раз не будет копироваться строка.


Далее. Почему ты решил, что медленное именно удаление? Ты же замеряешь время не только удаления, но и добавления...
Далее. Сама по себе очистка вектора - операция со сложностью O(N * O(~T())), т.е. если деструктор имеет сложность O(1), то сложность становится O(N) - это достаточно быстро(быстрее просто не возможно - объекты в любом случае уничтожать придётся).
А что касается удаления поэлементо(по одному за раз) - у этой операции сложность тоже O(N) потому что вектор гарантирует data contiguity, т.е. если ты удалешь элемент из начала вектора, ему придётся переместить все N-1 элементов "влево".
Если нужно быстрое поэлементное удаление, то используй именно список(как ты обозвал вектор в своём сообщении smile), т.е. QList(или QDeque).

Автор: AndAnd 5.5.2008, 10:05
может так понятней будет

Код


uint RowCount = 180000;
     QList<QString> list;

     QTime t;
     t.start();
     for (int i=0; i<RowCount; i++)
          list.append(QString("asdf"));
     qDebug("create finished %d ms", t.elapsed());  // QList ~390ms
                                                                         // QVector ~375ms



     t.restart();
     list.clear();
     qDebug("clear finished %d ms", t.elapsed());  // QList ~21500ms
                                                                      // QVector ~21000ms

Почему удаляется в 53 раза медленнее чем создаётся?  вот это не понятно...
и как можно ускорить процесс удаления...

Автор: just_geek 5.5.2008, 10:29
AndAnd, странные результаты, этот же кусок кода у меня выполняется

Цитата

create finished 47 ms
clear finished 31 ms


з.ы. Qt и проект скомпилен на VC++ 2008 EE, ну и проц Core2Duo 2.33 FSB 1333

Автор: archimed7592 5.5.2008, 10:32
AndAnd, не беспокойся, в релизе всё ок.
Код

//    RowCount = 18000000
//    QVector/QString("asdf")
//    create finished 5079 ms
//    clear finished 3895 ms
//    QVector/el
//    create finished 844 ms
//    clear finished 310 ms
//    QList/QString("asdf")
//    create finished 5740 ms
//    clear finished 3928 ms
//    QList/el
//    create finished 1522 ms
//    clear finished 374 ms

Автор: AndAnd 5.5.2008, 10:54
to archimed7592, вроде ты прав... спасибо smile
В общем, если запускать из Visual под отладчиком получаются тормоза, а если скомпилированный *.exe то мгновенно...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)