2009-11-17 3 views
2

Я реализовал HttpModule, который перехватывает поток Response для каждого запроса и занимает от полудюжины до десятка Regex.Replace() s на каждый ответ типа text/html. Я обеспокоен тем, насколько сильно я поражаюсь в производительности. Какой хороший способ узнать? Я хочу сравнить скорость с и без этого HttpModule.ASP.NET: производительность HttpModule

ответ

1

Http-модуль - это всего лишь общая часть кода, поэтому вы можете измерить время выполнения этого конкретного элемента регулярного выражения. Достаточно. Имейте набор типичных потоков ответа в качестве входных данных вашего стресс-теста и измерьте выполнение замены с использованием класса Stopwatch. Рассмотрим также RegexOptions.Compiled переключатель.

1

Вот несколько идей:

  1. Добавить некоторые счетчики производительности Windows, и использовать их для измерения и сообщать средние данные о времени. Вы также можете увеличить счетчик только в том случае, если измерение времени превышает определенный порог. и
  2. Использовать трассировку в сочетании с Failed Request Tracing для сбора и отправки временных данных. Вы также можете инициировать отчеты FRT, только если время выполнения страницы превышает пороговое значение.
  3. Напишите единичный тест, в котором используются часы ОС Windows, чтобы определить, сколько времени потребуется выполнять вашему коду.
  4. Добавьте флаг в свой код, который вы можете включить или выключить с помощью тестовой страницы, чтобы включить или отключить код регулярного выражения, чтобы обеспечить легкое тестирование A/B.
  5. Используйте инструмент проверки нагрузки, такой как WCAT, чтобы узнать, сколько запросов страниц в секунду вы можете обрабатывать с включенным кодом и без него.
2

У меня есть несколько из них, которые подключаются к конвейеру потока Response.Filter для обеспечения интеграции файлов ресурсов, упаковки JS/CSS и перезаписи статических файлов в абсолютные пути.

Пока вы тестируете свои регулярные выражения в RegexBuddy для скорости более нескольких миллионов итераций, убедитесь, что вы используете RegexOptions.Compiled, и помните, что зачастую самым быстрым и эффективным способом является регулярное выражение для определения совпадений, а затем использование C#, чтобы отточить это именно то, что вам нужно.

Убедитесь, что вы также используете кеширование и настройку, на которые вы положитесь.

У нас был большой успех в этом.

0

Мне недавно пришлось выполнить некоторые тесты pef на HTTPModule, которые я написал, и решил выполнить пару нагрузочных тестов для имитации веб-трафика и сбора времени выполнения с и без настроенного модуля. Это был единственный способ, которым я мог понять, действительно ли это влияет на установку модуля.

Обычно я делал что-то с помощью Apache Bench (см. Следующие сведения о том, как intsall, How to install apache bench on windows 7?), но мне также пришлось использовать проверку подлинности Windows. Поскольку ab имеет только базовую аутентификацию, мне это не подходит для меня. ab является гладким и позволяет использовать различные сценарии запросов, так что это будет первое место для просмотра. Еще одна мысль заключается в том, что вы можете получить большую видимость, используя glimpse.

Будучи тем, что я не мог использовать ab Я написал что-то обычай, который позволит выполнять одновременные запросы и проверять разные URL-адреса.

Ниже приведено то, что я придумал для тестирования модуля, надеюсь, что это поможет!

// https://www.nuget.org/packages/RestSharp 
using RestSharp; 
using RestSharp.Authenticators; 
using RestSharp.Authenticators.OAuth; 
using RestSharp.Contrib; 
using RestSharp.Deserializers; 
using RestSharp.Extensions; 
using RestSharp.Serializers; 
using RestSharp.Validation; 

string baseUrl = "http://localhost/"; 
void Main() 
{ 
    for(var i = 0; i < 10; i++) 
    { 
     RunTests(); 
    } 

} 

private void RunTests() 
{ 
    var sites = new string[] { 
     "/resource/location", 
    }; 

    RunFor(sites); 
} 
private void RunFor(string[] sites) 
{ 
    RunTest(sites, 1); 
    RunTest(sites, 5); 
    RunTest(sites, 25); 
    RunTest(sites, 50); 
    RunTest(sites, 100); 
    RunTest(sites, 500); 
    RunTest(sites, 1000); 


} 
private void RunTest(string[] sites, int iterations, string description = "") 
{ 
    var action = GetAction(); 

    var watch = new Stopwatch(); 
    // Construct started tasks 
    Task<bool>[] tasks = new Task<bool>[sites.Count()]; 
    watch.Start(); 

    for(int j = 0; j < iterations; j++) 
    { 
     for (int i = 0; i < sites.Count(); i++) 
     { 
      tasks[i] = Task<bool>.Factory.StartNew(action, sites[i]); 
     } 
    } 
    try 
    { 
     Task.WaitAll(tasks); 
    } 
    catch (AggregateException e) 
    { 
     Console.WriteLine("\nThe following exceptions have been thrown by WaitAll()"); 
     for (int j = 0; j < e.InnerExceptions.Count; j++) 
     { 
      Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString()); 
     } 
    } 
    finally 
    { 
    watch.Stop(); 
    Console.WriteLine("\"{0}|{1}|{2}\", ",sites.Count(), iterations, watch.Elapsed.TotalSeconds); 
    } 
} 
private Func<object, bool> GetAction() 
{ 
    baseUrl = baseUrl.Trim('/'); 
    return (object obj) => 
    { 
     var str = (string)obj; 
     var client = new RestClient(baseUrl); 
     client.Authenticator = new NtlmAuthenticator(); 
     var request = new RestRequest(str, Method.GET); 
     request.AddHeader("Accept", "text/html"); 
     var response = client.Execute(request);  
     return (response != null); 
    }; 
} 

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

  • Нет связанных вопросов^_^