Самый эффективный способ протестировать тип объекта

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

Когда что-то должно существовать в C ++ но нет, первое место для поиска - boost.org . Там я нашел Boost многомерную библиотеку массивов, multi_array . Он даже включает класс multi_array_ref, который можно использовать для упаковки собственного одномерного массива.

21
задан Hexaholic 14 December 2015 в 09:16
поделиться

5 ответов

Использовал бы дважды. TryParse, это имеет выигрыши в производительности.

10
ответ дан 29 November 2019 в 21:28
поделиться

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

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

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

6
ответ дан 29 November 2019 в 21:28
поделиться

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

3 мог быть интервал, двойное или строка!

Это зависит от того, что Вы пытаетесь сделать и насколько важный случается так, что они - конкретный тип. Могло бы быть лучше только оставить их, как они, пока Вы можете или, альтернативно, некоторые с методом для маркировки каждого (если Вы имеете контроль над источником исходной строки).

5
ответ дан 29 November 2019 в 21:28
поделиться

Вы получите различные результаты для различных методов в зависимости от того, компилируете ли Вы с оптимизациями на. У Вас в основном есть несколько опций:

object o;

//checking with is
o is int

//check type
o.GetType() != typeof( int )

//cast and catch exception
try{ int j = (int) o; } 
catch {}

//use the tryparse
int.TryParse( Convert.ToString( o ), out j )

можно легко настроить консольное приложение, которое пробует каждый из этих 10 000 раз и продолжительностей возвратов для каждого (тест, когда o является интервалом и когда это - что-то еще).

try-catch метод является самым быстрым, если объект действительно содержит интервал и безусловно самое медленное, если он не делает (еще медленнее, чем GetType). int.TryParse довольно быстро, если у Вас есть строка, но если у Вас есть неизвестный объект, это медленнее.

Интересно, с.Net 3.5 и оптимизациями включил эти o is int, проверка занимает то же время в качестве try-catch, когда o на самом деле является интервалом o is int, незначительно медленнее, если o на самом деле - что-то еще.

Раздражающе FxCop подбросит предупреждения, если Вы сделаете что-то как:

if( o is int )
    int j = (int) o;

, Но я думаю, что это - ошибка в FxCop - он не знает, что интервал является типом значения и рекомендует Вам использовать o as int вместо этого.

, Если Ваш вход всегда является строкой int.TryParse, является лучшим, иначе is, оператор является самым быстрым.

, Поскольку у Вас есть строка, я посмотрел бы на то, необходимо ли знать, что это - интервал, а не двойное. Если int.TryParse передачи тогда так будут double.TryParse, таким образом, Вы могли, половина количества проверок - возвращает или дважды или строка и ставит в тупик удваивание, когда Вы ожидаете интервал

5
ответ дан 29 November 2019 в 21:28
поделиться

Я лично использовал бы int.tryparse, тогда double.tryparse. Производительность на тех методах является довольно высокой. Они оба возвращают булевскую переменную. Если оба сбоя тогда, у Вас есть строка, на то, как Вы определили свои данные.

3
ответ дан 29 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

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