crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> QTextEdit, тормозит
BRE
  опции профиля:
сообщение 12.12.2009, 14:55
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(SABROG @ 12.12.2009, 14:50) *
А зачем флаг QIODevice::WriteOnly? Он же потом из потока читать будет.

А зачем из него читать, все данные в QByteArray.

Цитата(SABROG @ 12.12.2009, 14:50) *
Да и скорость потока это не главная проблема тормозов. Время парсинга у меня занимает точно такое же как и с QString - 5062мс (debug), 3313мс (release).

Это уменьшает количество реалокаций памяти и уменьшает дефрагментацию кучи. Ну и небольшое ускорение дает, за счет уменьшения копирования буфера строки после реалокаци.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.12.2009, 15:18
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(BRE @ 12.12.2009, 14:55) *
А зачем из него читать, все данные в QByteArray.


Ладно, а зачем ты тогда в свой код вставил вообще QTextStream :blink: ?

Тем не менее твое предложение наоборот дало тормоза, парсинг файла стал выполняться на 1 секунду дольше:

#include <QtGui/QApplication>
#if 0
#include <QtGui/QPlainTextEdit>
typedef QPlainTextEdit TextEdit;
#else
#include <QtGui/QTextEdit>
typedef QTextEdit TextEdit;
#endif

#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtCore/QTime>

#include <QtCore/QFile>
#include <QtCore/QFileInfo>
#include <QtCore/QTextStream>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    TextEdit textEdit;
    textEdit.setWordWrapMode(QTextOption::NoWrap);
    textEdit.setUndoRedoEnabled(false);
    QString filename("../test.bin");
    QFile file(filename);
    if (!file.open(QIODevice::ReadOnly)) return 1;
    qint64 length = file.size();
    quint8 *ptr = (quint8 *)file.map(0, length);

    if (QFileInfo(filename).suffix().endsWith("bin", Qt::CaseInsensitive)) {
        QByteArray buffer;
        buffer.reserve(length * 4);
        int counter = 0;
        QTime t;
        t.start();
        for (qint64 i = 0; i < length; ++i) {
            if (!(i&0x0F)) {
                buffer.append("\n");
                counter++;
            }
            if (!(i%16)) {
                buffer.append(QString::number(i/16, 16).toUpper().rightJustified(5,'0')); // номер строки в Hex
            }
            buffer.append(" " + QString::number(*ptr++, 16).toUpper().rightJustified(2,'0')); // значение байта в Hex
        }
        qDebug("Count of lines: %d, elapsed: %d", counter, t.elapsed());
        t.start();
        textEdit.textCursor().beginEditBlock();
        textEdit.textCursor().insertText(buffer);
        textEdit.textCursor().endEditBlock();
        qDebug("Strings appended. Elapsed: %d", t.elapsed());
    }
    file.close();

    textEdit.show();
    return app.exec();
}


Хочу обратить внимание на этот кусок кода:
        qDebug("Strings appended. Elapsed: %d", t.elapsed());
    }
    file.close();

    textEdit.show();


Добавление в textEdit происходит 1 секунду, а вот после textEdit.show() начинается всё веселье.

Сообщение отредактировал SABROG - 12.12.2009, 15:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.12.2009, 16:20
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Программа в помощь, и тамже можно почитать всю тему - Чем большой текст показать?

и цитаты от тель:
Цитата
Я пробовал QTextStream но на гигабайтах он работает гнусно медленно. Прямое чтение в несколько раз быстрее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 12.12.2009, 17:42
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(SABROG @ 12.12.2009, 15:18) *
Ладно, а зачем ты тогда в свой код вставил вообще QTextStream :blink: ?

Тем не менее твое предложение наоборот дало тормоза, парсинг файла стал выполняться на 1 секунду дольше:

Я QTextStream использую потому что с ним работает быстрее, за счет дополнительной буферизации в QTextStream. Т.е. реально в QByteArray добавляется сразу готовая строка.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
&-rey
  опции профиля:
сообщение 12.12.2009, 22:28
Сообщение #15


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 12.11.2009
Пользователь №: 1225

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 12.12.2009, 14:25) *
напиши пару примеров, в которых на мобиле необходимо бинари в TextEdit совать

если выведенное скопировать в текстовый файл то его вставка даст 22 сек.

        QTextStream Stream(file);
        edit->setPlainText(Stream.readAll() + "\n");

т.е. если я захотел почитать к примеру "Война и Мир", то нужно будет подождать ...
вопрос ведь не в том как обойтись, а в том почему приходится это делать ?
вот к примеру вызов Copy из контекстного меню вставленного куска текста зависает на 22 сек, а это уже не преобразование текста а обработка существующего.
Цитата
Какой то дельфийский подход, очень удобно написать десять строк кода и получить результат, а потом удивляться почему медленно и требовать от разработчиков инструмента сделать быстро.

удивляться приходиться как раз не в делфи, хотя речь шла о С++ Builder
        TMemoryStream *Stream = new(TMemoryStream);
                         ........
        SendMessage(edit->Handle, EM_REPLACESEL, 0, (long)Stream->Memory);

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

и будут правы :)
Цитата
Читай кусок файла, который помещается на экран. Понимаю, что просто использовать QTextExit не получиться, зато твой виджет будет оптимизирован для твоей задачи.

это примерно то же самое что массаж деревянной ноги, такие мысли были, но пока я их гоню от себя, надеясь на лучшее.
да и подобные мысли были у человека ссылку на тему которого дал Litkevich Yuriy и как следует из прочтения не все так просто.
А опыта у меня в програмировании мало, так что пока отложим.
Цитата( @ 12.12.2009, 17:20) *
Программа в помощь, и тамже можно почитать всю тему - Чем большой текст показать?
и цитаты от тель:
Цитата
Я пробовал QTextStream но на гигабайтах он работает гнусно медленно. Прямое чтение в несколько раз быстрее.


это читал, но не очень понял что имелось ввиду под прямым чтением. Ссылки то ведут на редактор в delphi (какая гадость), но дело в том что в Builder то как раз проблем нет.
или есть возможность совместить QT и RichEdit ? а как ?

Цитата(SABROG @ 12.12.2009, 15:50) *
Да и скорость потока это не главная проблема тормозов. Время парсинга у меня занимает точно такое же как и с QString - 5062мс (debug), 3313мс (release).
В релизной сборке весь текст добавляется 1 секунду в QPlainTextEdit.

вот если верить Qtime
Count of lines: 131072, elapsed: 10641
Strings appended. Elapsed: 21922
но реально получается на 15 сек больше, видимо доп затраты на отображение.

Есть ли смысл написать в support ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.12.2009, 23:04
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(&-rey @ 12.12.2009, 22:28) *
Есть ли смысл написать в support ?


Судя по тому, что я сегодня читал эта проблема была еще известна в 2005 году и даже в Qt3. Плюс в багтрекере уже есть подобные репорты. Но лучше написать еще раз, напомнить им о проблеме. Кстати это касается также и QTableWidget/QListWidget/QTreeWidget (*View классов тоже). И та же проблема с QPixmap, QImage (очень большую картинку хрен загрузишь, карту например). Т.е. в Qt мало чего сделали для того, чтобы интерфейс мог работать с большими объемами данных. С обычными контейнерами (QVector, QList) та же история, свои аллокаторы пишут к stl контейнерам.

SendMessage(edit->Handle, EM_REPLACESEL, 0, (long)Stream->Memory);


Это вроде как вообще к борману мало относится, тут же чистый WinAPI.

Сообщение отредактировал SABROG - 12.12.2009, 23:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.12.2009, 4:42
Сообщение #17


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(&-rey @ 13.12.2009, 1:28) *
удивляться приходиться как раз не в делфи, хотя речь шла о С++ Builder
Дельфи первичен, Билдер - вторичен. Билдер - тот же Делфи только с Си/Си++ компилятором и автоматически сгенерёными заголовочниками из исходников дельфей, все библиотеки в нём - это продук Дельфей.

Цитата(SABROG @ 13.12.2009, 2:04) *
Но лучше написать еще раз,
в нынешнем трекере, есть возможность коментировать имеющийся рапорт, и это предпочтительный путь, вместо создания нового рапорта. Т.е. Весомость рапорта растёт.

По теме, в Qt не реализован для текстового редактора подход Модель/представление, и ожидать от QTextEdit прыти не приходится также, как и от Q{List|Table|Tree}Widget
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
&-rey
  опции профиля:
сообщение 13.12.2009, 19:40
Сообщение #18


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 12.11.2009
Пользователь №: 1225

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 13.12.2009, 5:42) *
Дельфи первичен, Билдер - вторичен. Билдер - тот же Делфи только с Си/Си++ компилятором и автоматически сгенерёными заголовочниками из исходников дельфей, все библиотеки в нём - это продук Дельфей.

это понятно, просто само слово делфи мне не нравиться. А так частенько пытаясь разобрать методы класса упирался в Pascal, причем не в код, а просто паскал класс и все тут.
Цитата(SABROG @ 13.12.2009, 2:04) *
Но лучше написать еще раз,в нынешнем трекере, есть возможность коментировать имеющийся рапорт, и это предпочтительный путь, вместо создания нового рапорта. Т.е. Весомость рапорта растёт.

так и сделал, присоседился к http://bugreports.qt.nokia.com/browse/QTBUG-3554
выложив видоизмененный SABROG код, уж очень он хорошо тормозит на шоу.
Цитата
Т.е. в Qt мало чего сделали для того, чтобы интерфейс мог работать с большими объемами данных. С обычными контейнерами (QVector, QList) та же история, свои аллокаторы пишут к stl контейнерам.

Цитата
По теме, в Qt не реализован для текстового редактора подход Модель/представление, и ожидать от QTextEdit прыти не приходится также, как и от Q{List|Table|Tree}Widget

Грустно, наверное у QT есть очень даже хорошие вещи, но хорошее как правило не помнится, а запоминаются лишь баги и проблемы.
Cпасибо, что не оставили без внимания, буду верить что QTextEdit растормозиться в следующих релизах.

PS: пошел читать про Модель/представление :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V  < 1 2
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.12.2024, 0:52