При построении выражений LINQ (для меня linq to objects) есть много способов сделать что-то, некоторые намного, намного лучше и эффективнее, чем другие.
- Есть ли хороший способ "настроить" или оптимизировать эти выражения?
- Какие фундаментальные метрики используют люди и как вы их собираете?
- Есть ли способ подсчитать "общее число итераций" или другую метрику, где вы могли бы "узнать", что чем ниже, тем лучше?
EDIT
Спасибо, Ричард / Джон, за ваши ответы.
Мне кажется, что я действительно хочу получить способ подсчета операций "OCount" для выражения LINQ, хотя я не уверен, что в LINQ существуют зацепки, позволяющие это сделать. Предположим, что у меня есть целевой уровень производительности для конкретного оборудования (SLA). В идеале я хотел бы добавить модульный тест, чтобы подтвердить, что типичные данные, перемещаемые по этому запросу, будут обрабатываться в течение указанного времени (из SLA). Проблема в том, что это будет выполнено на сервере сборки / машине разработчиков / и т.д. что, вероятно, имеет мало сходства с аппаратным обеспечением SLA. Таким образом, идея заключается в том, что я бы определил приемлемый максимальный «OCount» для выражения, зная, что если OCount меньше X, он, безусловно, обеспечит приемлемую производительность в соответствии с SLA на целевом «типичном» оборудовании. Если OCount превышает этот порог, сборка / модульный тест выдаст предупреждение. В идеале я хотел бы иметь что-то вроде этого (псевдокод-иш):
var results = [big linq expression run against test dataset];
Assert.IsLess(MAXALLOWABLE_OCOUNT, results.OCount)
, где results.OCount просто дал бы мне общее количество итераций (n), необходимое для получения набора результатов.
Зачем мне это нравится ??
Что ж, даже при выражении LINQ небольшого размера небольшое изменение / добавление может оказать ОГРОМНОЕ влияние на производительность вследствие увеличения общего количества операций. Код приложения будет по-прежнему проходить все модульные тесты, так как он все равно будет давать правильный результат, но при развертывании будет работать очень медленно.
Другая причина - простое обучение. Если вы что-то делаете и счет увеличивается на порядок, то вы чему-то учитесь.
РЕДАКТИРОВАТЬ # 2
Я также добавлю потенциальный ответ. Это не мое, оно взято из Кэмерона МакФарланда из другого вопроса, который я задал, который породил этот. Оказывается, я думаю, что ответ на этот вопрос мог бы работать здесь в среде модульного тестирования, подобной той, которую я описал в первом редактировании этого вопроса.
Суть его заключается в создании наборов тестовых данных в модульном тестовом приборе, который вы вводите в выражение LINQ, как описано в этом ответе, а затем суммируете счетчики итераций и сравниваете их с максимально допустимым числом итераций. 1034 *
См. ответ Кэмерон здесь