记录填充 LinkedList 和 Array 所需的时间
Logging the time it takes to fill a LinkedList and Array
这个控制台应用程序有点奇怪但有点有趣,如果它能工作的话。首先,我计算用 4.000.000 个元素和随机数 填充 LinkedList
所需的时间。然后我在 LinkedList
中搜索 100 个随机元素。在这之间,我正在写出填充和查找元素所花费的时间。
之后,我再次尝试做同样的事情,但 Array
。首先填充它,然后寻找 100 个随机元素。然后我对 array
进行排序,以查看在未排序和已排序 array
中查找 100 个随机元素之间的区别。然后再次输入时间。
问题是,在我填充 LinkedList
并找到 LinkedList
中的元素后,我开始用循环填充数组。我得到一个无限循环。真不知道ATM怎么了。
我建议,如果你想帮忙,你可以复制我粘贴到这个问题中的代码,这样你就会明白它应该如何查找程序的所有部分。
代码:
public static bool sokning(int[] a, int b)
{
bool sant = false;
Random rand = new Random();
Stopwatch watchFindArray = new Stopwatch();
Console.Write("Letar efter tal: ");
watchFindArray.Start();
int myint = 0;
for (int iii = 0; iii < a.Length; iii++)
{
b = rand.Next();
Console.Write("#");
myint = Array.BinarySearch(a, b);
if (myint < 0)
{
sant = false;
}
else
{
sant = true;
}
}
watchFindArray.Stop();
if (sant == true)
{
Console.WriteLine("\nFann alla element efter " + watchFindArray.Elapsed.TotalSeconds + " sekunder.");
return true;
}
else
{
return false;
}
}
public static void körMetod()
{
const int MAX = 40000000;
int[] array = new int[MAX];
int hittamig2 = 0;
Random rand2 = new Random();
Stopwatch watchArray = new Stopwatch();
Console.WriteLine("\nStartar Array...");
watchArray.Start();
Console.Write("Position: ");
for (int ii = 0; ii < MAX; ii++)
{
array[ii] = rand2.Next();
if (array.Length % 1000000 == 0)
{
Console.Write("#");
}
}
watchArray.Stop();
Console.WriteLine("\nTid: " + watchArray.Elapsed.TotalSeconds + " sekunder att fylla en array.");
Console.WriteLine("Letar efter tal: ");
bool sant = sokning(array, hittamig2);
Console.WriteLine("Sorterar arrayen.");
Array.Sort(array);
sant = sokning(array, hittamig2);
if (sant == false)
{
Console.WriteLine("\nHittade inte alla element i arrayen.");
Console.ReadLine();
}
else
{
Console.WriteLine("Klar!");
Console.ReadLine();
}
}
static void Main(string[] args)
{
Random rnd = new Random();
const int MAX = 40000000;
LinkedList<int> lankadLista = new LinkedList<int>();
Stopwatch watchLinkedList = new Stopwatch();
Console.WriteLine("Startar LinkedList...");
watchLinkedList.Start();
Console.Write("Position: ");
for (int i = 0; i < MAX; i++)
{
lankadLista.AddLast(rnd.Next());
if (lankadLista.Count() % 1000000 == 0)
{
Console.Write("#");
}
}
watchLinkedList.Stop();
Console.WriteLine("\nTid: " + watchLinkedList.Elapsed.TotalSeconds + " sekunder att fylla en LinkedList.");
Stopwatch watchFindLinkedList = new Stopwatch();
int hittaMig;
Console.Write("Letar efter tal: ");
watchFindLinkedList.Start();
for (int j = 0; j < 100; j++)
{
hittaMig = rnd.Next();
Console.Write("#");
lankadLista.Find(hittaMig);
}
watchFindLinkedList.Stop();
Console.WriteLine("\nFann alla element efter " +
watchFindLinkedList.Elapsed.TotalSeconds + " sekunder.");
Console.ReadLine();
körMetod();
}
此致。
你不是在无限循环中,问题是它下面的代码:
for (int ii = 0; ii < MAX; ii++)
{
array[ii] = rand2.Next();
if (array.Length % 1000000 == 0)
{
Console.Write("#");
}
}
内部条件为 array.Length % 1000000 == 0
,它始终为 true
,因为 array
的大小在您初始化时始终为 40000000:
const int MAX = 40000000;
int[] array = new int[MAX];
当您执行 array[ii] = rand2.Next();
时,您并没有更改数组的长度,您只是将其中一个单元格的值设置为 rand2.Next();
。
这会导致 Console.Write("#");
在 每次迭代中工作 并且还会显着减慢您的循环。
要解决此问题,只需更改:
if (array.Length % 1000000 == 0)
至:
if (ii % 1000000 == 0)
您 不想 添加新项目每次都在数组末尾 因为每次调整数组大小 都会重新分配数组,这非常慢 但是您可以使用Array.Resize
方法(你没有理由这样做)
我认为你在搜索数组的例程中有很大的问题。 (sokning
)
只搜索100个元素的代码在哪里?
看来您正在搜索一个随机生成的数字 4000 万次。仅修复 Console.Write("#") 以在每百万点正确写入是不够的。我认为让你认为有一个无限循环的大延迟是在你的代码中搜索 4000 万个数字数组中的 4000 万个随机生成的数字
当然这不是很"responsive"(同时考虑到你调用了这个方法两次)
public static bool sokning(int[] a, int b)
{
bool sant = false;
Random rand = new Random();
Stopwatch watchFindArray = new Stopwatch();
Console.Write("Letar efter tal: ");
watchFindArray.Start();
int myint = 0;
// Search only 100 numbers like you do in the linked list
for (int iii = 0; iii < 100; iii++)
{
b = rand.Next();
Console.Write("#");
myint = Array.BinarySearch(a, b);
if (myint < 0)
{
sant = false;
}
else
{
sant = true;
}
}
watchFindArray.Stop();
if (sant == true)
{
Console.WriteLine("\nFann alla element efter " + watchFindArray.Elapsed.TotalSeconds + " sekunder.");
return true;
}
else
{
return false;
}
}
还有两个小问题。
为什么要在 sokning
方法中传递变量 b
?原始值从不使用,当您开始循环以搜索随机生成的数字时,b 变量 os 会被覆盖。所以我认为你可以删除它
第二个问题是这个sokning
方法的结果。在每个循环中将 sant
变量设置为 true 或 false。所以最新的循环获胜。换句话说,如果最新的循环找到匹配项,则 return 为真,否则为假。如果之前的某个循环有不同的结果,那么对于 sokning
.
的调用者来说完全是 lost
这个控制台应用程序有点奇怪但有点有趣,如果它能工作的话。首先,我计算用 4.000.000 个元素和随机数 填充 LinkedList
所需的时间。然后我在 LinkedList
中搜索 100 个随机元素。在这之间,我正在写出填充和查找元素所花费的时间。
之后,我再次尝试做同样的事情,但 Array
。首先填充它,然后寻找 100 个随机元素。然后我对 array
进行排序,以查看在未排序和已排序 array
中查找 100 个随机元素之间的区别。然后再次输入时间。
问题是,在我填充 LinkedList
并找到 LinkedList
中的元素后,我开始用循环填充数组。我得到一个无限循环。真不知道ATM怎么了。
我建议,如果你想帮忙,你可以复制我粘贴到这个问题中的代码,这样你就会明白它应该如何查找程序的所有部分。
代码:
public static bool sokning(int[] a, int b)
{
bool sant = false;
Random rand = new Random();
Stopwatch watchFindArray = new Stopwatch();
Console.Write("Letar efter tal: ");
watchFindArray.Start();
int myint = 0;
for (int iii = 0; iii < a.Length; iii++)
{
b = rand.Next();
Console.Write("#");
myint = Array.BinarySearch(a, b);
if (myint < 0)
{
sant = false;
}
else
{
sant = true;
}
}
watchFindArray.Stop();
if (sant == true)
{
Console.WriteLine("\nFann alla element efter " + watchFindArray.Elapsed.TotalSeconds + " sekunder.");
return true;
}
else
{
return false;
}
}
public static void körMetod()
{
const int MAX = 40000000;
int[] array = new int[MAX];
int hittamig2 = 0;
Random rand2 = new Random();
Stopwatch watchArray = new Stopwatch();
Console.WriteLine("\nStartar Array...");
watchArray.Start();
Console.Write("Position: ");
for (int ii = 0; ii < MAX; ii++)
{
array[ii] = rand2.Next();
if (array.Length % 1000000 == 0)
{
Console.Write("#");
}
}
watchArray.Stop();
Console.WriteLine("\nTid: " + watchArray.Elapsed.TotalSeconds + " sekunder att fylla en array.");
Console.WriteLine("Letar efter tal: ");
bool sant = sokning(array, hittamig2);
Console.WriteLine("Sorterar arrayen.");
Array.Sort(array);
sant = sokning(array, hittamig2);
if (sant == false)
{
Console.WriteLine("\nHittade inte alla element i arrayen.");
Console.ReadLine();
}
else
{
Console.WriteLine("Klar!");
Console.ReadLine();
}
}
static void Main(string[] args)
{
Random rnd = new Random();
const int MAX = 40000000;
LinkedList<int> lankadLista = new LinkedList<int>();
Stopwatch watchLinkedList = new Stopwatch();
Console.WriteLine("Startar LinkedList...");
watchLinkedList.Start();
Console.Write("Position: ");
for (int i = 0; i < MAX; i++)
{
lankadLista.AddLast(rnd.Next());
if (lankadLista.Count() % 1000000 == 0)
{
Console.Write("#");
}
}
watchLinkedList.Stop();
Console.WriteLine("\nTid: " + watchLinkedList.Elapsed.TotalSeconds + " sekunder att fylla en LinkedList.");
Stopwatch watchFindLinkedList = new Stopwatch();
int hittaMig;
Console.Write("Letar efter tal: ");
watchFindLinkedList.Start();
for (int j = 0; j < 100; j++)
{
hittaMig = rnd.Next();
Console.Write("#");
lankadLista.Find(hittaMig);
}
watchFindLinkedList.Stop();
Console.WriteLine("\nFann alla element efter " +
watchFindLinkedList.Elapsed.TotalSeconds + " sekunder.");
Console.ReadLine();
körMetod();
}
此致。
你不是在无限循环中,问题是它下面的代码:
for (int ii = 0; ii < MAX; ii++)
{
array[ii] = rand2.Next();
if (array.Length % 1000000 == 0)
{
Console.Write("#");
}
}
内部条件为 array.Length % 1000000 == 0
,它始终为 true
,因为 array
的大小在您初始化时始终为 40000000:
const int MAX = 40000000;
int[] array = new int[MAX];
当您执行 array[ii] = rand2.Next();
时,您并没有更改数组的长度,您只是将其中一个单元格的值设置为 rand2.Next();
。
这会导致 Console.Write("#");
在 每次迭代中工作 并且还会显着减慢您的循环。
要解决此问题,只需更改:
if (array.Length % 1000000 == 0)
至:
if (ii % 1000000 == 0)
您 不想 添加新项目每次都在数组末尾 因为每次调整数组大小 都会重新分配数组,这非常慢 但是您可以使用Array.Resize
方法(你没有理由这样做)
我认为你在搜索数组的例程中有很大的问题。 (sokning
)
只搜索100个元素的代码在哪里?
看来您正在搜索一个随机生成的数字 4000 万次。仅修复 Console.Write("#") 以在每百万点正确写入是不够的。我认为让你认为有一个无限循环的大延迟是在你的代码中搜索 4000 万个数字数组中的 4000 万个随机生成的数字
当然这不是很"responsive"(同时考虑到你调用了这个方法两次)
public static bool sokning(int[] a, int b)
{
bool sant = false;
Random rand = new Random();
Stopwatch watchFindArray = new Stopwatch();
Console.Write("Letar efter tal: ");
watchFindArray.Start();
int myint = 0;
// Search only 100 numbers like you do in the linked list
for (int iii = 0; iii < 100; iii++)
{
b = rand.Next();
Console.Write("#");
myint = Array.BinarySearch(a, b);
if (myint < 0)
{
sant = false;
}
else
{
sant = true;
}
}
watchFindArray.Stop();
if (sant == true)
{
Console.WriteLine("\nFann alla element efter " + watchFindArray.Elapsed.TotalSeconds + " sekunder.");
return true;
}
else
{
return false;
}
}
还有两个小问题。
为什么要在 sokning
方法中传递变量 b
?原始值从不使用,当您开始循环以搜索随机生成的数字时,b 变量 os 会被覆盖。所以我认为你可以删除它
第二个问题是这个sokning
方法的结果。在每个循环中将 sant
变量设置为 true 或 false。所以最新的循环获胜。换句话说,如果最新的循环找到匹配项,则 return 为真,否则为假。如果之前的某个循环有不同的结果,那么对于 sokning
.