Как ускорить этот код выбора Linq? - PullRequest
1 голос
/ 17 января 2012

У меня есть XML-файл с 3 частями данных на элемент: productName, productCode и productPrice. Количество элементов в файле XML составляет около 7000.

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

  1. токенизируйте текст поиска и соберите productName, который содержит ВСЕ слова поиска.

  2. упорядочить выбор по коду продукта

  3. выбрать для отображения только productName и productPrice (не productCode, который используется только для заказа)

  var products = from d in xElem.Descendants(fileName)
                        where textBox1.Text.ToLower().Split(' ').All(t => d.Element(productName).Value.ToLower().Contains(t))

                        orderby d.Element(productCode).Value ascending
                        select new
                        {
                            Price = (double.Parse(d.Element(productPrice).Value)).ToString(numberFormat),
                            Name = d.Element(Name).Value
                        };

Где в этом коде узкие места? И как их убрать? Я делаю этот выбор Linq каждый раз, когда в текстовое поле вводится нажатие клавиши , что означает обновление результата в реальном времени (по сравнению с ожиданием нажатия клавиши Enter). Спасибо.

1 Ответ

2 голосов
/ 17 января 2012

Не подключая профилировщик и не видя вывод, я могу только догадываться, что медленно.

  1. where textBox1.Text.ToLower.Split(' ') может быть кэшировано вне запроса.Я сомневаюсь, что это серьезная проблема.

  2. LINQ to XML может быть медленным на очень больших документах XML.Подумайте об использовании XmlTextReader для быстрого (но некрасивого) доступа к базовому XML только для пересылки.

  3. Предварительная обработка данных в памяти, если XML поддается этому.Запросы в памяти должны выполняться довольно быстро.

  4. Вы можете использовать что-то вроде Lucene.Net , чтобы индексировать большое количество файлов XML для быстрого поиска.Это может быть излишним, но довольно быстрым и масштабируемым.

  5. Подумайте о проблеме немного подробнее.Каждый раз, когда пользователь нажимает клавишу, вы обрабатываете XML DOM и выполняете несколько строковых операций.Обработка XML таким образом, что у вас есть форма, более подходящая для вашей задачи, выглядит хорошей победой.

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

...