В настоящее время я работаю над проектом выделения синтаксиса и завершения кода, а также над созданием пользовательского управления на основе RichTextBox. У меня были некоторые проблемы с адаптацией к тому, как работает RTB, и тому подобное, но мне удалось сделать простую подсветку синтаксиса.
Простой означает, что я выделяю весь текст каждый раз, когда пользователь вводит символ. Он не должен быть быстрым или что-то в этом роде, но он слишком медленный. Проблемы с производительностью становятся видимыми, когда у меня есть около 500 символов текста, и я делаю только один проход по тексту для каждого набранного символа (функция 'colorInterval' вызывается примерно 100 раз за один проход).
Анализ производительности показывает, что проблема заключается в конструкторе TextRange, который занимает около 80% + времени, и я использую его каждый раз, когда мне нужно раскрасить интервал текста:
private void colorInterval(TextPointer start, TextPointer end)
{
TextRange range = new TextRange(start, end);
if(isFunction(range.Text)) colorAsFunction(range);
if(isInQuotes(range.Text)) colorAsQuoted(range);
...
}
Итак, вот мой вопрос:
Я что-то делаю неправильно, делая все таким образом, или есть способ повысить производительность TextRange, переработать объект «диапазон» или что-то в этом роде? Какие еще есть решения.
TextRange
s ctor занимает столько времени (внутренне это очень мягко), я подозреваю, что вашcolorInterval
метод вызывается довольно часто! - person user7116   schedule 25.07.2012colorInterval
- и построение занимает 80% + времени, это должно быть - без конструктора - 0,2 секунды, что является временем, когда я можно было смириться. Так я не могу. Я хотел попробовать сделатьSpan
вместоTextRange
, но он не строится из-за какой-то глупой ошибки и все вылетает ... - person Dejan Maksimovic   schedule 25.07.2012