2015-06-14 1 views
2

Мы хотим передать часть нашего приложения в внешнюю компанию. Эти компоненты делают асинхронные запросы на внешние сайты и обрабатывают контент с помощью парсеров html или регулярных выражений.Измерьте интенсивное время процессора с асинхронным кодом

async Task Do() 
{ 
    var webContent = await Get("http://..."); 
    var match = Regex.Match(webContent); 

    if (IsXXX(match)) 
    { 
     webContent = await Get("http://other..."); 
    } 
} 

Каждый компонент отличается, некоторые делают только один запрос, другие делают намного больше. Мы хотим убедиться, что часть процессора с интенсивным вычислением (Regex, Parsing) занимает не более 100 мс и хочет протестировать ее автоматически как первый шаг в конвейере обеспечения качества. Есть ли способ измерить производительность без времени ожидания для веб-запросов?

Я вижу только два решения в данный момент, но хотел бы знать, если есть лучший подход:

  1. Обеспечение обертку для веб-запросов и измерить время ожидания. Затем используйте простой секундомер для измерения времени и вычитания времени ожидания. Сложно для мыльных вызовов при использовании сгенерированных клиентских классов.
  2. Внедрение пользовательского контекста синхронизации и измерение времени здесь.

Есть ли встроенные решения?

+0

Если внешняя компания будет предоставлять вам как вызовы IO, так и CPU, вам нужно будет сказать им, что вы хотите проверить каждый из этих разделов. –

+0

Не можете ли вы просто обернуть секундомер вокруг вызова Regex.Match? Сделайте 'Do' измерьте себя и сообщите перформансу вызывающим. – usr

+0

@Yuval: Мы хотим, чтобы было проще реализовать этот процесс недорогим способом (мы стартап без внешнего финансирования). Компоненты определяются интерфейсом, и мы генерируем интеграционные тесты для всего вызова метода. Единственное, чего не хватает, это производительность процессора. – SebastianStehle

ответ

1

Откажитесь от веб-запросов, привязанных к IO, чтобы немедленно вернуть строку HTML, которая будет обрабатывать аналогичный процессор. Например. используйте return Task.FromResult(XXX), чтобы получить задание, которое уже завершено. Затем измерьте метод в целом.

Обратите внимание, что вы можете использовать Microsoft Fakes для замены любого внутреннего вызова с помощью собственного метода.