Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算for循环的近似运行时间_C#_For Loop_Time - Fatal编程技术网

C# 计算for循环的近似运行时间

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 (

我的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 (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,运行这个代码需要多少纳秒?你注意到第一次尝试总是比其他两次更长吗?这个模式成立吗?再尝试几次,就可以了