Когда дело доходит до повышения производительности, вы хотите убедиться, что то, что вы намерены улучшить, на самом деле является причиной узкого места. Я бы начал с профилирования производительности различных частей в моем коде и определения того, какая часть представляет наибольшее узкое место.
На первый взгляд, я вижу три основные составляющие этого процесса, которые стоит профилирование:
- Перебор всего содержимого файла (это может быть или может не включать в файл ввода-вывода соображения, которые вы, возможно, пожелают для проверки отдельно).
- Отметьте
String.Contains()
для каждой строки в файле.
- «Do Stuff», когда есть матч
Хотя есть большие коммерческие профайлеры там, вы можете начать с помощью простого таймера (например System.Diagnostics.Stopwatch
) в вашем коде, или, если этот процесс действительно долго, просто используйте часы для измерения времени.
Измерьте время каждого из следующих действий.
- Измерьте время, затраченное на простое просмотрение всего файла без каких-либо действий. Это изолирует ваш цикл и код ввода-вывода, чтобы вы могли видеть, насколько хорошо он работает.
- Затем добавьте только сравнение строк (
String.Contains
) и измерьте общее время, затрачиваемое на это добавление.
- Наконец, добавьте код «do stuff» и измерьте общее время с добавлением.
Теперь вы можете сравнить затраты на добавление в каждом компоненте, чтобы выяснить, насколько дорог этот компонент и нужно ли его улучшить или нет. Например, предположим, что вы записали следующее время:
Test Total Time Cost (Difference)
=============================================
Do Nothing 0s 0s
Loop Only 100s 100s
Add Comparison 105s 5s
Add Do Stuff 130s 25s
Глядя на эти (фальшивые) чисел, самая дорогая часть процесса является цикл и IO-код, так что там я бы начать, чтобы попытаться увеличить представление. Поскольку часть «Do Stuff» добавила 25 секунд к общему времени выполнения, я бы взглянул на этот код, чтобы увидеть, есть ли что-нибудь, что я мог бы улучшить. Наконец, я бы посмотрел на сравнение строк.
Конечно, измерения времени, которые я предоставил, являются фиктивными, но вы можете применить те же шаги к профилированию производительности в своем приложении. Ключ должен определить наибольшие затраты и попытаться уменьшить их первый.
Я думаю, вам лучше всего отыскать ответ для себя: http://www.red-gate.com/products/reflector/ –
Вы видели: http://stackoverflow.com/questions/498686/ net-is-string-contains-faster-than-string-indexof/498722 # 498722 –
Проделали ли вы профилирование, чтобы убедиться, что 'line.Contains' действительно является узким местом в вашем цикле? – Heinzi