C#: это сравнивает точного класса?

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

Его мудрое, чтобы сделать это в экземплярах, где Вы были бы:

fprintf(stderr, "Error was %s\n", my_string_to_error(error_code));

, Если бы my_string_to_error() возвратил выделенную строку, Ваша программа просочилась бы данный вышеупомянутое (очень) общее использование такой функции.

char const *foo_error(...)
{
    return "Mary Poppins";
}

... также в порядке, некоторые глупые компиляторы могли бы хотеть, чтобы Вы бросили его все же.

Просто строки часов этим способом, не возвращайте книгу:)

35
задан stakx supports GoFundMonica 1 February 2013 в 20:42
поделиться

4 ответа

Это примерно так же точно, как вы можете получить для простого теста. Но есть некоторые факторы, которые не находятся под вашим контролем:

  • нагрузка на систему из других процессов
  • состояние кучи до / во время теста

Вы можете что-то сделать с этим последним пунктом, тест - один из редкие ситуации, когда вызов GC.Collect может быть защищен. И вы можете один раз позвонить subject заранее, чтобы устранить любые проблемы JIT. Но это требует, чтобы звонки субъекту были независимыми.

public static IEnumerable<TimeSpan> This(Action subject)
{
    subject();     // warm up
    GC.Collect();  // compact Heap
    GC.WaitForPendingFinalizers(); // and wait for the finalizer queue to empty

    var watch = new Stopwatch();
    while (true)
    {
        watch.Reset();
        watch.Start();
        subject();
        watch.Stop();
        yield return watch.Elapsed;  // TimeSpan
    }
}

Для получения бонуса ваш класс должен проверить System.Diagnostics.Stopwatch. Поле IsHighResolution . Если он выключен, у вас будет только очень грубое разрешение (20 мс).

Но на обычном ПК, где в фоновом режиме работает множество служб, оно никогда не будет очень точным.

21
ответ дан 27 November 2019 в 15:40
поделиться

Здесь пара проблем.

Во-первых, помните, что при первом запуске кода транзитивное закрытие его вызовов методов будет прерывистым. Это означает, что стоимость первого запуска, вероятно, будет выше, чем стоимость каждого последующего запуска. Это может иметь значение в зависимости от того, сравниваете ли вы «холодное» время или «горячее» время. Я встречал методы, в которых стоимость джиттинга метода была выше, чем стоимость любого другого его вызова вместе взятого!

Во-вторых, помните, что сборщик мусора работает в другом потоке. Если вы создаете мусор за один запуск, то затраты на очистку этого мусора могут быть реализованы только после следующих запусков. Следовательно, вы не учитываете общую стоимость одного запуска, перенося ее на более поздние запуски.

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

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

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

10
ответ дан 27 November 2019 в 15:40
поделиться

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

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

У других, вероятно, будет больше информации и знаний о .NET, чем у меня.

2
ответ дан 27 November 2019 в 15:40
поделиться

Вы обязательно должны вернуть ElapsedMilliseconds вместо ElapsedTicks. Значение, возвращаемое ElapsedTicks, зависит от частоты секундомера, которая может быть разной в разных системах. Это не обязательно будет соответствовать свойству Ticks объекта Timespan или DateTime.

См. http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks.aspx .

Если вы действительно хотите получить дополнительное разрешение Ticks, вы должны вернуть watch.Elapsed.Ticks (т.е. Timestamp.Ticks) вместо watch.ElapsedTicks (это может быть одна из самых тонких потенциальных ошибок в .Net). Из MSDN:

Тики секундомера отличаются от DateTime.Ticks. Каждая отметка в Значение DateTime.Ticks представляет один 100-наносекундный интервал. Каждый тик в значение ElapsedTicks представляет временной интервал равный 1 секунде делится на частоту.

В остальном, я думаю, ваш код в порядке, хотя я думаю, что вы бы включили в свои измерения некоторые накладные расходы на вызов методов, которые могут быть значительными, если сами методы занимают очень мало времени выполнить. Кроме того, вы, вероятно, захотите исключить первый вызов метода из вычисленного среднего значения, но я не уверен, как вы это сделаете в своем классе.

И последний момент, который, вероятно, не будет иметь отношения к большинству использование этого класса: секундомер работает немного быстрее по сравнению с системным временем. На моем компьютере он опережает примерно на 5 секунд (это секунды , а не миллисекунды) после 24 часов, а на других машинах этот дрейф может быть даже больше. Так что было бы немного ошибочно утверждать, что это очень , когда это " на самом деле просто очень гранулярный . Для краткосрочных методов измерения времени это, очевидно, не будет большой проблемой.

И еще один последний момент, который, безусловно, актуален: я часто замечал во время тестирования, что я получаю куча времени работы, которые все сгруппированы в узком диапазоне значений (например, 80, 80, 79, 82 и т. д.), но иногда в Windows происходит что-то еще (например, открытие другой программы, или мой антивирус, или что-то в этом роде) и я получу значение, совершенно не совпадающее с другими (например, 80, 80, 79, 271, 80 и т. д.). Я думаю, что простым решением этой проблемы с выбросами является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.

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

И еще один последний момент, который, безусловно, актуален: я часто замечал во время тестирования, что я получаю куча времени работы, которые все сгруппированы в узком диапазоне значений (например, 80, 80, 79, 82 и т. д.), но иногда в Windows происходит что-то еще (например, открытие другой программы, или мой антивирус, или что-то в этом роде) и я получу значение, совершенно не совпадающее с другими (например, 80, 80, 79, 271, 80 и т. д.). Я думаю, что простым решением этой проблемы с выбросами является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.

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

И еще один последний момент, который, безусловно, актуален: я часто замечал во время тестирования, что я получаю куча времени работы, которые все сгруппированы в узком диапазоне значений (например, 80, 80, 79, 82 и т. д.), но иногда в Windows происходит что-то еще (например, открытие другой программы, или мой антивирус, или что-то в этом роде) и я получу значение, совершенно не совпадающее с другими (например, 80, 80, 79, 271, 80 и т. д.). Я думаю, что простым решением этой проблемы с выбросами является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.

И еще один последний момент, который, безусловно, актуален: во время тестирования я часто замечал, что получаю множество значений времени выполнения, которые все сгруппированы в узком диапазоне значений (например, 80 , 80, 79, 82 и т. Д.), Но иногда в Windows происходит что-то еще (например, открытие другой программы или срабатывание моего антивируса или что-то в этом роде), и я получаю значение, совершенно не соответствующее другим (например, 80 , 80, 79, 271, 80 и т. Д.). Я думаю, что простым решением этой проблемы с выбросами является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.

И еще один последний момент, который, безусловно, актуален: во время тестирования я часто замечал, что получаю множество значений времени выполнения, которые все сгруппированы в узком диапазоне значений (например, 80 , 80, 79, 82 и т. Д.), Но иногда в Windows происходит что-то еще (например, открытие другой программы или срабатывание моего антивируса или что-то в этом роде), и я получаю значение, совершенно не соответствующее другим (например, 80 , 80, 79, 271, 80 и т. Д.). Я думаю, что простым решением этой проблемы с выбросами является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.

я получу кучу времени работы, которая сгруппирована в узком диапазоне значений (например, 80, 80, 79, 82 и т. д.), но иногда в Windows происходит что-то еще (например, открытие другой программы или мой антивирус или что-то в этом роде), и я получу значение, совершенно не совпадающее с другими (например, 80, 80, 79, 271, 80 и т. д.). Я думаю, что простым решением этой проблемы с выбросами является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.

я получу кучу времени работы, которая сгруппирована в узком диапазоне значений (например, 80, 80, 79, 82 и т. д.), но иногда в Windows происходит что-то еще (например, открытие другой программы или мой антивирус или что-то в этом роде), и я получу значение, совершенно не совпадающее с другими (например, 80, 80, 79, 271, 80 и т. д.). Я думаю, что простым решением этой проблемы с выбросами является использование медианы ваших измерений вместо среднего . Я не знаю, поддерживает ли Linq это автоматически или нет.

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

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

7
ответ дан 27 November 2019 в 15:40
поделиться
Другие вопросы по тегам:

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