제가 업무중에 제일 많이 사용하는 문자열 비교부분에 대해서 성능 테스트를 간단히 해봤습니다. 테스트를 했던 메소드들은 String.Compare, String.CompareOrdinal, String.Equals, 마지막으로 부등호기호인 "=" 을 가지고 테스트 해봤습니다.
실행한 코딩은 아래와 같습니다. 소스가 좀 너덜거리네요...^__^;
using System; using System.Collections;
public class CompareMaps { public const int MAX = 100000000; //for 문으로 1억번 돌렸습니다.
public static String Comparetime(string a, string b) { int result = 0; long starttime = Environment.TickCount; for (int i = 0; i < MAX; i++) { result = string.Compare(a.ToString(),b.ToString()); } long stoptime = Environment.TickCount; return "took " + (stoptime - starttime); }
public static String CompareOrdinaltime(string a, string b) { int result = 0; long starttime = Environment.TickCount; for (int i = 0; i < MAX; i++) { result = String.CompareOrdinal(a.ToString(),b.ToString()); } long stoptime = Environment.TickCount; return "took " + (stoptime - starttime); }
public static String EqualOrdinaltime(string a, string b) { bool result = false; long starttime = Environment.TickCount; for (int i = 0; i < MAX; i++) { result = a.Equals(b); } long stoptime = Environment.TickCount; return "took " + (stoptime - starttime); }
public static String Operatortime(string a, string b) { int result = 0; long starttime = Environment.TickCount; for (int i = 0; i < MAX; i++) { result = (a == b) ? 1 : 0; } long stoptime = Environment.TickCount; return " took " + (stoptime - starttime); }
public static void Main(String[] args) {
Random random = new Random(); //int a = random.Next(5000000); //int b = random.Next(5000000); string a = "1동해물과 12233445561 마르고 닳도록 백두산이"; string b = "1동해물과 12233445561 마르고 닳도록 백두산이";
두가지 결과를 말씀드리겠습니다. 아래의 결과값은 문자열 비교시 틀렸을때의 속도입니다. String.Equals 함수와 부등호 함수는 속도가 동일했고요. 그 다음에는 String.CompareOrdinal 그리고 String.Compare 순입니다. String.Compare 함수는 많은 기능을 제공해 주는 장점이 있는 대신에 속도면에서는 좋은 결과값을 주지 못했습니다.
이제는 값이 동일했을때 ... 어떤 결과값이 나올까요???
속도를 위와 비교하면 아시겠지만 String.Compare 함수가 틀린값에 비해서 시간이 2배 정도 더 걸리는 것을 보실 수 있습니다. 그리고 String.Equals 함수가 틀린값에 비해서 시간이 3배 정도 더 걸리는 것을 보실 수 있습니다. 제일 빠른 것은 부등호였습니다. 이는 틀린값보다 3배 더 빠릅니다.
위의 결과를 보시면 아시겠지만, String.Compare, String.CompareOrdinal 이 두개의 함수를 많이 사용할 수도 있는데요. 여러모로 String.CompareOrdinal 함수가 빠르다는 것을 확인하실 수 있습니다.
이 부분에 대한 상세한 설명은 http://dotnettipoftheday.org/tips/faster_string_comparison.aspx 를 참고하시고, 해당 메소드의 기능들은 MSDN 을 참고해 주시기 바랍니다.