链表与Hash检索实测
测试环境:
Win7 SP1、8G内存、3.4GHz 4核
测试代码:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Reflection;
- using System.Diagnostics;
- namespace FactoryMode
- {
- public class TestObject
- {
- public string memberString { get; set; }
- public long memberBigInt { get; set; }
- }
- [Serializable]
- public class Program : MarshalByRefObject
- {
- static long TotalCount = ;
- static long FisrtLv = ;
- static long SecondLv = ;
- static long ThirdLv = ;
- static void Main(string[] args)
- {
- //链表测试资源准备
- var ObjectList = new List<TestObject>();
- for (int i = ; i < TotalCount; i++)
- {
- var newTestObject = new TestObject();
- newTestObject.memberString = i.ToString();
- newTestObject.memberBigInt = i;
- ObjectList.Add(newTestObject);
- }
- //查找1
- var stopWatch1 = Stopwatch.StartNew();
- var result1 = ObjectList.Find(p => p.memberBigInt == SecondLv);
- var lastElapsedTime1 = stopWatch1.ElapsedMilliseconds;
- Console.WriteLine("Condition 1: {0} ms.", lastElapsedTime1);
- Console.WriteLine("result1: {0}.", result1.memberString);
- //字典测试资源准备
- var ObjectDictionary = new Dictionary<string, TestObject>();
- for (int i = ; i < TotalCount; i++)
- {
- var newTestObject = new TestObject();
- newTestObject.memberString = i.ToString();
- newTestObject.memberBigInt = i;
- ObjectDictionary.Add(newTestObject.memberString, newTestObject);
- }
- //查找2
- var stopWatch2 = Stopwatch.StartNew();
- var result2 = ObjectDictionary[Convert.ToString(ThirdLv)];
- var lastElapsedTime2 = stopWatch2.ElapsedMilliseconds;
- Console.WriteLine("Condition 2: {0} ms.", lastElapsedTime2);
- Console.WriteLine("result2: {0}.", result2.memberString);
- Console.Read();
- }
- }
- }
测试结果:
链表检索:每50w 12ms;
Hash检索:0ms;
测试代码2:
- //写入1
- var stopWatch3 = Stopwatch.StartNew();
- for (int i = ; i < FisrtLv; i++)
- {
- ObjectList[i].memberBigInt += ;
- }
- var lastElapsedTime3 = stopWatch3.ElapsedMilliseconds;
- Console.WriteLine("Condition 3: {0} ms.", lastElapsedTime3);
- //写入2
- var stopWatch4 = Stopwatch.StartNew();
- for (int i = ; i < FisrtLv; i++)
- {
- ObjectDictionary[Convert.ToString(i)].memberBigInt += ;
- }
- var lastElapsedTime4 = stopWatch4.ElapsedMilliseconds;
- Console.WriteLine("Condition 4: {0} ms.", lastElapsedTime4);
测试结果2:
链表写入:12ms;
Hash写入:143ms;(根据散列函数得到了新的存储位置,数据转移开销)
技术参考:http://blog.sina.com.cn/s/blog_7880b6e30100xi94.html。
注意点:
虽然Hash具有O(1)的数据检索效率,但它空间开销却通常很大,是以空间换取时间,所以Hashtable适用于读取操作频繁,写入操作很少的操作类型。
引申思考:
在实际的应用中,应避免将所有的常用、不常用的数据都放在同一个数据结构中,无论是使用自定义的内存结构或者是redis,都应该定时将过期数据放入二级缓存,为一级缓存瘦身。
在游戏服务器应用中,一个服务器应将数据分为内存数据、冷备数据,登陆时将冷备数据加载至内存(登陆较慢可容忍),单服热数据容量一般不会超过5w级别,数据结构的性能可接受。
在之前一个http短连接项目的应用中,每次协议都直接从redis读取数据,处理完毕之后写入redis,但是 redis 实际上没有冷数据,这样随着运行时间的推移,效率会越来越低。
链表与Hash检索实测的更多相关文章
- 数组、链表、Hash(转)
在程序中,存放指定的数据最常用的数据结构有两种:数组和链表. 数组和链表的区别: 1.数组是将元素在内存中连续存放. 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起. 2.数组 ...
- 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- In-Memory:Hash Index
SQL Server 2016支持哈希查找,用户可以在内存优化表(Memory-Optimized Table)上创建Hash Index,使用Hash 查找算法,实现数据的极速查找.在使用上,Has ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- HashMap之Hash碰撞冲突解决方案及未来改进
说明:参考网上的两篇文章做了简单的总结,以备后查(http://blogread.cn/it/article/7191?f=wb ,http://it.deepinmind.com/%E6%80%A ...
- Java 集合 散列表hash table
Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...
- linux2.6内核链表
一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链 ...
- Hash的一点测试
哈希表的学习与测试 以前写的hash都是碰运气的hash,就是乘上质数取模的那种,这样不能保证不碰撞,所以今天先写上几个双hush和链表的hash,并比较一下他们的速度,测试的话用洛谷上的“字符串哈希 ...
随机推荐
- ibatis 开发中的经验 (一)ibatis 和hibernate 在开发中的理解
这个项目的底层是用ibatis框架完毕,这几天也是都在用这个框架写代码,也有了一些简单的理解,把项目拿过来后基本的配置都已经配置好了,比方一些事务.日志控制等,在开发中主要用到的是写SQL语句以及熟悉 ...
- [Webpack 2] Tree shaking with Webpack 2
The less code you can send to the browser, the better. The concept of tree shaking basically says th ...
- HDU2149-Good Luck in CET-4 Everybody!(博弈,打表找规律)
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- memcpy的使用方法总结
1.memcpy 函数用于 把资源内存(src所指向的内存区域) 复制到目标内存(dest所指向的内存区域):拷贝多少个?有一个size变量控制拷贝的字节数:函数原型:void *memcpy(voi ...
- mybatis0201 01复习
mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架(因为mybatis提供输入和输出的映射,需要程序员自己写sql语句) ...
- QT皮肤系统的动态切换
应用需求: 提供皮肤切换选项,在不重启应用程序的情况下实现皮肤的动态切换. 理论基础: 1) 图片资源是如何被利用的 这里先简要说明一下实现原理,皮肤的动态切换其关键在于图片资源的加载方式.QT中每个 ...
- Director Scene Layer and Sprite
Scenes Director Layers Multiple Layers Example: Sprites References Scenes A scene (implemented with ...
- java String的比较,BOX装箱拆箱,以及面向对象的小代码
package cn.hncu.day2; public class StringDemo { public static void main(String[] args) { String str1 ...
- CentOS7添加第三方源
CentOS由于很追求稳定性,所以官方源中自带的软件不多,因而需要一些第三方源,比如EPEL.ATrpms.ELRepo.Nux Dextop.RepoForge等. EPEL EPEL即Extra ...
- WPF--ComboBox数据绑定
WPF--ComboBox数据绑定 0-在ComboBox中显示图片: <ComboBox Height="33" HorizontalAlignment="Rig ...