【发布时间】:2017-12-15 15:06:39
【问题描述】:
我的 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);
我使用此代码来获取我的列表中数字的任意组合。我对 My_LIST 的行为就像 recursive 一样。下图非常清楚地展示了我的目的:
我需要做的就是:
制作一个公式来计算这两者的大致运行时间 嵌套的 for 循环猜测任何长度的运行时间并帮助 用户知道他/她必须等待的大概时间。
我使用了这样的 C# 秒表:Stopwatch sw = new Stopwatch(); 显示运行时间,下面是结果(注意,为了减少出错的机会,我重复了计算三每个长度的时间和数字分别表示第一次、第二次和第三次尝试的时间,以 纳秒 为单位。):
-
arr.Length = 400;127838 - 107251 - 100898 -
arr.Length = 800;751282 - 750574 - 739869 -
arr.Length = 1200;2320517 - 2136107 - 2146099 -
arr.Length = 2000;8502631 - 7554743 - 7635173
请注意,My_LIST 中只有 一位数 数字来计时 将数字添加到列表中大致相等。
如何找出arr.Length 与运行时间之间的关系?
【问题讨论】:
-
我只知道你的代码复杂度是 O(N^2),但是运行时间取决于你的系统资源。最后我认为应该可以找出这种关系。
-
由于您的嵌套循环都使用相同的计数 (
arr.Length),因此时间将与该数字的平方成正比。 -
@DavidG 我知道,但想象一下
arr.Length是 2500 运行这段代码需要多少纳秒? -
您是否注意到第一次尝试总是比其他两次要长?这个模式成立吗?多试几次,收集更多数据。如果是这样,那么你有理由相信第一次尝试是非典型的。现在你必须决定我在这里实际测量的是什么。如果您的用户可能会运行一次例程,那么您想要测量首次运行时间。如果他们调用它数千次,那么您可能希望丢弃第一次运行时间。那么它是什么?
-
@fariba.yazdani 是的,我知道,但我不能用它来猜测时间。