производительность c #: сравнение типов и сравнение строк - PullRequest
3 голосов
/ 15 ноября 2008

Что быстрее? Это:

bool isEqual = (MyObject1 is MyObject2)

Или это:

bool isEqual = ("blah" == "blah1")

Было бы полезно выяснить, какой из них быстрее. Очевидно, что если вы применяете .ToUpper () к каждой стороне сравнения строк, как это часто делают программисты, это потребует перераспределения памяти, что влияет на производительность. Но как насчет того, если .ToUpper () находится вне уравнения, как в приведенном выше примере?

Ответы [ 7 ]

9 голосов
/ 15 ноября 2008

Я немного запутался здесь.

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

Если вы хотите определить, принадлежит ли объект определенному типу, используйте оператор is.

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

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


После более внимательного прочтения я думаю, что вы хотите сравнить скорость сравнения строк со скоростью сравнений ссылок (тип сравнения, используемый в базовом типе System.Object).

Если это так, то ответ таков: сравнение ссылок никогда не будет медленнее, чем любое другое сравнение строк. Сравнение ссылок в .NET во многом аналогично сравнению указателей в C - примерно так быстро, как вы можете.

Однако, как бы вы себя чувствовали, если бы строковая переменная s имела значение "I'm a string", но следующее сравнение не удалось:

if (((object) s) == ((object) "I'm a string")) { ... }

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

5 голосов
/ 15 ноября 2008

Согласно книге «Максимизация производительности .NET» звонок

bool isEqual = String.Equals("test", "test");

по производительности идентичен

bool isEqual = ("test" == "test");

Звонок

bool isEqual = "test".Equals("test");

теоретически медленнее, чем вызов статического метода String.Equals, но я думаю, вам нужно сравнить несколько миллионов строк, чтобы реально обнаружить разницу в скорости.

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

4 голосов
/ 15 ноября 2008

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


        string toto = "toto";
        string tata = "tata";
        bool isEqual = string.Compare(toto, tata, StringComparison.InvariantCultureIgnoreCase) == 0;    
        Console.WriteLine(isEqual);     
1 голос
/ 15 ноября 2008

Как насчет того, чтобы сказать мне? :)

Возьмите код из этого поста ужаса кодирования и вставьте свой код для проверки вместо его алгоритма.

0 голосов
/ 28 декабря 2009

Если я понимаю вопрос, и вы действительно хотите сравнить равенство ссылок со старым "сравнением содержимого": создайте тестовый сценарий и вызовите object.ReferenceEquals по сравнению с = b.

Примечание: у вас есть , чтобы понять, в чем разница, и что вы, вероятно, не можете использовать эталонное сравнение в большинстве сценариев. Если вы уверены, что это то, что вы хотите, то может быть чуть-чуть быстрее. Вы должны попробовать это сами и оценить, стоит ли это вообще каких-либо проблем ..

0 голосов
/ 28 марта 2009

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

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

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

0 голосов
/ 15 ноября 2008

Сравнение строк с помощью оператора "==" сравнивает содержимое строки и строковый объект ссылка . Сравнение объектов вызовет метод Equals объекта, чтобы определить, равны они или нет. Реализация Equals по умолчанию заключается в сравнении ссылок, возвращающем True, если обе ссылки на объекты являются одинаковыми физическими объектами. Вероятно, это будет быстрее, чем сравнение строк, но зависит от типа сравниваемого объекта.

...