Показать сообщение отдельно
Старый 16.12.2014, 09:03   #3
Жека
Дэвелопер
 
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений
(для 886 пользователей)
Ответ: Смесь: Неочевидное + Оптимизация

Улучшение поиска смайлов в тексте. Завершил.

Фишки новой функции:
* предварительный поиск смайловых символов (даёт ускорение только если в тексте нет смайлов)
* поиск сразу всех смайлов, сортировка по позиции смайла в тексте делается сразу

Т.к. текстовые варианты некоторых смайлов являются подстрокой других, например "0 : )" или "{ : )" включают в себя ": )", то пришлось делать проверку - не попадает ли очередной найденный смайл в позицию уже найденных.
Проверка - это цикл по найденным смайлам. Раз уж никуда не деться от этого цикла, то в нём делаю проверку соотнесения позиции текущего найденного смайла с найденными ранее, тем самым определяю позицию для вставки, т.е. не нужно потом сортировать все смайлы по позиции.

Зачем нужна сортировка? Чтобы можно было указывать лимит смайлов, свыше которого всё считается обычным текстом.

Победа:
* время поиска сократилось в 2 раза
* объём потребляемой памяти сократился в 3 раза

Конечно, в реальности цифры могут быть чуть больше и чуть меньше, но в целом ожидаю именно такой прогресс.

Тестирование:
Для теста взял некий текст (под спойлером) длиной 639 символов, содержащий в середине 4 смайла.

"Женщины - как яблоки . Самые вкусные висят на самой макушке дерева. Многие Мужчины не хотят лезть на дерево за вкусными яблоками, потому что они боятся упасть и удариться. Вместо этого они собирают упавшие яблоки с земли, которые не так хороши, но зато доступны. Поэтому яблоки на макушке думают, что с ними, что-то не так, хотя на самом деле - ОНИ ВЕЛИКОЛЕПНЫ! Женщины - как яблоки :-.. Самые вкусные висят на самой макушке дерева. Им просто нужно дождаться того человека, который не побоится залезть на макушку дерева. Отправь это сообщение Женщинам, которых ты ЛЮБИШЬ! Милая, красивая, нежная! ЛЮБИ И БУДЬ ЛЮБИМА! Счастья тебе! "

Поиск производился в цикле, 500 итераций.

Результаты теста:

* новая функция, тест №1:
использовано памяти перед тестом: 943 кб
время выполнения: 1836 мс
память после теста: 1254 кб

* старая функция, тест №2:
использовано памяти перед тестом: 943 кб
время выполнения: 4361 мс
память после теста: 1896 кб

Я результатом доволен, опасался что новый вариант будет жрать памяти больше старого.

Спасибо за внимание!
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Жека за это полезное сообщение:
Nex (16.12.2014), St_AnGer (16.12.2014)