Я имею следующий код:Медленная работа LINQ
public static IEnumerable<int> GetCloseZipCodes(int zipcode, int radius)
{
PycDBDataContext db = new PycDBDataContext();
ZipCode reqZipInfo = ZipCodes.Instance.zipcodes[zipcode];
if (reqZipInfo == null)
return new int[] { };
double longt = LongitudePlusDistance((double)reqZipInfo.Longitude, (double)reqZipInfo.Latitude, radius);
double latit = LatitudePlusDistance((double)reqZipInfo.Latitude, radius);
double minLong = 2 * (double)reqZipInfo.Longitude - longt;
double minLat = 2 * (double)reqZipInfo.Latitude - latit;
var zips = ZipCodes.Instance.zipcodes.Where(x => (double)x.Value.Longitude >= minLong &&
(double)x.Value.Longitude <= longt &&
(double)x.Value.Latitude >= minLat &&
(double)x.Value.Latitude <= latit &&
CalcDistance((double)reqZipInfo.Longitude,
(double)reqZipInfo.Latitude,
(double)x.Value.Longitude,
(double)x.Value.Latitude) <= radius).Select(x => x.Key);
return zips;
}
Эта функция задается с помощью почтовый индекс, радиус, и она найдет все Почтовые индексы в пределах радиуса. У меня есть проблемы с производительностью, здесь и после запуска dotTrace большую часть своего времени в следующем:
var zips = ZipCodes.Instance.zipcodes.Where(x => (double)x.Value.Longitude >= minLong &&
(double)x.Value.Longitude <= longt &&
(double)x.Value.Latitude >= minLat &&
(double)x.Value.Latitude <= latit &&
CalcDistance((double)reqZipInfo.Longitude,
(double)reqZipInfo.Latitude,
(double)x.Value.Longitude,
(double)x.Value.Latitude) <= radius).Select(x => x.Key);
И третья часть времени, он получает доступ к
public System.Nullable<decimal> Longitude
{
get
{
return this._Longitude;
}
set
{
if ((this._Longitude != value))
{
this._Longitude = value;
}
}
}
Как я могу улучшить производительность? ?? Мы говорим здесь несколько секунд ... Не понимаю, почему. все это кэшировано и не-SQL.
Сколько записей является его соответствие против? –
Моя первая мысль заключалась в том, что метод CalcDistance является узким местом, поскольку он называется для каждого элемента. Попробуйте создать реальный метод для замены выражения лямбда, и тогда будет проще поместить некоторые таймеры вокруг него и дополнительно изолировать проблему. Я не вижу ничего, кроме этого метода, который мог бы это сделать. Возможно, вы можете разместить содержимое CalcDistance? –
Если вы используете возвращаемое значение 'GetCloseZipCodes' много раз, вы можете попытаться преобразовать его' ToList' или 'ToArray', чтобы устранить несколько вычислений. –