.NET ez 2012-06-04
首先測試索引查詢及內容查詢,所需的時間差距。
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace Test
{
class Program
{
static Dictionary<string, string> D = new Dictionary<string, string>();
/// <summary>
/// 產生測試資料
/// </summary>
static void testdata()
{
int num = 1000000, x = 0;
D.Clear();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < num; i ++)
{
x++;
D.Add((i * 2).ToString(), (i * 2).ToString());
}
sw.Stop();
Console.WriteLine("產生資料" + num + "筆\t時間:" + sw.ElapsedMilliseconds.ToString());
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
//產生測試資料
testdata();
//搜尋索引值
{
sw.Reset();
int num = 1000000;
sw.Start();
for (int i = 0; i < num; i++)
{
if (D.ContainsKey(i.ToString())) { }
}
sw.Stop();
Console.WriteLine("搜尋索引" + num + "筆\t時間:" + sw.ElapsedMilliseconds.ToString());
}
//搜尋內容
{
sw.Reset();
int num = 1000;
sw.Start();
for (int i = 0; i < num; i++)
{
if (D.ContainsValue(i.ToString())) { }
}
sw.Stop();
Console.WriteLine("搜尋內容" + num + "筆\t\t時間:" + sw.ElapsedMilliseconds.ToString());
}
Console.ReadLine();
}
}
}可以發現,搜尋索引 及 內容查詢 差距非常的大,所以建議非必要不要使用內容查詢!
接下來測試,當遇到新增項目需求時,利用:
- 直接新增項目,加上try catch排除例外錯誤
- 利用ContainsKey先判斷是否存在,再新增項目
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace Test
{
class Program
{
static Dictionary<string, string> D = new Dictionary<string, string>();
/// <summary>
/// 產生測試資料
/// </summary>
static void testdata()
{
int num = 1000000, x = 0;
D.Clear();
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < num; i ++)
{
x++;
D.Add((i * 2).ToString(), (i * 2).ToString());
}
sw.Stop();
Console.WriteLine("產生資料" + num + "筆\t時間:" + sw.ElapsedMilliseconds.ToString());
}
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
//產生測試資料
testdata();
//未判斷是否存在索引,直接新增索引
{
sw.Reset();
int num = 10000;
sw.Start();
for (int i = 0; i < num; i++)
{
try
{
D.Add(i.ToString(), i.ToString());
}
catch { }
}
sw.Stop();
Console.WriteLine("未判斷是否存在索引,直接新增索引" + num + "筆\t時間:" + sw.ElapsedMilliseconds.ToString());
}
Console.WriteLine("\r\n\r\n");
//產生測試資料
testdata();
//先判斷是否存在索引,再新增索引
{
sw.Reset();
int num = 10000;
sw.Start();
for (int i = 0; i < num; i++)
{
if (!D.ContainsKey(i.ToString())) D.Add(i.ToString(), i.ToString());
}
sw.Stop();
Console.WriteLine("先判斷是否存在索引,再新增索引" + num + "筆\t時間:" + sw.ElapsedMilliseconds.ToString());
}
Console.WriteLine("\r\n\r\n");
Console.ReadLine();
}
}
}可以發現,使用ContainsKey優於直接新增方法,所以以後記得先判斷是否存在再新增項目!
標籤: .NET
本文章網址:
https://www.ez2o.com/Blog/Post/csharp-Dictionary-Performance-Test
https://www.ez2o.com/Blog/Post/60
https://www.ez2o.com/Blog/Post/csharp-Dictionary-Performance-Test
https://www.ez2o.com/Blog/Post/60
