C# 计算for循环的近似运行时间
我的C#Windows窗体应用程序中有一段代码,如下所示:C# 计算for循环的近似运行时间,c#,for-loop,time,C#,For Loop,Time,我的C#Windows窗体应用程序中有一段代码,如下所示: List<string> RESULT_LIST = new List<string>(); int[] arr = My_LIST.ToArray(); string s = ""; Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < arr.Length; i++) { int counter = i; for (
List<string> RESULT_LIST = new List<string>();
int[] arr = My_LIST.ToArray();
string s = "";
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < arr.Length; i++)
{
int counter = i;
for (int j = 1; j <= arr.Length; j++)
{
counter++;
if (counter == arr.Length)
{
counter = 0;
}
s += arr[counter].ToString();
RESULT_LIST.Add(s);
}
s = "";
}
sw.Stop();
TimeSpan ts = sw.Elapsed;
string elapsedTime = String.Format("{0:00}", ts.TotalMilliseconds * 1000);
MessageBox.Show(elapsedTime);
List RESULT_List=new List();
int[]arr=My_LIST.ToArray();
字符串s=“”;
秒表sw=新秒表();
sw.Start();
对于(int i=0;i 对于(int j=1;j首先,假设您已经检查了算法,并注意到它在数组长度中似乎是二次的。这向我们建议,运行所需的时间应该是形式的函数
t=A+B n+C n2
通过多次使用不同的n值和测量t值运行代码,您已经收集了一些观察结果。这是一个很好的方法
现在的问题是:A、B和C的最佳值是什么,以便它们与您的观察结果紧密匹配
这个问题可以用多种方法来解决;我建议你从回归的最小二乘法开始,看看你是否能得到好的结果。这里有一页是关于它的:
www.efunda.com/math/leastsquares/lstsqr2dcurve.cfm
更新:我刚刚再次查看了您的算法,发现它是立方的,因为在内部循环中有一个二次字符串concat。因此,此技术可能不太有效。我建议您使用StringBuilder
使您的算法成为二次的
现在,假设你事先不知道问题是二次的。那么你怎么确定公式呢?一个好的开始是在对数刻度纸上画出你的点;如果它们大致形成一条直线,那么直线的斜率会给你一个关于多项式幂的线索。如果它们不形成一条直线——嗯,cros首先,假设您已经检查了算法,并注意到它在数组长度中似乎是二次的。这向我们建议,运行所需的时间应该是形式的函数
t=A+B n+C n2
通过多次使用不同的n值和测量t值运行代码,您已经收集了一些观察结果。这是一个很好的方法
现在的问题是:A、B和C的最佳值是什么,以便它们与您的观察结果紧密匹配
这个问题可以用多种方法来解决;我建议你从回归的最小二乘法开始,看看你是否能得到好的结果。这里有一页是关于它的:
www.efunda.com/math/leastsquares/lstsqr2dcurve.cfm
更新:我刚刚再次查看了您的算法,发现它是立方的,因为在内部循环中有一个二次字符串concat。因此,此技术可能不太有效。我建议您使用StringBuilder
使您的算法成为二次的
现在,假设你事先不知道问题是二次的。那么你怎么确定公式呢?一个好的开始是在对数刻度纸上画出你的点;如果它们大致形成一条直线,那么直线的斜率会给你一个关于多项式幂的线索。如果它们不形成一条直线——嗯,cros当你走到那座桥的时候,它就是那座桥。好吧,你要在这里做一些数学题
因为运行的总数正好是n^2次,不是O(n^2),而是n^2次
然后,您可以做的是为处理的项目数量保留一个计数器变量,并使用数学来找出估计值
int numItemProcessed;
int timeElapsed;//read from stop watch
int totalItems = n * n;
int remainingEstimate = ((float) totalItems - numItemProcessed) / numItemProcessed) * timeElapsed
你要在这里做些数学题
因为运行的总数正好是n^2次,不是O(n^2),而是n^2次
然后,您可以做的是为处理的项目数量保留一个计数器变量,并使用数学来找出估计值
int numItemProcessed;
int timeElapsed;//read from stop watch
int totalItems = n * n;
int remainingEstimate = ((float) totalItems - numItemProcessed) / numItemProcessed) * timeElapsed
不要假设算法的时间复杂度一定是N^2
取数字的平均值,在对数图上画出最佳拟合,然后测量梯度。这会让你知道多项式中的最大项。(见维基百科)
一旦你有了这些,你可以做一个最小二乘回归来计算出正确顺序的多项式的系数。这将允许从数据中估计出一个看不见的问题所花费的时间
注意:正如Eric Lippert所说,这取决于您想要测量的内容-平均值可能不适合于您的用例-第一次运行时可能更正确
此方法适用于任何多项式算法。它还将告诉您该算法是否为多项式(非多项式运行时间不会在对数图上给出直线)。不要假设该算法的时间复杂度必须为N^2
取数字的平均值,在对数图上画出最佳拟合,然后测量梯度。这会让你知道多项式中的最大项。(见维基百科)
一旦你有了这些,你可以做一个最小二乘回归来计算出正确顺序的多项式的系数。这将允许从数据中估计出一个看不见的问题所花费的时间
注意:正如Eric Lippert所说,这取决于您想要测量的内容-平均值可能不适合于您的用例-第一次运行时可能更正确
此方法适用于任何多项式算法。它还将告诉您该算法是否为多项式算法(非多项式运行时间不会在对数图上给出直线)。我所知道的代码的复杂性是O(N^2),但运行时间取决于您的系统资源。最后,我认为应该可以找到这种关系。因为您的嵌套循环都使用相同的计数(arr.Length
)那么时间将与这个数字的平方成正比。@DavidG我知道,但是想象一下arr.Length
是2500,运行这个代码需要多少纳秒?你注意到第一次尝试总是比其他两次更长吗?这个模式成立吗?再尝试几次,就可以了