RichTextBox - ускорение форматирования в разы!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

RichTextBox - ускорение форматирования в разы!

Сообщение hCORe » 19.12.2004 (Вс) 20:00

Я написал довольно простой класс для форматирования текста в RichTextBox на API. Результат меня потряс: загрузка и операции с файлами ускорились где-то в сотню раз (по примерным прикидкам.)

Любые конструктивные предложения по улучшению алгоритма - приветствуются.

И еще: обязательно сообщайте конфигурацию компьютера и результаты тестов (НЕ забудьте зарегистрировать библиотеку FormatterClass.dll).


Вот мои:

Код: Выделить всё
[Информация]

Тестирование началось (19.12.2004 19:55:53)


Стандартные методики

Тест 1. Простейшая методика.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1141 мс.
Форматирование заняло 10156 мс

Тест 2. Простейшая методика, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1125 мс.
Форматирование заняло 10359 мс

Тест 3.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 985 мс.
Форматирование заняло 10422 мс


Методики с использованием классов форматирования

Тест 4. Используется класс.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 984 мс.
Форматирование заняло 16 мс

Тест 5. Используется класс, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 953 мс.
Форматирование заняло 15 мс

Тест 6. Используется класс. RichTextBox невидим.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 953 мс.
Форматирование заняло 0 мс

Тестирование завершилось (19.12.2004 19:56:31)
Моду создают модоки, а распространяют модозвоны.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 19.12.2004 (Вс) 20:13

Здорово! :thumleft:
[Информация]

Тестирование началось (19.12.2004 20:10:53)


Стандартные методики

Тест 1. Простейшая методика.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 884 мс.
Форматирование заняло 6203 мс

Тест 2. Простейшая методика, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 856 мс.
Форматирование заняло 5015 мс

Тест 3.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 823 мс.
Форматирование заняло 4744 мс


Методики с использованием классов форматирования

Тест 4. Используется класс.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 821 мс.
Форматирование заняло 63 мс

Тест 5. Используется класс, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 822 мс.
Форматирование заняло 0 мс

Тест 6. Используется класс. RichTextBox невидим.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 830 мс.
Форматирование заняло 0 мс

Тестирование завершилось (19.12.2004 20:11:20)
Отличная весчь! Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 19.12.2004 (Вс) 20:16

Спасибо :D
Моду создают модоки, а распространяют модозвоны.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 19.12.2004 (Вс) 20:18

А почему стандартное форматирование настолько медленное? :roll:

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 19.12.2004 (Вс) 20:45

Ну посмотри. Сначала VB трясёт ActiveX:
- Эй, ну ты там... Этот {...}
- А? Ась? Звали?
- IDispatch поддерживаешь?
- Чего? Какой Dispatch?
- Интерфейс, говорю, поддерживаешь?
- Угу.
- Есть параметр SelFontSize?
- Ну да. Чего надо-то?
- Тип какой?
- INT32!
- Чего за тип этакий? Long что ли?
- Ага.
- Присваиваю значение 10!
- Так и быть...

Дальше ActiveX трясёт сам себя на предмет hWnd. Находит. Запоминает в структуре все свойства.

Потом состоится диалог с Виндой:
- Эээ... Простите пожалуйста... Где тут можно задать свойства окна Rich Edit?
- Проходите налево, потом направо, вверх три этажа, потом вниз через окно, наверх на лифте...
- Хорошо. Вот сейчас передам структуру свойств...
- Какую такую структуру?
- CHARFORMAT
- Нет такого зверя!
- Как нет? Вчера была! Может быть, CHARFORMAT2?
- Ах да, конечно. По коридору направо.
- (говоря с почтальоном SendMessage) а вот этот параметр, пожалуйста, передайте как указатель...
- (почтальон, отвечая) приходите завтра, система в подвешенном состоянии. Хотя, впрочем, ладно, передам...

Дальше Rich Edit получает сообщение. Расшифровывает его. Прочитывает данные из структуры. Пытается корректно отрисовать тридцать строчек. На его "лице" - неподдельный ужас. Неужели надо отрисовывать ВСЁ ЗАНОВО? Через 5 секунд всё готово. Он возвращает данные Винде. Винда возвращает (через COM) информацию в объект RichTextBox. Тот передаёт ее в VB. VB долго думает над ней (ещё секунд восемь) и после этого отдаёт команду перерисовать элемент Rich Edit полностью :D
Моду создают модоки, а распространяют модозвоны.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.12.2004 (Вс) 21:18

Имхо это всё лирика, имеющая мало отношения к действительности...

А всем любителям API-вызовов рекоммендую хоть раз посмотреть на тот код, которым этот вызов производится в msvbvm. Подчас этот код больше, чем тот, ради которого происходит вызов...

ActiveX - достаточно эффективная технология. Но ей надо уметь пользоваться. Выводить мегабайт текста в RTB и потом форматировать его прямо там - не есть правильно использование RTB. Если текста мегабайт, стоит отформатировать его самому и потом всунуть в RTB уже отформатированным. А если его не мегабайт, а десять строчек - то полмиллисекунды выгоды всё равно никто не заметит.

Т.е. имхо как спротивный результат "мы переплюнули RTB!" - интересно, а как практически применимая техника - нет.
Изображение

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 19.12.2004 (Вс) 21:28

tyomitch писал(а):Имхо это всё лирика, имеющая мало отношения к действительности...

Это техника, которую я уже успешно использовал в своей программе - редакторе HTML. Стал летать более резво (субъективно.)

tyomitch писал(а):Подчас этот код больше, чем тот, ради которого происходит вызов...

Накладные затраты на создание объекта clsFormatter окупаются при открытии файлов размером более 1 Мб. Вот.

tyomitch писал(а):Если текста мегабайт, стоит отформатировать его самому и потом всунуть в RTB уже отформатированным.

Вспоминая скорость работы VB со строками, уж лучше такой вариант...
Моду создают модоки, а распространяют модозвоны.

SBJocker
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 124
Зарегистрирован: 19.01.2004 (Пн) 16:57

Сообщение SBJocker » 20.12.2004 (Пн) 0:53

Код: Выделить всё
[Информация]

Тестирование началось (20.12.2004 0:49:38)


Стандартные методики

Тест 1. Простейшая методика.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 890 мс.
Форматирование заняло 7094 мс

Тест 2. Простейшая методика, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 875 мс.
Форматирование заняло 7079 мс

Тест 3.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 875 мс.
Форматирование заняло 6937 мс


Методики с использованием классов форматирования

Тест 4. Используется класс.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 875 мс.
Форматирование заняло 93 мс

Тест 5. Используется класс, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 859 мс.
Форматирование заняло 16 мс

Тест 6. Используется класс. RichTextBox невидим.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 875 мс.
Форматирование заняло 16 мс

Тестирование завершилось (20.12.2004 0:50:05)


Огромнейшее спасибо автору! :!:
Как я запарился с этим RTB!!! :twisted:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.12.2004 (Пн) 5:51

tyomitch писал(а):А всем любителям API-вызовов рекоммендую хоть раз посмотреть на тот код, которым этот вызов производится в msvbvm. Подчас этот код больше, чем тот, ради которого происходит вызов...

Насколько я понимаю асм...
Там функция такая есть (DllCallFunction)... А при каждой попытке вызова API стоит заглушка такого содержания:
Код: Выделить всё
чё у нас там по фиксированному адресу ХХХХХХХХ? Ноль? Почему? Вызвать DllCallFunction для получения адреса функции, запомнить его туда и впредь использовать, а DllCallFunction более не дёргать...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.12.2004 (Пн) 7:05

Нет - там гораздо более мутная хрень с преобразованием всех параметров при каждом вызове.
Например, если передавать плохо выровненную структуру, то она будет копироваться и туда и обратно. Так же со строками.

Если ты понимаешь, что (в деталях) делает DllCallFunction - объясни мне, потому что я нет :-)
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.12.2004 (Пн) 8:48

tyomitch, а насчет RTB ты зря так пессимистически относишься :) Работа с ним через API действительно на порядок быстрее, чем через ActiveX.
Lasciate ogni speranza, voi ch'entrate.

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 20.12.2004 (Пн) 10:49

hCORe писал(а):Это техника, которую я уже успешно использовал в своей программе - редакторе HTML. Стал летать более резво (субъективно.)

(субъективно.) разумнее а редакторе HTML изпользовать редактор HTML а не RTF

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.12.2004 (Пн) 11:48

marvan, не согласен. Разумнее его использовать для preview. А для редактирования исходного кода разумно использовать обычный блокнот с моноширинным шрифтом и с синтаксической раскраской.
Lasciate ogni speranza, voi ch'entrate.

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 20.12.2004 (Пн) 12:39

Чудесно
Что же это за редактор HTML, если он собственный текст отредактировать не может и использует RTF. "Сапожник без сапог", "Назвался груздем, лечись дальше". Тем более тот редактор rtf, который там используется - глючный.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.12.2004 (Пн) 12:42

Обыкновенный редактор, который не использует принцип "что видете, то и получите". Таких редакторов довольно много. Посмотри, например, EditPlus - очень удобный редактор (и не только HTML), который использует RTB.
Lasciate ogni speranza, voi ch'entrate.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 20.12.2004 (Пн) 17:16

Ребята, не ссорьтесь... А отличный редактор HTML, использующий RTF, есть. Это моя программа. Вот какой я скромный :lol:
Моду создают модоки, а распространяют модозвоны.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 21.12.2004 (Вт) 0:21

Код: Выделить всё
[Информация]

Тестирование началось (21.12.2004 Вт 0:09:33)


Стандартные методики

Тест 1. Простейшая методика.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1469 мс.
Форматирование заняло 18281 мс

Тест 2. Простейшая методика, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1516 мс.
Форматирование заняло 18047 мс

Тест 3.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1515 мс.
Форматирование заняло 18203 мс


Методики с использованием классов форматирования

Тест 4. Используется класс.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1516 мс.
Форматирование заняло 125 мс

Тест 5. Используется класс, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1484 мс.
Форматирование заняло 0 мс

Тест 6. Используется класс. RichTextBox невидим.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1516 мс.
Форматирование заняло 0 мс

Тестирование завершилось (21.12.2004 Вт 0:10:38)


Конфигурация: Cel 1000, 512 mb, 32mb, в фоне: спайдер Dr.Web, Bat 3, nnCron и Winamp 3.

Кстати. Если при получении длины текста в RTB вместо
Код: Выделить всё
Len(rtfHTML.Text)

использовать
Код: Выделить всё
GetWindowTextLength(rtfHTML.hwnd)

Получается фактически двойной выигрыш во времени форматирования, даже при использовании стандартных методов форматирования. :)
Вот результаты подправленного проекта:
Код: Выделить всё
[Информация]

Тестирование началось (21.12.2004 Вт 0:25:36)


Стандартные методики

Тест 1. Простейшая методика.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1579 мс.
Форматирование заняло 9093 мс

Тест 2. Простейшая методика, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1578 мс.
Форматирование заняло 9016 мс

Тест 3.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1578 мс.
Форматирование заняло 9078 мс


Методики с использованием классов форматирования

Тест 4. Используется класс.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1579 мс.
Форматирование заняло 16 мс

Тест 5. Используется класс, плюс LockWindowUpdate.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1594 мс.
Форматирование заняло 0 мс

Тест 6. Используется класс. RichTextBox невидим.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1594 мс.
Форматирование заняло 15 мс

Тестирование завершилось (21.12.2004 Вт 0:26:14)


Вот так... :roll:
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 21.12.2004 (Вт) 11:02

Код: Выделить всё
Тест 6. Используется класс. RichTextBox невидим.
/* _ Стандартная загрузка файла _ */
Текстовый файл загружен за 1903 мс.
Форматирование заняло 40 мс

Тест 7. Используется HTML.
Форматирование форматирование и загрузка заняли 2313 мс

только радость моя была омрачена - 3МБ выводятся в WebBrowser в фоновом режиме. Т. е. смотреть можно сразу, но весь текст отобразится не скоро.
Но во первых исходников в 3 мб я не видел, и во вторых при более сложном форматировании с подсветкой синтаксиса и т.д. - расклад может быть иной.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 21.12.2004 (Вт) 20:23

marvan, решил делать редактор HTML на основе WebBrowser? Флаг тебе в руки :P О результатах сообщи, мне интересно :)
Моду создают модоки, а распространяют модозвоны.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 24.12.2004 (Пт) 20:03

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

1) Можно работать с выделенным текстом. Просто установите свойство WholeText в False и задайте необходимые значения SelStart и SelLength.
2) Появилась возможность изменения цвета текста и фона (свойства Color и BackColor). Причём последний можно задать и для отдельного фрагмента текста.
3) Можно вызвать метод QuickFormat (дабы задать каждую настройку отдельно), и это (возможно) будет несколько быстрее метода Execute, который задаёт все настройки сразу.\

Наслаждайтесь! 8)
Вложения
RichEditText2.rar
Новая версия тестов. Никаких принципиальных улучшений, просто используется более новая версия класса.
(156.06 Кб) Скачиваний: 153
FormatterClass2.rar
Новая версия класса форматирования. Добавлена работа с выделенным текстом, задание цвета текста и цвета фона (в т.ч. и выделенного)
(5.59 Кб) Скачиваний: 278
Моду создают модоки, а распространяют модозвоны.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 7

    TopList