【问题标题】:Performance using standard C# /.net classes and methods [closed]使用标准 C# /.net 类和方法的性能 [关闭]
【发布时间】:2012-08-31 11:39:00
【问题描述】:

如果您能提供意见,我想了解 在下面的代码中,这是使用 .net 的性能问题的最简单示例 内置方法.. 在线教程强烈推荐它们...

    public void stringFormatVsConcatShowResults()
    {
        float timeFormat = 0, timeConcat = 0;
                for (int counter = 0; counter < 10; i++)
                {

                    if (counter % 2 == 0)
                         timeFormat += TestStrFormat(1000000, true);
                    else timeConcat += TestStrFormat(1000000);

                }


                if (timeFormat > timeConcat)
                {
                    float precWonBy = (timeConcat / timeFormat) * 100;
                    int prcfractionalPart = new Version(precWonBy.ToString()).Major;
                    MessageBox.Show("The fstest (by " + prcfractionalPart + " %)is Concat");
                }
                else
                {

                    float precWonBy = (timeConcat / timeFormat) * 100;
                    int precfractionalPart = new Version(precWonBy.ToString()).Major;
                    MessageBox.Show("The fstest (by" + precfractionalPart + " %)is string.Format()");
                }
        }


    public int TestStrFormat(int iterate, bool WstringFormat=false)
    {
        string testStr = string.Empty, Enewline = Environment.NewLine;
        const string header = "its iteration No': ", sign = " !";
        Stopwatch swStrFrm = new Stopwatch();
        swStrFrm.Start();
        if (WstringFormat)
        {

            for (int counter = 0; counter < iterate; i++)
            {
                testStr = string.Format("--{0}{1}{2}--{3}", header, counter, sign, Enewline);
            }

        }
        else
        {
                for (int counter = 0; counter < iterate; i++)
                {
                    testStr = "--its iteration No': " + counter + " !--" + Enewline ;
                }

        }
        swStrFrm.Stop();
        return Convert.ToInt32(swStrFrm.ElapsedTicks);
    }

你会选择什么,你有没有注意到这个性能问题,

这只是一个简单的例子,

有很多方法,例如将屏幕捕获到位图并将图像转换为字节[]...

因为我是软件开发新手(4 个月 - 自学) 我在多个路口都遇到过这种情况,我需要去哪里,那么我该如何选择使用什么方法呢?... 当我选择在我的应用程序中获得最大性能或者它的(C#)意图不是从性能开始时,我是否会成为 .net 的叛徒。

只需致电stringFormatVsConcatShowResults() 并亲自了解我在说什么

  • 重新编辑

所以用长字符串之后说我会做以下事情:

    public int TestStrWStrBld(int iterate)
    {
        StringBuilder sb = new StringBuilder();

        const string header = "its iteration No': ", sign = " !";

        Stopwatch swStrFrm = new Stopwatch();
        swStrFrm.Start();


            for (int i = 0; i < iterate; i++)
            {
                sb.Append(header).Append(i).Append(sign).Append(Environment.NewLine);
            }


        swStrFrm.Stop();
        return Convert.ToInt32(swStrFrm.ElapsedTicks);
    }

现在 StringBuilder 让它快了 600% 以上

感谢您打开我的思路,从现在开始......我将继续寻找正确的实现。

  • 重新编辑2 或对于较小的字符串:与字符串相比

Str = "a" + "b" + "c";

下面的速度甚至快了 800%!

    public int TestStrWStrBld(int iterate)
    {
        StringBuilder sb = new StringBuilder();

        const string header = "its iteration No': ", sign = " !";
        string str = string.Empty;
        Stopwatch swStrFrm = new Stopwatch();
        swStrFrm.Start();


            for (int i = 0; i < iterate; i++)
            {
                str= String.Concat(header, i.ToString(), sign,Environment.NewLine);

            }


        swStrFrm.Stop();
        return Convert.ToInt32(swStrFrm.ElapsedTicks);
    }

所以我想正确的方法是使用 String.Concat(string1, string2, etc...)

【问题讨论】:

    标签: c# .net performance-testing base-class


    【解决方案1】:

    我在多个路口都遇到过这些情况,我需要决定怎么走

    我猜你的问题是“我该如何选择使用什么方法?”...

    虽然String.Concat 在这种情况下更快(在我的机器上,在 x64 构建中大约快 75%),但在这种情况下,我怀疑任何一个选项都会充分发挥。在实际场景中,像这样构建 single 字符串不太可能成为性能瓶颈。如果您正在构建大字符串,那么StringBuilder 可能是比这两个更好的选择...

    我会根据可读性和可维护性来决定使用框架中的哪种方法。稍后,当您分析您的应用程序时,如果您发现问题,很容易决定在那个时间点如何调整它。

    【讨论】:

      【解决方案2】:

      我很惊讶教程没有告诉你这样做:

      for (int counter = 0; counter < iterate; i++)
                  {
                      testStr = new StringBuilder().Append("--its iteration No': ").Append(counter).Append(" !--").Append(Environment.NewLine).toString();
                  }
      

      【讨论】:

      • 嗯,实际上会慢一些。也就是说,几乎可以肯定,所有这些性能都足以满足任何实际的性能要求。
      猜你喜欢
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2012-09-24
      • 2016-06-24
      • 2010-11-11
      • 1970-01-01
      相关资源
      最近更新 更多