Russian Qt Forum

Qt => Общие вопросы => Тема начата: gidrowolf от Ноябрь 04, 2010, 18:54



Название: Можно ли ускорить фунции работы с текстом?
Отправлено: 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));


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: BlackTass от Ноябрь 04, 2010, 19:36
мне почему то кажется, что не стоит ui->PlainTextEdit->toPlainText().utf16() выполнять в цикле


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: gidrowolf от Ноябрь 04, 2010, 19:50
мне почему то кажется, что не стоит ui->PlainTextEdit->toPlainText().utf16() выполнять в цикле
А как по другому можно скопировать юникодовые значения в массив слов?


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: Denjs от Ноябрь 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();


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


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: gidrowolf от Ноябрь 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;


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: Denjs от Ноябрь 04, 2010, 20:24
Так делать нельзя.
Указатель rezutf16 будет указывать на уже разрушенный буфер.
гм... похоже что да... ну тогда так :
Код:
QString str=ui->PlainTextEdit->toPlainText();
const ushort *rezutf16 = str.utf16();


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: gidrowolf от Ноябрь 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);


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: kostya2vntu от Ноябрь 07, 2010, 00:12
Так делать нельзя.
Указатель rezutf16 будет указывать на уже разрушенный буфер.
гм... похоже что да... ну тогда так :
Код:
QString str=ui->PlainTextEdit->toPlainText();
const ushort *rezutf16 = str.utf16();
Так тоже нельзя, метод utf16() возвращает все тот же буфер.
Вообще-то оператор [] класса QString возвращает QChar, который уже и есть юникод.


Название: Re: Можно ли ускорить фунции работы с текстом?
Отправлено: gidrowolf от Ноябрь 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мс. Вот еслиб найти другой быстрый способ загрузки текста =(.