现在我正在接收c#,现在,我正试图找出长列表可能存在的性能问题。因此,当我使用Dictionaries或SortedLists时,我希望得到一些关于速度差异的数据。
这就是我提出这个例子的原因
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Diagnostics;
namespace dictionary_vs_sortedList
{
class Program
{
static void Main(string[] args)
{
long search = 20000;
SortedList<long, string> myList = new SortedList<long, string>();
Dictionary<long, string> myDict = new Dictionary<long, string>();
for (long i = 0; i < 10*search; i++){
myDict.Add(i, "hi");
myList.Add(i, "hey");
}
var watch1 = Stopwatch.StartNew();
if (myDict.ContainsKey(search))
{
Console.WriteLine("is included");
}
watch1.Stop();
TimeSpan ts1 = watch1.Elapsed;
Console.WriteLine(ts1);
var watch2 = Stopwatch.StartNew();
if (myList.ContainsKey(search))
{
Console.WriteLine("is also included");
}
watch2.Stop();
TimeSpan ts2 = watch2.Elapsed;
Console.WriteLine(ts2);
}
}
}
这个输出总是让我的字典运行时间比SortedList长。我认为Contains()和O(1)一起用于字典,而O(n)用于SortedList
修改
感谢您的快速帮助。 关于如何通过我不想测量的代码行来破坏我的测量,我没有注意。 这个问题现在可能会被关闭。
答案 0 :(得分:1)
您不应该只运行一次来测试操作的性能。我在每个检查周围放置了一个for
循环,并进行了1000次迭代(并移除了Console.Write
)并获得了以下结果
Dictionary 00:00:00.0000286 SortedList 00:00:00.0056493
所以结果很明显。
答案 1 :(得分:0)
您的时间测量有几个问题:
*编辑*
SortedList有一个O(log n)操作,而不是O(n),但除此之外。