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

本文关键字:性能 速度 函数 Visual Studio 提高 | 更新日期: 2023-09-27 17:50:42

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

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

行示例:"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;
        }
    }
}

我希望这个函数尽可能快地执行以获得最大的性能?我应该在代码中改变什么,我应该使用哪些其他方法来管理它?

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

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

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

。想想看。你可以让所有的线都用相同的颜色,通过让它们都用相同的时间来执行。一种方法是使非常浅的红色线变慢,这可能不是你想要做的。

发红的程度与线条所花费的总时间的比例成正比。在大多数代码中,会有从白色(即没有红色)到暗红色的变化;这并不是有什么问题的征兆。红色不表示坏,它只表示相对时间。

当然,确定了一行是最慢的,最红的,可能值得你去研究如何使它更快。当您下次配置代码时,请准备好另一行变成最红的。

当你找不到更快的方法时,你的代码会尽可能快。这与颜色无关。

分析器所能做的就是给你一个大致的概念,什么代码占用了多少时间。如果一段代码占用了50%的时间,那么如果你能找到一种消除它的方法,你就能节省50%的时间,或者不管这个百分比是多少。如果这段代码是绝对必要的,那么它就是。

不要只看"自我时间"。特别是当程序变得更大时,它们的调用堆栈会变得更深,并且很容易通过执行您可以摆脱的调用来浪费时间。如果是这样,那么在浪费的时间内,这些调用将在堆栈上,因此查看"包含时间"是很重要的。

小心所谓的"cpu分析器"。它们假设如果您正在进行任何I/O操作,这是不可避免的,因此它们忽略了它。实际上,您可能正在进行您不知道的I/O操作,如果您知道,您就会知道它是可以避免的。这可能是一个巨大的性能消耗。

这就是为什么我使用这个方法。它以行级分辨率自动处理包含时间和I/O时间。它不能精确地测量时间。相反,它粗略地测量时间,但精确地定位问题。