Вопрос

Я полный новичок, но я писал небольшую программу, которая работала со строками на C #, и я заметил, что если я делаю несколько вещей по-другому, код выполняется значительно быстрее.

Поэтому мне стало интересно, как вы повышаете скорость выполнения вашего кода?Существуют ли какие-либо (бесплатные) утилиты?Вы делаете это старомодным способом с помощью системы.Таймер и делаете это сами?

Это было полезно?

Решение

То, что вы описываете, известно как профилирование производительности.Есть много программ, которые вы можете использовать для этого, таких как Профилировщик Jetbrains или Профилировщик муравьев, хотя большинство из них замедлят работу вашего приложения в процессе измерения его производительности.

Чтобы вручную создать собственное профилирование производительности, вы можете использовать Система.Диагностика.Секундомер и простая консоль.WriteLine, как вы описали.

Также имейте в виду, что компилятор C # JIT оптимизирует код в зависимости от типа и частоты его вызова, поэтому поиграйте с циклами разного размера и методами, такими как рекурсивные вызовы, чтобы получить представление о том, что работает лучше всего.

Другие советы

Профилировщик муравьев из Редгейта это действительно хороший профилировщик производительности. Профилировщик dotTrace от JetBrains это тоже здорово.Эти инструменты позволят вам увидеть показатели производительности, которые можно детализировать по каждой отдельной строке.

Снимок МУРАВЬИНОЙ ОСЫПИ Профилировщиком:МУРАВЬИ http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

Если вы хотите убедиться, что конкретный метод остается в пределах определенного порога производительности во время модульного тестирования, я бы использовал Stopwatch класс отслеживать время выполнения метода один или много раз в цикле и вычислять среднее значение, а затем Assert вопреки результату.

Просто напоминаю - обязательно компилируйте в Relase, а не отлаживайте!(Я видел эту ошибку, допущенную опытными разработчиками - ее легко забыть).

То, что вы описываете, называется "Настройкой производительности".Когда мы говорим о настройке производительности, у этого есть два аспекта.(a) Время отклика - сколько времени требуется для выполнения конкретного запроса / программы.(b) Пропускная способность - сколько запросов он может выполнить за секунду.Когда мы обычно "оптимизируем" - когда мы устраняем ненужную обработку, - улучшается как время отклика, так и пропускная способность.Однако, если у вас есть события ожидания в вашем коде (например, Thread.sleep(), ожидание ввода-вывода и т.д.), Это влияет на ваше время отклика, однако пропускная способность не изменяется.Внедрив параллельную обработку (порождающую несколько потоков), мы можем увеличить время отклика, но пропускная способность от этого не улучшится.Обычно для серверного приложения важны как время отклика, так и пропускная способность.Для настольных приложений (таких как IDE) пропускная способность не важна, важно только время отклика.

Вы можете измерить время отклика с помощью "Тестирования производительности" - вы просто записываете время отклика для всех ключевых транзакций.Вы можете измерить пропускную способность с помощью "нагрузочного тестирования" - вам нужно непрерывно перекачивать запросы от достаточно большого количества потоков / клиентов, чтобы загрузка процессора серверной машины составляла 80-90%.Когда мы перекачиваем запрос, нам необходимо поддерживать соотношение между различными транзакциями (называемое сочетанием транзакций) - например:в системе бронирования на каждые 100 поисковых запросов будет приходиться 10 бронирований.за каждые 10 бронирований будет одна отмена и т.д.

После определения транзакций, требующих настройки времени отклика (тестирование производительности), вы можете определить горячие точки с помощью профилировщика.Вы можете определить горячие точки пропускной способности, сравнив время отклика * на долю этой транзакции.Предположим, что в сценарии поиска, бронирования и отмены соотношение равно 89: 10:1.Время отклика составляет 0,1 секунды, 10 секунд и 15 секунд.нагрузка для поиска - 0,1 * .89 = 0,089 нагрузка для бронирования - 10 * .1 = 1 нагрузка для отмены = 15 * .01 = 0.15 Здесь настройка бронирования окажет максимальное влияние на пропускную способность.Вы также можете определить горячие точки пропускной способности, многократно извлекая дампы потоков (в случае приложений на базе Java).

Используйте профилировщик.

Если вам нужно засечь время только одним конкретным методом, хорошим выбором может быть класс Stopwatch.

Я делаю следующие вещи:1) Я использую галочки (например,в VB.Net Now.ticks) для измерения текущего времени.Я вычитаю начальные тики из значения конечных тиков и делю на промежуток времени.Отметьте в секунду, чтобы узнать, сколько секунд это заняло.2) Я избегаю операций с пользовательским интерфейсом (например, console.writeline).3) Я запускаю код в течение значительного цикла (например, 100 000 итераций), чтобы максимально учесть переменные использования / операционной системы.

Вы можете использовать класс StopWatch для определения времени выполнения методов.Помните, что первый раз часто выполняется медленно из-за необходимости jitting кода.

Существует опция native .NET (командная версия для разработчиков программного обеспечения), которая может удовлетворить некоторые потребности в анализе производительности.В меню IDE 2005 .NET выберите Сервис-> Инструменты производительности-> Мастер повышения производительности...

[Вероятно, GSS прав в том, что у вас должна быть Team Edition]

Это простой пример для тестирования скорости кода.Я надеюсь, что помог вам

class Program {
    static void Main(string[] args) {
        const int steps = 10000;
        Stopwatch sw = new Stopwatch();

        ArrayList list1 = new ArrayList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list1.Add(i);
        }
        sw.Stop();
        Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);

        MyList list2 = new MyList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list2.Add(i);
        }
        sw.Stop();
        Console.WriteLine("MyList:  \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top