2015-11-10 2 views
1

У меня сложный запрос LINQ с группировкой и несколькими включениями. Я узнал, что ToListAsync() занимает больше секунды для завершения, а ToList() возвращается в доли секунды.Очень медленный ToListAsync() по сравнению с ToList()

allReservationsList = allReservations.ToList(); // fast 
allReservationsList = await allReservations.ToListAsync(); // more then a second for 60 rows 

Я делаю что-то неправильно или это проблема с сущностью?

Вот запрос:

  var reservations = db.Reservations 
       .Include(r => r.PickUpLocation) 
       .Include(r => r.ReturnLocation) 
       .Include(r => r.RequestedVehicleModel).ThenInclude(m => m.Photos) 
       .Include(r => r.RequestedVehicleModel.VehicleType.VehicleModels) 
       .Include(r => r.RequestedVehicleType).ThenInclude(t => t.Photos) 
       .Include(r => r.AssignedUnit.VehicleModel.VehicleType) 
       .Include(r => r.DailyPrice.Currency); 

      var allReservations = 
       from r in reservations 
       orderby r.VersionDate descending 
       group r by r.BookingCode into g 
       select g; 
+0

Не могли бы вы предоставить свой запрос и соответствующий код? Единственное, что я могу сказать, это то, что Крис сказал рев. Async всегда будет медленнее для одной операции, чем вызов синхронизации из-за накладных расходов. –

+0

@MaximeRouiller Я добавил запрос. Разница в производительности слишком драматична, чтобы объясняться накладными расходами, вероятно, 100 раз. –

+0

Это почти наверняка из-за таблицы Photos, содержащей столбцы varbinary (max) и/или [n] varchar (max). https://stackoverflow.com/questions/28543293/entity-framework-async-operation-takes-ten-times-as-long-to-complete –

ответ

0

Там слишком много переменных здесь. Однако, вообще говоря, методы async потребуют больше времени для возврата, чем методы синхронизации, просто потому, что async имеет больше накладных расходов. Будь то учетная запись всей задержки, которую вы видите или нет, нет способа сказать, по крайней мере, с предоставленной вами информацией.

+1

Я добавил запрос. Я бы понял 50%, даже 100% -ную разницу. Но то, что я вижу, - это, вероятно, разница в времени на 100 секунд. ToList() завершается почти мгновенно, а ToListAsync() занимает больше секунды. В VS Diagnostic Tool я очень четко вижу его на графике использования CPU - небольшой и короткий всплеск против высокой нагрузки больше секунды. –

+0

Опять же, слишком много переменных, чтобы сказать, что происходит. Однако для меня это похоже на предварительную оптимизацию. Публикуйте прокси-сервер своей производственной среды, нанесите его на загрузку и профайл. Если в этот момент это проблематично, вы можете приступить к оптимизации. По крайней мере, у вас будет гораздо больше релевантных данных для работы с этим моментом. Как бы то ни было, я бы сказал, не волнуйся об этом. –

+1

Именно по этой причине я начал рассматривать проблему: время ответа было слишком медленным в производственной среде. Поэтому я выяснил, какой вызов функции замедляет работу, заменил его синхронным аналоговым и устранил проблемы с производительностью. Он отлично работает, как это, но мне кажется очень странным, что асинхронный вызов в сотни раз медленнее, чем синхронизированный. –

Смежные вопросы