字符串的第一个字符改为大写:什么对服务器来说更昂贵?C#

字符串的第一个字符改为大写:什么对服务器来说更昂贵?C#,c#,string,uppercase,C#,String,Uppercase,我有两种方法将字符串的第一个字母转换为大写,但我想知道哪种方法使用的服务器资源更多? (MVC 5,C#) 或 我做了一个小的基准测试来检验它,这两种方法之间没有明显的差异。您可以使用下面的代码在您的终端执行相同的操作。请尝试,按照@ta.speot.is在下面评论中的建议运行多次 static void Main(string[] args) { for (int i = 0; i < 5; i++) { Bench

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


我做了一个小的基准测试来检验它,这两种方法之间没有明显的差异。您可以使用下面的代码在您的终端执行相同的操作。请尝试,按照@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);
    }

将此添加到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;
    }
}

根据:它比第一个方法快,因为它只在return语句中分配一个新字符串。第一种方法分配两个字符串:子字符串(1),然后是一个带有string.Concat的新字符串。

我制作了一个dotnetfiddle,用于测试您提到的两种方法以及SatuDuaTiga建议的方法的性能

SatuDuaTiga建议的方法似乎比第一种方法好一点,但在CultureInfo命名空间中使用.ToTitleCase()是迄今为止最差的方法

多次运行的平均结果:

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

您可以反汇编TextInfo类并查看.ToTitleCase()方法的源代码,您将看到它正在做很多事情。

为什么不使用
秒表类并自己检查呢。此外,您还可以使用扩展方法。这两种方法都可以。与web应用程序可能正在做的其他事情(DB查询等)相比,这是微不足道的。但正如拉胡尔所说,你为什么不直接对它进行基准测试呢?很容易测试执行此转换所需的时间,比如在一个循环中执行10000次。至少它让你知道它给CPU带来了多大的压力。检查内存使用情况更为棘手。请注意,由于第二行代码中的
test.ToLower()
,这两行代码可能会产生完全不同的字符串。您是否运行了多次?因为第一个结果很容易由一个或两个上下文切换、分页、JIT JIT或GC GC引起。。。首先尝试
ToTitleCase
。是的,每次都可以观察到差异。试一次(只想确认一次)有趣的。。。我在我的电脑上运行了这个测试,第一次测试得到了大约80个滴答声,第二次测试得到了150个滴答声。不,看起来@ta.speot.is是正确的。我已经试着运行了10k次测试,并且已经看到第一个测试是两次快速的。有一件事错了,你应该把另一个字符串设置得更低。在这些情况下,这将失败。低一点,低一点。作者要求他的第一个字母必须是大写,通过阅读他的代码,这可能是他唯一想要的。因此,将其修改为类似以下内容:char firstChar=char.ToUpper(值[0]);返回firstChar+value.Substring(1);
    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);
    }
4
5

2
4

2
3

2
3 
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;
    }
}