测试环境:

  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检索实测的更多相关文章

  1. 数组、链表、Hash(转)

    在程序中,存放指定的数据最常用的数据结构有两种:数组和链表. 数组和链表的区别: 1.数组是将元素在内存中连续存放. 链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起. 2.数组 ...

  2. 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】

    题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...

  3. 深入分析 Linux 内核链表--转

    引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...

  4. In-Memory:Hash Index

    SQL Server 2016支持哈希查找,用户可以在内存优化表(Memory-Optimized Table)上创建Hash Index,使用Hash 查找算法,实现数据的极速查找.在使用上,Has ...

  5. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...

  6. HashMap之Hash碰撞冲突解决方案及未来改进

    说明:参考网上的两篇文章做了简单的总结,以备后查(http://blogread.cn/it/article/7191?f=wb  ,http://it.deepinmind.com/%E6%80%A ...

  7. Java 集合 散列表hash table

    Java 集合 散列表hash table @author ixenos 摘要:hash table用链表数组实现.解决散列表的冲突:开放地址法 和 链地址法(冲突链表方式) hash table 是 ...

  8. linux2.6内核链表

    一.        链表数据结构简介      链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链 ...

  9. Hash的一点测试

    哈希表的学习与测试 以前写的hash都是碰运气的hash,就是乘上质数取模的那种,这样不能保证不碰撞,所以今天先写上几个双hush和链表的hash,并比较一下他们的速度,测试的话用洛谷上的“字符串哈希 ...

随机推荐

  1. KVM地址翻译流程及EPT页表的建立过程

    本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/9284635 ------------------ ...

  2. MyEclipse10.0安装jad反编译插件

    1.下载反编译工具jad(下面提供下载) 将下载下来的jadstar158.zip解压缩,将jad.exe文件放入jdk安装目录下 如:C:\Program Files\Java\jdk1.6.0_2 ...

  3. Java基础知识强化之IO流笔记29:BufferedOutputStream / BufferedInputStream(字节缓冲流)之BufferedInputStream读取数据

    1. BufferedInputStream读取数据 BufferedInputStream构造方法,如下: 构造方法摘要 BufferedInputStream(InputStream in)    ...

  4. Unexpected CFBundleExecutable Key

    昨天晚上打包上传的时候报错: ERROR ITMS-90535: "Unexpected CFBundleExecutable Key. The bundle at 'Payload/xxx ...

  5. Amazon S3 上传文件 SSL23_GET_SERVER_HELLO握手错误

    题外话:今天偶尔来逛逛,发现我真是懒到家了.居然有半年前的留言我都没有来看过,真对不起留言的同学,希望他的问题已经解决了. 这两三天一直被亚马逊S3上传文件的问题困扰着,直到昨天晚上终于搞定了,工作群 ...

  6. 使用passenger在Centos7部署Puma+Nginx+Ruby on Rails

    安装ruby环境 RVM(ruby版本管理工具)安装 gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A170311 ...

  7. SQL语句中格式化时间

    给数据库中的字段格式化(): to_char(CREATETIME,'yyyy-MM-dd') 给程序中的字段格式化(InTime为数据库字段): InTime = to_date( '" ...

  8. C# winform线程的使用 制作提醒休息小程序(长时间计算机工作者必备)

    最近发现日常的工作中,经常因为敲代码而忘记了休息,晚上眼睛特别的累. 并且经常长时间看着显示器,对眼睛一定是不好的,所以今天开发了一个小程序,用于提醒休息. 下面先看看运行效果: 1.程序启动后,后台 ...

  9. javascript 定时器使用

    定时器的使用场合 setInterval() 方法,按照指定的周期(以毫秒记)来调用函数或计算表达式setInterval() 方法会不停的调用函数,知道 clearInterval() 被调用或窗口 ...

  10. (转)PHP获取今天、昨天、明天的日期

    <?php echo "今天:".date("Y-m-d")."<br>"; echo "昨天:".d ...