What is the fastest (built-in) comparison for string-types in C#

前端 未结 8 1660
南方客
南方客 2021-02-05 02:09

What is the fastest built-in comparison-method for string-types in C#? I don\'t mind about the typographical/semantical meaning: the aim is to use the comparator in sorted lists

8条回答
  •  南旧
    南旧 (楼主)
    2021-02-05 02:43

    I designed a unit test to test string comparison speed using some of the methods mentioned in this post. This test was ran using .NET 4

    In short, there isn't much much difference, and I had to go to 100,000,000 iterations to see a significant difference. Since it seems the characters are compared in turn until a difference is found, inevitably how similar the strings are plays a part.

    These results actually seem to suggest that using str1.Equals(str2) is the fastest way to compare strings.

    These are the results of the test, with the test class included:

    ######## SET 1 compared strings are the same: 0
    #### Basic == compare: 413
    #### Equals compare: 355
    #### Equals(compare2, StringComparison.Ordinal) compare: 387
    #### String.Compare(compare1, compare2, StringComparison.Ordinal) compare: 426
    #### String.CompareOrdinal(compare1, compare2) compare: 412
    
    ######## SET 2 compared strings are NOT the same: 0
    #### Basic == compare: 710
    #### Equals compare: 733
    #### Equals(compare2, StringComparison.Ordinal) compare: 840
    #### String.Compare(compare1, compare2, StringComparison.Ordinal) compare: 987
    #### String.CompareOrdinal(compare1, compare2) compare: 776
    
    using System;
    using System.Diagnostics;
    using NUnit.Framework;
    
    namespace Fwr.UnitTests
    {
        [TestFixture]
        public class StringTests
        {
            [Test]
            public void Test_fast_string_compare()
            {
                int iterations = 100000000;
                bool result = false;
                var stopWatch = new Stopwatch();
    
                Debug.WriteLine("######## SET 1 compared strings are the same: " + stopWatch.ElapsedMilliseconds);
    
                string compare1 = "xxxxxxxxxxxxxxxxxx";
                string compare2 = "xxxxxxxxxxxxxxxxxx";
    
                // Test 1
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = compare1 == compare2;
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### Basic == compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 2
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = compare1.Equals(compare2);
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### Equals compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 3
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = compare1.Equals(compare2, StringComparison.Ordinal);
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### Equals(compare2, StringComparison.Ordinal) compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 4
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = String.Compare(compare1, compare2, StringComparison.Ordinal) != 0;
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### String.Compare(compare1, compare2, StringComparison.Ordinal) compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 5
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = String.CompareOrdinal(compare1, compare2) != 0;
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### String.CompareOrdinal(compare1, compare2) compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                Debug.WriteLine("######## SET 2 compared strings are NOT the same: " + stopWatch.ElapsedMilliseconds);
    
                compare1 = "ueoqwwnsdlkskjsowy";
                compare2 = "sakjdjsjahsdhsjdak";
    
                // Test 1
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = compare1 == compare2;
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### Basic == compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 2
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = compare1.Equals(compare2);
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### Equals compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 3
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = compare1.Equals(compare2, StringComparison.Ordinal);
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### Equals(compare2, StringComparison.Ordinal) compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 4
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = String.Compare(compare1, compare2, StringComparison.Ordinal) != 0;
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### String.Compare(compare1, compare2, StringComparison.Ordinal) compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
    
                // Test 5
    
                stopWatch.Start();
    
                for (int i = 0; i < iterations; i++)
                {
                    result = String.CompareOrdinal(compare1, compare2) != 0;
                }
    
                stopWatch.Stop();
    
                Debug.WriteLine("#### String.CompareOrdinal(compare1, compare2) compare: " + stopWatch.ElapsedMilliseconds);
    
                stopWatch.Reset();
            }
        }
    }
    

提交回复
热议问题