在Visual Studio中提高函数性能和速度

时间:2014-03-17 15:14:27

标签: c# performance visual-studio

我必须创建一个接收一行数字的函数,并返回重复两次的数字。 该行必须始终符合这些规则:

  • 数字必须用逗号行分隔,只包含两个相同的
  • 数字,其他数字是唯一的。

行示例:“1,2,3,4,5,6,7,7”,“10,10,12,15”,“1,1,7,8,15”等。

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string q1 = "6,8,7,3,2,5,6";
            Console.WriteLine(my_funct(q1));
        }
        static int my_funct(string q)
        {
            string[] numbers = q.Split(',');
            List<string> numbers2 = new List<string>();
            int border = numbers.Count();
            for (int i = 0; i < border; i++)
            {
                if (numbers2.Contains(numbers[i]))
                {
                    return Convert.ToInt32(numbers[i]);
                }
                else numbers2.Add(numbers[i]);
            }
            return -1;
        }
    }
}

我希望此功能尽可能快地执行以获得最佳性能?我应该在代码中更改什么,我应该使用哪些其他方法来管理它?

3 个答案:

答案 0 :(得分:1)

你有10%的时间花在一次性Convert.ToInt32上,我会说你在这个功能上浪费时间。

作为旁注,如果我们不确切地知道Convert.ToInt32做了什么来感受这些数字,那么整个图像将完全没有价值。执行计数,线上花费的绝对时间(挂钟时间)等,这些都是真实的指标。

编辑:为了好玩,这里有一个替换你的功能,实际编译,并不是一堆乱重的字符串比较和临时列表:

    var s = "9;6,8,7,3,2,5,6,1,4";
    var res = s.Substring(s.IndexOf(';') + 1).Split(',')      // tokenize the list
        .Take(int.Parse(s.Substring(0, s.IndexOf(';'))))      // limit by the first number (it crashes in your case btw if there's no duplicate)
        .Select(i => int.Parse(i))                            // transform to numbers
        .GroupBy(i => i).Where(grp => grp.Count() > 1).Select(grp => grp.Key) // only takes into account repeated numbers
        .DefaultIfEmpty(-1).First();                          // -1 if nothing, otherwise first number
    Console.WriteLine(res);       // 6 in your case

答案 1 :(得分:1)

是否有必要更改代码,直到所有行都显示为暗红色以获得最佳性能?

没有。想一想。您可以通过让所有行同时执行来使所有行都具有相同的颜色。一种方法是使浅红色线变慢,这可能不是你想要做的。

发红程度与该行所用总时间的比例成正比。在大多数代码中,将存在从白色(即无红色)到深红色的变化;这不是有任何错误的症状。红色并不表示它只表示相对时间的不良。

当然,确定一条线是最慢,最红的,在调查加快速度的方法时可能值得你这么做。当你下次分析代码时,为此做好准备,导致另一条线变得最红。

答案 2 :(得分:1)

当您无法找到更快速的方法时,您的代码就会尽可能快地完成。 它与颜色无关。

分析器可以做的就是让您大致了解代码占用了多长时间的代码。 如果一段代码占50%的时间,那么如果你能找到消除它的方法,你可以节省50%,或者不管百分比是多少。 如果绝对有必要做那个代码,那就一定是。

不要只看“自我时间”。特别是随着程序变得越来越大,它们的调用堆栈越来越深,并且通过执行可以摆脱的调用来浪费时间也同样容易。 如果是这样,那么在浪费的时间内这些调用将在堆栈中,因此查看“包容时间”非常重要。

小心所谓的“CPU-profilers”。 他们假设如果你正在做任何I / O,这是不可避免的,所以他们忽略它。 事实上,你可能正在做你不知道的I / O,如果你这样做,你会知道可以避免。 这可能是巨大的性能消耗。

这就是我使用this method的原因。 它以线级分辨率自动处理包容性和I / O时间。 它没有准确地测量时间。 相反,它粗略地测量时间,但准确地定位问题。