Вам нужен знак минуса между bsq
и ac4
, а не тире. Посмотрите внимательно.
Знак минуса: - & nbsp; & NBSP; & NBSP; & NBSP; & NBSP; Тире: -
Почему Вы только не пробуете его несколько тысяч раз?
(это идет для всех, "Что является самым быстрым": вопросы)
<час>Hmmm, много downvotes за эти годы... Я предполагаю, что должен подробно остановиться на этом ответе.
вышеупомянутый оператор был сделан со степенью легкомысленности в моей юности, однако я все еще соглашаюсь с его чувством. Это не стоящее время расходов, создавая ТАК другие выяснения вопроса, что они думают, быстрее из двух или трех операций, которые берут меньше чем 1 мс каждый.
то, что можно было бы взять цикл или два дольше, чем другой, почти наверняка будет незначительно в ежедневном использовании. И если Вы когда-нибудь замечаете проблему производительности в своем приложении при преобразовании миллионов объектов в ints это точка, где можно представить фактический код, и Вы легко будете в состоянии протестировать, является ли международное преобразование на самом деле узким местом.
И тогда как сегодня это - объектно-международный преобразователь, завтра возможно, Вы будете думать, что Ваш преобразователь объектной Даты и времени занимает много времени. Вы создали бы другого ТАК вопрос узнать то, что самый быстрый метод?
Что касается Вашей ситуации (несомненно давно разрешенный к настоящему времени), как упомянуто в комментарии, Вы запрашиваете базу данных, таким образом, объектно-международное преобразование является наименьшим количеством Ваших забот. Если бы я был Вами, то я использовал бы любой из методов преобразования, которые Вы упомянули. Если бы проблема возникает, я изолировал бы вызов, с помощью профилировщика или входа. Тогда, когда я замечаю, что объектно-международное преобразование делается, миллион раз и общее время, потраченное тем преобразованием, кажется относительно высоким, я изменился бы на использование другого метода преобразования и перепрофиля. Выберите метод преобразования, который занимает наименьшее количество времени. Вы могли даже протестировать это в разном решении, или даже LINQPad или Powershell и т.д.
В конце они все заканчивают тем, что звонили:
System.Number.ParseInt32(string s, NumberStyles style, NumberFormatInfo info);
Так, таким образом, не будет никакого различия что так когда-либо.
Взглянули в .Net Reflector для наблюдения этого.
(международное) преобразование на строке не будет работать, таким образом, я не протестирую его. Преобразовать. ToInt32 отражается как тестирование значения к пустому указателю и ЗАТЕМ вызову международного Синтаксического анализа, так должен в целом иметь тенденцию быть медленнее, чем международный Синтаксический анализ ().
Если бы у Вас была потребность в дополнительной скорости, то было бы легко протестировать различное различные варианты. Так как Вы не тестируете их, Вам не должны быть нужны они. Не тратьте впустую свое время с бессмысленной микрооптимизацией!
Когда у меня есть вопросы о различиях в производительности между различными способами сделать что-то определенное как это, я обычно делаю новую запись в своей копии 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);
});
}
Если Вы знаете, что данные являются определенно интервалом тогда 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
Лучшей практикой был бы TryParse и наблюдение результата этого, если бы это работало то - иначе Вы могли бы получить исключения
Самый Быстрый! = Лучшая практика!
, Например, (int)
является почти наверняка самым быстрым, потому что это - оператор, а не вызов функции, но это будет только работать в определенных ситуациях.
лучшая практика должна использовать большинство читаемый код, который негативно не повлияет на Вашу производительность, и 99 раз из 100, целочисленное преобразование не определяет эффективность Вашего приложения. Если это, используйте самое соответствующее, самое узкое преобразование, Вы можете. Иногда это (int)
. Иногда это TryParse()
. Иногда это Convert.ToInt32()
.
При оптимизации связанной сетки данных в.Net 2 я нашел, что почти половина времени была потрачена в ToString различного объекта () на методы, которые тогда использовались в качестве исходных данных операций Преобразования. Путем изоляции этих случаев и путем кастинга к корректному типу, где возможный (так как они были строками, вынутыми из базы данных и типов, мог быть положен) это вызвало крупное увеличение скорости той операции привязки данных.
Так, если Вы знаете тип вещи впереди и Вы поразите часть кода достаточно раз, это стоит усилия бросить его непосредственно вместо того, чтобы преобразовать в случае необходимости.
Не уверенный в производительности, но этих методах не то же вообще. И Parse
и TryParse
работа со строкой, String
представление объекта анализируется (см. MSDN).
Преобразовывает строковое представление числа к его 32-разрядному эквивалентному целому числу со знаком.
Не уверенный в кастинге и Convert
класс, но бросок только для объектов, которые уже являются целыми числами на самом деле, но не со строгим контролем типов.
Matthias
, Если x будет помещенным в коробку интервалом тогда (int)x
, является самым быстрым.
, Если x является строкой, но является определенно верным номером тогда int.Parse(x)
, лучший
, Если x является строкой, но это не могло бы быть допустимо тогда int.TryParse(x)
, намного более быстро, чем блок try-catch.
различие между Синтаксическим анализом и TryParse незначительно во всех кроме самых крупных циклов.
, Если Вы не знаете то, что x (возможно, строка или помещенный в коробку интервал) тогда Convert.ToInt32(x)
, является лучшим.
Эти обобщенные правила также верны для всех типов значения со статическими методами Синтаксического анализа и TryParse.