Что является самым быстрым: (интервал), Преобразовать. ToInt32(x) или Int32. Синтаксический анализ (x)?

Вам нужен знак минуса между bsq и ac4, а не тире. Посмотрите внимательно.

Знак минуса: - & nbsp; & NBSP; & NBSP; & NBSP; & NBSP; Тире: -

43
задан Dan McClain 12 March 2009 в 23:30
поделиться

11 ответов

Почему Вы только не пробуете его несколько тысяч раз?

(это идет для всех, "Что является самым быстрым": вопросы)

<час>

Hmmm, много downvotes за эти годы... Я предполагаю, что должен подробно остановиться на этом ответе.

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

то, что можно было бы взять цикл или два дольше, чем другой, почти наверняка будет незначительно в ежедневном использовании. И если Вы когда-нибудь замечаете проблему производительности в своем приложении при преобразовании миллионов объектов в ints это точка, где можно представить фактический код, и Вы легко будете в состоянии протестировать, является ли международное преобразование на самом деле узким местом.

И тогда как сегодня это - объектно-международный преобразователь, завтра возможно, Вы будете думать, что Ваш преобразователь объектной Даты и времени занимает много времени. Вы создали бы другого ТАК вопрос узнать то, что самый быстрый метод?

Что касается Вашей ситуации (несомненно давно разрешенный к настоящему времени), как упомянуто в комментарии, Вы запрашиваете базу данных, таким образом, объектно-международное преобразование является наименьшим количеством Ваших забот. Если бы я был Вами, то я использовал бы любой из методов преобразования, которые Вы упомянули. Если бы проблема возникает, я изолировал бы вызов, с помощью профилировщика или входа. Тогда, когда я замечаю, что объектно-международное преобразование делается, миллион раз и общее время, потраченное тем преобразованием, кажется относительно высоким, я изменился бы на использование другого метода преобразования и перепрофиля. Выберите метод преобразования, который занимает наименьшее количество времени. Вы могли даже протестировать это в разном решении, или даже LINQPad или Powershell и т.д.

25
ответ дан demoncodemonkey 23 September 2019 в 12:01
поделиться

В конце они все заканчивают тем, что звонили:

System.Number.ParseInt32(string s, NumberStyles style, NumberFormatInfo info);

Так, таким образом, не будет никакого различия что так когда-либо.

Взглянули в .Net Reflector для наблюдения этого.

-6
ответ дан GateKiller 23 September 2019 в 12:01
поделиться

(международное) преобразование на строке не будет работать, таким образом, я не протестирую его. Преобразовать. ToInt32 отражается как тестирование значения к пустому указателю и ЗАТЕМ вызову международного Синтаксического анализа, так должен в целом иметь тенденцию быть медленнее, чем международный Синтаксический анализ ().

0
ответ дан nothrow 23 September 2019 в 12:01
поделиться

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

0
ответ дан dan-gph 23 September 2019 в 12:01
поделиться

Когда у меня есть вопросы о различиях в производительности между различными способами сделать что-то определенное как это, я обычно делаю новую запись в своей копии MeasureIt, бесплатной загрузки от великого статья MSDN от Vance Morrison. Для получения дополнительной информации обратитесь к статье.

Путем добавления простого бита кода к MeasureIt, я получаю результаты, ниже которых сравнивают фактические синхронизации различных методов преобразования в международное Примечание, бросок от строки до интервала выдаст исключение и не допустим, таким образом, я просто добавил перестановки, которые имели смысл мне.


Name                                                Median   Mean     StdDev   Min      Max    Samples       
IntCasts: Copy [count=1000 scale=10.0]              0.054    0.060    0.014    0.054    0.101    10       
IntCasts: Cast Int [count=1000 scale=10.0]          0.059    0.060    0.007    0.054    0.080    10       
IntCasts: Cast Object [count=1000 scale=10.0]       0.097    0.100    0.008    0.097    0.122    10       
IntCasts: int.Parse [count=1000 scale=10.0]         2.721    3.169    0.850    2.687    5.473    10       
IntCasts: Convert.ToInt32 [count=1000 scale=10.0]   3.221    3.258    0.067    3.219    3.418    10     


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

static unsafe public void MeasureIntCasts()
{
    int result;
    int intInput = 1234;
    object objInput = 1234;
    string strInput = "1234";

    timer1000.Measure("Copy", 10, delegate
    {
        result = intInput;
    });
    timer1000.Measure("Cast Object", 10, delegate
    {
        result = (int)objInput;
    });

    timer1000.Measure("int.Parse", 10, delegate
    {
        result = int.Parse(strInput);
    });

    timer1000.Measure("Convert.ToInt32", 10, delegate
    {
        result = Convert.ToInt32(strInput);
    });
}
12
ответ дан lucrativelucas 23 September 2019 в 12:01
поделиться

Если Вы знаете, что данные являются определенно интервалом тогда int myInt = (int)x;, должна быть самая быстрая опция. Иначе TryParse поможет Вам разобраться в нем без замедления исключений.

BTW:

(интервал) только распаковывает поэтому быстрее,

(международные) IL =

  .locals init (
        [0] object x,
        [1] int32 Y)
    L_0000: ldc.i4.1 
    L_0001: box int32
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: unbox int32
    L_000d: ldobj int32
    L_0012: stloc.1 
    L_0013: ret 

Преобразовывают. Toint32 =

.locals init (
        [0] object x,
        [1] int32 Y)
    L_0000: ldc.i4.1 
    L_0001: box int32
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: call object [mscorlib]System.Runtime.CompilerServices.RuntimeHelpers::GetObjectValue(object)
    L_000d: call int32 [mscorlib]System.Convert::ToInt32(object)
    L_0012: stloc.1 
    L_0013: ret 
16
ответ дан dr. evil 23 September 2019 в 12:01
поделиться

Лучшей практикой был бы TryParse и наблюдение результата этого, если бы это работало то - иначе Вы могли бы получить исключения

6
ответ дан Surgical Coder 23 September 2019 в 12:01
поделиться

Самый Быстрый! = Лучшая практика!

, Например, (int) является почти наверняка самым быстрым, потому что это - оператор, а не вызов функции, но это будет только работать в определенных ситуациях.

лучшая практика должна использовать большинство читаемый код, который негативно не повлияет на Вашу производительность, и 99 раз из 100, целочисленное преобразование не определяет эффективность Вашего приложения. Если это, используйте самое соответствующее, самое узкое преобразование, Вы можете. Иногда это (int). Иногда это TryParse(). Иногда это Convert.ToInt32().

34
ответ дан Joel Coehoorn 23 September 2019 в 12:01
поделиться

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

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

2
ответ дан fractos 23 September 2019 в 12:01
поделиться

Не уверенный в производительности, но этих методах не то же вообще. И Parse и TryParse работа со строкой, String представление объекта анализируется (см. MSDN).

Преобразовывает строковое представление числа к его 32-разрядному эквивалентному целому числу со знаком.

Не уверенный в кастинге и Convert класс, но бросок только для объектов, которые уже являются целыми числами на самом деле, но не со строгим контролем типов.

Matthias

0
ответ дан Matthias Meid 23 September 2019 в 12:01
поделиться

Это зависит от того, чем Вы ожидаете, что x будет

, Если x будет помещенным в коробку интервалом тогда (int)x, является самым быстрым.

, Если x является строкой, но является определенно верным номером тогда int.Parse(x), лучший

, Если x является строкой, но это не могло бы быть допустимо тогда int.TryParse(x), намного более быстро, чем блок try-catch.

различие между Синтаксическим анализом и TryParse незначительно во всех кроме самых крупных циклов.

, Если Вы не знаете то, что x (возможно, строка или помещенный в коробку интервал) тогда Convert.ToInt32(x), является лучшим.

Эти обобщенные правила также верны для всех типов значения со статическими методами Синтаксического анализа и TryParse.

80
ответ дан Keith 23 September 2019 в 12:01
поделиться
Другие вопросы по тегам:

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