2014-10-08 54 views
2

我有两种方法将字符串的第一个字母改为大写,但我想知道哪一个使用更多的服务器资源? (MVC 5,C#)首字母大写的字符串:什么是更昂贵的服务器? C#

string test1 = test.ToUpper()[0] + test.Substring(1); 

string test1 = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower()); 
+0

为什么不使用'秒表'类并自己检查。此外,你可以去扩展方法。 – Rahul 2014-10-08 23:13:28

+2

两者都很好。与其他事情相比,您的Web应用程序可能正在做的事情(数据库查询等),这是微不足道的。但是,正如拉胡尔所说,你为什么不把它作为基准呢?很容易测试执行此转换需要多长时间,例如循环中的10000次。至少它让你知道它对CPU有多大的压力。检查内存使用情况比较棘手。 – HaukurHaf 2014-10-08 23:17:08

+1

请注意,由于'test.ToLower()'在第二行中,这两行代码可能会导致截然不同的字符串。 – 2014-10-08 23:44:14

回答

1

嗯,我做了一个小的基准来检查出来,有两种方法之间存在没有这样的观察到的差异。您可以使用下面的代码在您的最后执行相同的操作。尝试按照以下评论中的@ ta.speot.is所建议的多次运行它。

static void Main(string[] args) 
    { 
     for (int i = 0; i < 5; i++) 
     { 
      Benchmark(); 
      Console.WriteLine(); 
     } 
    } 

    static void Benchmark() 
    { 
     string test = "rahul"; 
     Stopwatch watch = Stopwatch.StartNew(); 
     string test1 = test.ToUpper()[0] + test.Substring(1); 
     watch.Stop(); 
     Console.WriteLine(watch.ElapsedTicks); 

     watch.Restart(); 
     string test2 = 
      CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower()); 
     watch.Stop(); 
     Console.WriteLine(watch.ElapsedTicks); 
    } 

如果你多次运行它,它看起来像第一个接近它比第二个更快。我尝试了5次,下面那张结果

4 
5 

2 
4 

2 
3 

2 
3 
+0

你是否多次运行过这个?因为第一个结果可能很容易由上下文切换或两个或分页或JIT JIT或GC GC造成......首先尝试“ToTitleCase”。 – 2014-10-08 23:25:34

+0

是的,每次都可以观察到差异。尝试一次你的结局(只想确认一次) – Rahul 2014-10-08 23:26:02

+0

有趣......我在计算机上运行了这个程序,第一次测试时一直有80个刻度,第二个测试时刻有150个刻度。 – 2014-10-08 23:28:01

5

添加到您的ExtensionMethods.cs

public static class ExtensionMethods 
{ 
    public static string UppercaseFirstLetter(this string value) 
    { 
     // 
     // Uppercase the first letter in the string this extension is called on. 
     // 
     if (value.Length > 0) 
     { 
      char[] array = value.ToCharArray(); 
      array[0] = char.ToUpper(array[0]); 
      return new string(array); 
     } 
     return value; 
    } 
} 

据:http://www.dotnetperls.com/uppercase-first-letter它比你的第一种方法更快,因为,因为它只能分配一个新的返回语句中的字符串。第一种方法分配两个字符串:Substring(1),然后是一个带有string.Concat的新字符串。

+0

只有一件事是错的,你应该将另一个字符串设置为Lower。这在这些情况下会失败。 LoWer,loweR。作者问他需要第一个字母大写,并阅读他的代码,这可能是他唯一想要的。 所以修改它为这样的 char firstChar = char.ToUpper(value [0]); return firstChar + value.Substring(1); – DevEstacion 2014-10-09 05:37:50

2

我做了一个dotnetfiddle,测试你提到的两种方法的性能,加上SatuDuaTiga建议的性能。

https://dotnetfiddle.net/VyNjht

通过SatuDuaTiga建议的方法似乎通过小幅度超越第一种方法,但使用.ToTitleCase()中的CultureInfo命名空间是迄今为止最糟糕的。

多次运行的平均结果:

  • 方法1:93673蜱
  • 方法2:260491蜱
  • 方法3:90649蜱

可以拆卸TextInfo类和查看.ToTitleCase()方法的来源,你会发现它做了很多事情。