Что состоит в том, чтобы измерить лучший способ, сколько времени код берет для выполнения?

Я пытаюсь определить, какой подход к удалению строки является самым быстрым.

Я просто получаю запуск и время окончания и показываю различие.

Но результаты так варьируются, например, как показано ниже того же метода может взять от 60 мс до 231 мс.

Что лучший метод должен получить более точные результаты?

сопроводительный текст http://www.deviantsart.com/upload/1q4t3rl.png

using System;
using System.Collections;
using System.Collections.Generic;

namespace TestRemoveFast
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int j = 0; j < 10; j++)
            {
                string newone = "";
                List tests = new List();
                for (int i = 0; i < 100000; i++)
                {
                    tests.Add("{http://company.com/Services/Types}ModifiedAt");
                }

                DateTime start = DateTime.Now;
                foreach (var test in tests)
                {
                    //newone = ((System.Xml.Linq.XName)"{http://company.com/Services/Types}ModifiedAt").LocalName;
                    newone = Clean(test);
                }

                Console.WriteLine(newone);
                DateTime end = DateTime.Now;
                TimeSpan duration = end - start;
                Console.WriteLine(duration.ToString());
            }

            Console.ReadLine();
        }

        static string Clean(string line)
        {
            int pos = line.LastIndexOf('}');
            if (pos > 0)
                return line.Substring(pos + 1, line.Length - pos - 1);
                //return line.Substring(pos + 1);
            else
                return line;
        }
    }
}

42
задан Edward Tanguay 15 January 2010 в 14:49
поделиться

8 ответов

Вы должны использовать System.diagnostics.stopwatch , и вы можете рассмотреть большой образец. Например, повторите этот тест что-то вроде в 10000 раз и в среднем результаты. Если вы думаете об этом научно, это имеет смысл. Чем больше образца, тем лучше. Вы можете избавиться от множества краевых чехлов и по-настоящему увидеть, что такое характеристики основных характеристик.

Другое, что нужно рассмотреть, заключается в том, что создание JIT Compilation и создание объекта могут определенно перекосить ваши результаты, поэтому убедитесь, что вы начнете и остановите свой секундомер в соответствующее время, и вызовите методы, которые вы хотите проверить, по крайней мере, один раз, прежде чем начать Тесты. Попробуйте разделить только детали, которые вы хотите проверить от остальной части вашего кода как можно больше.

47
ответ дан 26 November 2019 в 23:33
поделиться

Вы можете использовать секундомер класс.

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

var sw = new Stopwatch();

sw.Start();
// ...
sw.Stop();
7
ответ дан 26 November 2019 в 23:33
поделиться

int данный базовый 2, а затем шестнадцатеричный :

>>> int('010110', 2)
22
>>> hex(int('010110', 2))
'0x16'
>>> 

>>> hex(int('0000010010001101', 2))
'0x48d'

Документ int :

 int (x [, base]) - > целое число

По возможности преобразуйте последовательность или число в целое число. Плавающий

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

Документ hex :

 hex (число) - > последовательность

Возвращает шестнадцатеричное представление целого или длинного

целое число.

-121--1086808-

Следует использовать System.Diagnostics.Stopwatch , и может потребоваться рассмотреть большой образец. Например, повторите этот тест примерно 10000 раз и усредните результаты. Если думать об этом научно, это имеет смысл. Чем больше образец, тем лучше. Вы можете отсеять много краевых корпусов таким образом и на самом деле увидеть, что основная производительность, как.

Другое дело, что компиляция JIT и создание объектов могут точно исказить ваши результаты, поэтому убедитесь, что вы запускаете и останавливаете секундомер в соответствующее время, и вызовите методы, которые вы хотите проверить хотя бы один раз, прежде чем начать тесты. Постарайтесь максимально отделить только те части кода, которые требуется протестировать.

-121--1188768-

Возможно, вам придется применить некоторые статистические методы, чтобы вычеркнуть дисперсию. Попробуйте запустить одну и ту же часть кода 1000 раз, а затем потратьте среднее время и сравните это. Моделирование обычно использует какие-то методы для «очистки» чисел, и это один из них.

0
ответ дан 26 November 2019 в 23:33
поделиться

Мне придется рекомендовать высоко Profiler, включенные в Visual Studio Team Suite или Edition (или предстоящие Visual Studio 2010 Премиум или окончательный еще лучше) как лучший способ. Это очень настраивается, чрезвычайно мощный, мертвый простой в использовании, очень быстро и работает как с собственным, так и управляемым кодом. Я не знаком с рабочим процессом муравьев , но, похоже, является еще одним вариантом. Без сомнения, используя Profiler - это только опция для разработчика, которая связана с производительностью их применения. Нет заменителя, и вы действительно не можете взять любой коммерческий разработчик, работающий над производительностью, который серьезно бы передал профилировщик.

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

  • Студент или хоббист, заинтересованный в Выполнение их проектов (коммерческий профилировщик может быть вне досягаемости по финансовым причинам)
  • в публично выпущенном приложении, вы можете захотеть разделы кода, которые выполняют в потоке пользовательского интерфейса и статистики сообщений, которые могут быть уверены, что операции никогда не вызывают заметные задержки для любого из ваших пользователей. Команда Office использовала этот метод с огромным успехом (Outlook 2007 SP2 для кого-нибудь?), И я знаю, что команда Visual Studio имеет этот код по крайней мере в выпуске 2010 года.
0
ответ дан 26 November 2019 в 23:33
поделиться

Беда со всеми насущными подходами, заключается в том, что вы никогда не совсем уверены, что вы сирены. Вы можете, реализуете ли вы это или нет, включите в ваше время:

  • задержки, когда O / S предварительно опустит ваш процессор;
  • Context-переключение
  • баллончики, когда программа ждет данных;
  • и гораздо больше.

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

В вашем конкретном случае вы должны стремиться во время намного более длительных казней; Когда ваши времена подстраивают секунду, O / S чрезвычайно может беспокоить вас. Итак, пройдите 10 ^ 6 итераций и используйте средние пробежки достаточно, чтобы дать вам значимый расчет среднего и дисперсии. И убедитесь, что если вы берете этот подход, чтобы вы не случайно не ускорили второе испытание, имея данные, уже загруженные после окончания первого проб. Вы должны убедиться, что каждое из 10-^ 6 испытаний выполняет именно то, что делает 1-е испытание.

развлекаться

Марка

0
ответ дан 26 November 2019 в 23:33
поделиться

Три простых примечания:

  1. Использование System.diagnostics.stopmatch .

  2. Не профилируйте свой код на том же входе в миллион раз. Попробуйте найти ожидаемое распределение входов и профиля на этом. Это профиль на реальном входе, а не в лабораторном входе.

  3. Запустите метод Clean один раз перед входом в петлю профилирования, чтобы устранить время JOUTION. Иногда это важно.

из них, примечания 1. И 2. намного самые важные.

Ваши результаты профилирования бессмыслены, если вы не используете таймер высокого разрешения. Обратите внимание, что мы не много времени USAIN Использование воды .

Ваши результаты профилирования не имеют смысла, если вы не тестируете на реальном мире. Обратите внимание, что аварийные тесты выбивают автомобили, находящиеся в другие автомобили на 35 миль в час, а не в стены изготовленных из зефиров в 5 миль в час.

Таким образом:

// expectedInput is string[1000000]
// populate expectedInput with real-world input
Clean(expectedInput[0]);
Stopwatch sw = new Stopwatch();
sw.Restart();          //So you dont have to call sw.Reset()
for (int i = 0; i < 1000000; i++) {
    string t = Clean(expectedInput[i]);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);

Одно сложное примечание:

Если вам действительно нужно сделать профилирование, получить профилировщик, как муравьи .

38
ответ дан 26 November 2019 в 23:33
поделиться

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

0
ответ дан 26 November 2019 в 23:33
поделиться

Если вы беспокоитесь только о тестировании в своем коде... используйте System.Diagnostics.Stopwatch

Обычно я предпочитаю вырезать такие вещи из своего кода и использовать настоящий профилировщик, как RedGate's Performance Profiler

3
ответ дан 26 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: