首页 > 代码库 > C# 小规模查找集合性能测试
C# 小规模查找集合性能测试
项目中包含浮点运算,大概每秒 20 - 100 万左右. 其计算结果每秒只包含1000个左右。 因此大量运算是重复性的。程序运行时,cpu 在 3% - 10% 浮动。打算将结果缓存。根据键值索值。
目前考虑数据类型有: SortedList , SortedDictionary , Dictionary , List 。测试结果如下:
代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Program { static System.Random random = new Random(); static void Main(string[] args) { System.Threading.Thread.Sleep(1000); System.Drawing.PointF[] p = new System.Drawing.PointF[1024]; for (int i = 0; i < 1024; i++) { p[i] = new System.Drawing.PointF((float)random.NextDouble(), (float)random.NextDouble()); } double[] find = new double[10]; find[0] = p[10].X; find[1] = p[800].X; find[2] = p[200].X; find[3] = p[199].X; find[4] = p[485].X; find[5] = p[874].X; find[6] = p[912].X; find[7] = p[110].X; find[8] = p[12].X; find[9] = p[600].X; testSortList(p, find); Console.WriteLine(); testSortedDictionary(p, find); Console.WriteLine(); testDictionary(p, find); Console.WriteLine(); testList(p, find); Console.Read(); } static void testSortList(System.Drawing.PointF [] p , double [] find) { SortedList<double, double> s = new SortedList<double, double>(1024); System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); foreach (System.Drawing.PointF sp in p) { s.Add(sp.X, sp.Y); } stopWatch.Stop(); Console.WriteLine("SortedList add:" + stopWatch.ElapsedTicks); stopWatch.Reset(); stopWatch.Start(); foreach (double d in find) { Console.WriteLine(s.ContainsKey(d)); } stopWatch.Stop(); Console.WriteLine("SortedList find:" + stopWatch.ElapsedTicks); } static void testSortedDictionary(System.Drawing.PointF[] p, double[] find) { SortedDictionary<double, double> s = new SortedDictionary<double, double>(); System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); foreach (System.Drawing.PointF sp in p) { s.Add(sp.X, sp.Y); } stopWatch.Stop(); Console.WriteLine("SortedDictionary add:" + stopWatch.ElapsedTicks); stopWatch.Reset(); stopWatch.Start(); foreach (double d in find) { Console.WriteLine(s.ContainsKey(d)); } stopWatch.Stop(); Console.WriteLine("SortedDictionary find:" + stopWatch.ElapsedTicks); } static void testDictionary(System.Drawing.PointF[] p, double[] find) { Dictionary<double, double> s = new Dictionary<double, double>(1024); System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); foreach (System.Drawing.PointF sp in p) { s.Add(sp.X, sp.Y); } stopWatch.Stop(); Console.WriteLine("Dictionary add:" + stopWatch.ElapsedTicks); stopWatch.Reset(); stopWatch.Start(); foreach (double d in find) { Console.WriteLine(s.ContainsKey(d)); } stopWatch.Stop(); Console.WriteLine("Dictionary find:" + stopWatch.ElapsedTicks); } static void testList(System.Drawing.PointF[] p, double[] find) { List<System.Drawing.PointF> lst = new List<System.Drawing.PointF>(); System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); foreach (System.Drawing.PointF sp in p) { lst.Add(sp); } stopWatch.Stop(); Console.WriteLine("List add:" + stopWatch.ElapsedTicks); stopWatch.Reset(); stopWatch.Start(); System.Drawing.PointF p2; bool bln = false ; foreach (double d in find) { p2 = lst.Find(new Predicate<System.Drawing.PointF>((p1) => { return p1.X == d; })); //foreach (System.Drawing.PointF p1 in lst) //{ // if (p1.X == d) // { // bln = true; // break; // } //} //for (int i = 0; i < lst.Count; i++ ) //{ // if (lst[i].X == d) // { // bln = true; // break; // } //} if (bln) { Console.WriteLine("True"); bln = false; } else { Console.WriteLine("False"); } } stopWatch.Stop(); Console.WriteLine("List find:" + stopWatch.ElapsedTicks); } }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。