提高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;
}
}
}
我希望这个函数尽可能快地执行以获得最大的性能?我应该在代码中改变什么,我应该使用哪些其他方法来管理它?
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时间。它不能精确地测量时间。相反,它粗略地测量时间,但精确地定位问题。