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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Можно ли ускорить фунции работы с текстом?  (Прочитано 3660 раз)
gidrowolf
Гость
« : Ноябрь 04, 2010, 18:54 »

Нужно скопировать юникодовый текст в массив слов, выполнить преобразование и вернуть преобразованный текст.
Само преобразование 100кб текста если верить замерам происходит менее чем за 1 мс. В то время как сохранение текста в массив слов занимает 75 секунд!, а загрузка почти целых 6 секунд =(. На процессоре с 2.5 ГГц это непростительно.
Код:
75250 for(i=0;i<n;i++){text[i] = ui->PlainTextEdit->toPlainText().utf16()[i];} 
5813 ui->PlainTextEdit->setPlainText(QString::fromUtf16(text,n));
Записан
BlackTass
Гость
« Ответ #1 : Ноябрь 04, 2010, 19:36 »

мне почему то кажется, что не стоит ui->PlainTextEdit->toPlainText().utf16() выполнять в цикле
Записан
gidrowolf
Гость
« Ответ #2 : Ноябрь 04, 2010, 19:50 »

мне почему то кажется, что не стоит ui->PlainTextEdit->toPlainText().utf16() выполнять в цикле
А как по другому можно скопировать юникодовые значения в массив слов?
Записан
Denjs
Гость
« Ответ #3 : Ноябрь 04, 2010, 20:02 »

мне почему то кажется, что не стоит ui->PlainTextEdit->toPlainText().utf16() выполнять в цикле
А как по другому можно скопировать юникодовые значения в массив слов?
BlackTass говорит о том, что бы сначала получить в какую-либо переменную ссылку
Код:
const ushort *rezutf16 = ui->PlainTextEdit->toPlainText().utf16() 
а потом обращаться к ней в цикле.
Код:
for(i=0;i<n;i++){text[i] = rezutf16[i];} 

Но, признаться я вообще не понимаю смысла этого присвоения . text - это чО за переменная. нафига она вам? какого типа?
QByteArray для чего создан?  если text это char* то почему нельзя сделать так :
Код:
QByteArray myQByteArrayData= ui->PlainTextEdit->toPlainText().toUtf8();// toAscii(), toLatin1(), toLocal8Bit(), see alse QTextCodec.
text = myQByteArrayData.data();
Записан
BRE
Гость
« Ответ #4 : Ноябрь 04, 2010, 20:12 »

сначала получить в какую-либо переменную ссылку
Код:
const ushort *rezutf16 = ui->PlainTextEdit->toPlainText().utf16() 
а потом обращаться к ней в цикле.
Код:
for(i=0;i<n;i++){text[i] = rezutf16[i];} 
Так делать нельзя.
Указатель rezutf16 будет указывать на уже разрушенный буфер.
Записан
gidrowolf
Гость
« Ответ #5 : Ноябрь 04, 2010, 20:12 »

Как посоветовал BlackTass копирую не напрямую а через временную QString, в результате копирование в массив слов с 75 секунд сократилось до <1мс О_О. А обратно с 6 секунд до 1.5 секунды.
Может можно присвоить текст помимо функции setPlainText? А то она тормознутая какая-то.
Код:
    QString tmp;
    int i,n;
    unsigned short *text;
    n = ui->PlainTextEdit->toPlainText().length();
    text = new unsigned short[n];
    tmp = ui->PlainTextEdit->toPlainText();
    for(i=0;i<n;i++)
    {
        text[i] = tmp.utf16()[i];
    }
    tmp.fromUtf16(text,n);
    ui->PlainTextEdit->setPlainText(tmp);
    delete text;
Записан
Denjs
Гость
« Ответ #6 : Ноябрь 04, 2010, 20:24 »

Так делать нельзя.
Указатель rezutf16 будет указывать на уже разрушенный буфер.
гм... похоже что да... ну тогда так :
Код:
QString str=ui->PlainTextEdit->toPlainText();
const ushort *rezutf16 = str.utf16();
« Последнее редактирование: Ноябрь 04, 2010, 20:25 от Denjs » Записан
gidrowolf
Гость
« Ответ #7 : Ноябрь 04, 2010, 20:56 »

Заменил
Код:
ui->PlainTextEdit->setPlainText(tmp);
на
Код:
ui->PlainTextEdit->clear();
ui->PlainTextEdit->appendPlainText(tmp);
В результате стало выполняться в 2 раза быстрее о_О. Что то как то странно это. Добавление текста работает в 2 раза быстрее чем замена, должно ведь наоборот. Должен же быть способ сократить время до 1мс.

tmp.fromUtf16(text,n);
Ошибочка, надо Улыбающийся:
tmp = QString::fromUtf16(text,n);
« Последнее редактирование: Ноябрь 04, 2010, 22:30 от gidrowolf » Записан
kostya2vntu
Гость
« Ответ #8 : Ноябрь 07, 2010, 00:12 »

Так делать нельзя.
Указатель rezutf16 будет указывать на уже разрушенный буфер.
гм... похоже что да... ну тогда так :
Код:
QString str=ui->PlainTextEdit->toPlainText();
const ushort *rezutf16 = str.utf16();
Так тоже нельзя, метод utf16() возвращает все тот же буфер.
Вообще-то оператор [] класса QString возвращает QChar, который уже и есть юникод.
Записан
gidrowolf
Гость
« Ответ #9 : Ноябрь 07, 2010, 01:26 »

Так делать нельзя.
Указатель rezutf16 будет указывать на уже разрушенный буфер.
гм... похоже что да... ну тогда так :
Код:
QString str=ui->PlainTextEdit->toPlainText();
const ushort *rezutf16 = str.utf16();
Так тоже нельзя, метод utf16() возвращает все тот же буфер.
Вообще-то оператор [] класса QString возвращает QChar, который уже и есть юникод.
Да как я выше привел код теперь работает очень быстро(каждая строчка менее чем за 1мс), осталась только одна загвоздка с ui->PlainTextEdit->setPlainText(tmp); на это при 100кб тексте уходит примерно 750мс. Вот еслиб найти другой быстрый способ загрузки текста =(.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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