我必须创建一个接收一行数字的函数,并返回重复两次的数字。 该行必须始终符合这些规则:
行示例:“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;
}
}
}
我希望此功能尽可能快地执行以获得最佳性能?我应该在代码中更改什么,我应该使用哪些其他方法来管理它?
答案 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时间。 它没有准确地测量时间。 相反,它粗略地测量时间,但准确地定位问题。