crossplatform.ru

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

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


Студент
*

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

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




Репутация:   0  


нужно преобразовать информацию из двоичного вида в текстовое представление.
пробовал:
преобразовывать информацию по кусочкам, и выводить в QTextEdit - результата не дождался ...
преобразовывать информацию в Qstring а по окончании выводить в QTextEdit append(string) - 50 сек
вначале преобразуется в Qstring и добавляем в QtextStream, после заполнения обратно преобразуем к QString и выводим append(stream.readAll()) - 45 сек

аналогичная задача на C++ Builder 2007 и RichEdit выполняется за 2 сек, используя TMemoryStream.

возможно ли ускорить процесс, или норвежская медлительность не позволяет этого сделать ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.12.2009, 9:30
Сообщение #2


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

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

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




Репутация:   34  


Код и двоичную информацию в студию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
&-rey
  опции профиля:
сообщение 12.12.2009, 11:12
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(SABROG @ 12.12.2009, 10:30) *
Код и двоичную информацию в студию.


    QFile *file = new QFile(filename);
    if (!file->open(QIODevice::ReadOnly)) return;
    unsigned long Length = file->size();
    char *ptr = (char*)file->map(0, Length, QFile::NoOptions);
    if (QFileInfo(filename).suffix().toLower() == "bin")
    {
        QTextStream Stream(new QString);
        for (unsigned long i = 0; i < Length; i++)
        {
            if (!(i&0x0F)) Stream << "\n"; // каждая строка по 16 символов
            if (!(i%16)) Stream << QString::number(i/16, 16).toUpper().rightJustified(5,'0'); // номер строки в Hex
            Stream << " " << QString::number((quint8)*ptr++, 16).toUpper().rightJustified(2,'0'); // значение байта в Hex
        }
        edit->append(Stream.readAll() + "\n"); // вывод в QTextEdit
    }
    delete file;

Прикрепленные файлы
Прикрепленный файл  test.rar.txt ( 669,67 килобайт ) Кол-во скачиваний: 137
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
&-rey
  опции профиля:
сообщение 12.12.2009, 13:26
Сообщение #4


Студент
*

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

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




Репутация:   0  


скачал версию 4.6.0
тот же код выполняется за 2.5 минуты, нет слов ... :blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.12.2009, 13:59
Сообщение #5


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

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

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




Репутация:   34  


С QPlainTextEdit всё работает за 10 секунд на моей машине. С QTextEdit около 50 секунд. Сам файл парсится 4 секунды. Количество строк 131072, общее количество символов, которое помещается в textedit - 7077888, прибавим уникодность и получим где-то 6,75*2=13,5Мб

Добавление текста делал через QPlainTextEdit::appendPlainText().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
&-rey
  опции профиля:
сообщение 12.12.2009, 14:20
Сообщение #6


Студент
*

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

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




Репутация:   0  


Цитата(SABROG @ 12.12.2009, 14:59) *
С QPlainTextEdit всё работает за 10 секунд на моей машине. С QTextEdit около 50 секунд. Сам файл парсится 4 секунды. Количество строк 131072, общее количество символов, которое помещается в textedit - 7077888, прибавим уникодность и получим где-то 6,75*2=13,5Мб

Добавление текста делал через QPlainTextEdit::appendPlainText().


На моей это 22 сек, т.е. на половину быстрее, но мне нужны фичи TextEdit, а insertPlainText быстродействия не добавляет.
Похоже тормозит собственно QString но другой возможности добавить текст не предусмотрено.
Cтранно то, что с новой версией все еще хуже.

PS: ... как они собираються его на мобилах то использовать, там то процы поменее будут ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 12.12.2009, 14:25
Сообщение #7


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

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

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




Репутация:   94  


Цитата(&-rey @ 12.12.2009, 17:20) *
как они собираються его на мобилах то использовать, там то процы поменее будут
напиши пару примеров, в которых на мобиле необходимо бинари в TextEdit совать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.12.2009, 14:26
Сообщение #8


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

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

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




Репутация:   34  


Я склоняюсь к тому, что тормозит QTextDocument, а не QString.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 12.12.2009, 14:47
Сообщение #9


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

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

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




Репутация:   44  


Попробуй вместо
QTextStream Stream(new QString);

использовать
    QByteArray outBuf;
    outBuf.reserve( Length * 4 );
    QTextStream Stream( &outBuf, QIODevice::WriteOnly );


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

Да тут скорее вопрос в том, для чего все делать так как делает автор.
А если бинарный файл будет не 1Мб, а 100 или 1Гб? Будет читать весь файл, парсить и втыкать в редактор?
Думаю при таком подходе, пользователи будут отказываться от использования такой программы еще до того как большой файл будет загружен в редактор....

Какой то дельфийский подход, очень удобно написать десять строк кода и получить результат, а потом удивляться почему медленно и требовать от разработчиков инструмента сделать быстро.

2 &-rey
Читай кусок файла, который помещается на экран. Понимаю, что просто использовать QTextExit не получиться, зато твой виджет будет оптимизирован для твоей задачи.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 12.12.2009, 14:50
Сообщение #10


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

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

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




Репутация:   34  


Цитата(BRE @ 12.12.2009, 14:26) *
Попробуй вместо
QTextStream Stream(new QString);

использовать
    QByteArray outBuf;
    outBuf.reserve( Length * 4 );
    QTextStream Stream( &outBuf, QIODevice::WriteOnly );


А зачем флаг QIODevice::WriteOnly? Он же потом из потока читать будет.

У меня с таким кодом не добавляет в textEdit вообще ничего несмотря на то, что размер QByteArray - 7062366.

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

В релизной сборке весь текст добавляется 1 секунду в QPlainTextEdit.

Сообщение отредактировал SABROG - 12.12.2009, 14:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 27.12.2024, 7:31