Что быстрее, включить строку или еще, если тип? - PullRequest
73 голосов
/ 18 сентября 2008

Допустим, у меня есть опция определения пути к коду на основе сравнения строк или же типа iffing:

Что быстрее и почему?

switch(childNode.Name)
{
    case "Bob":
      break;
    case "Jill":
      break;
    case "Marko":
      break;
}

if(childNode is Bob)
{
}
elseif(childNode is Jill)
{
}
else if(childNode is Marko)
{
}

Обновление: Основная причина, по которой я спрашиваю об этом, заключается в том, что оператор switch отличается от того, что считается случаем. Например, он не позволит вам использовать переменные, только константы, которые перемещаются в основную сборку. Я предположил, что у него было это ограничение из-за какой-то забавной вещи, которую он делал. Если это только перевод в elseifs (как прокомментировал один из авторов), то почему мы не допускаем переменные в операторах case?

Предостережение: Я постоптимизирую. Этот метод вызывается много раз в медленной части приложения.

Ответы [ 23 ]

0 голосов
/ 18 сентября 2008

Возможно, я что-то упустил, но не могли бы вы сделать оператор switch для типа вместо String? То есть

switch(childNode.Type)
{
case Bob:
  break;
case Jill:
  break;
case Marko:
  break;
}
0 голосов
/ 18 сентября 2008

Одной из проблем, с которыми вы сталкиваетесь при использовании переключателя, является использование строк, таких как «Bob», это вызовет намного больше циклов и строк в скомпилированном коде. Сгенерированный IL должен будет объявить строку, установить для нее значение «Bob», а затем использовать ее в сравнении. Поэтому, учитывая это, ваши операторы IF будут выполняться быстрее.

PS. Пример Aeon не сработает, потому что вы не можете включить типы. (Нет, я не знаю почему, но мы попробовали это, но это не работает. Это связано с переменным типом)

Если вы хотите проверить это, просто создайте отдельное приложение и создайте два простых метода, которые делают то, что написано выше, и используют что-то вроде Ildasm.exe, чтобы увидеть IL. Вы заметите намного меньше строк в IL метода Method IF.

Ildasm поставляется с VisualStudio ...

Страница ILDASM - http://msdn.microsoft.com/en-us/library/f7dy01k1(VS.80).aspx

Учебник по ILDASM - http://msdn.microsoft.com/en-us/library/aa309387(VS.71).aspx

0 голосов
/ 18 сентября 2008

Три мысли:

1) Если вы собираетесь делать что-то другое в зависимости от типов объектов, возможно, имеет смысл перенести это поведение в эти классы. Затем вместо switch или if-else вы просто вызываете childNode.DoSomething ().

2) Сравнение типов будет намного быстрее, чем сравнение строк.

3) В конструкции if-else вы можете воспользоваться возможностью переупорядочения тестов. Если объекты «Джилл» составляют 90% проходящих через них объектов, сначала проверьте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...