- 浏览: 940299 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
SINCE1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与BeanUtils
读ruby hacking guide,其中专门辟了一个章节介绍了st.c中的st_table,这个数据结构也就是类似java中的HashMap,基本原理是利用数组存储,数组的每一个元素是一个单向链表,链表中再存储具体的元素,如下图所示的结构
ruby中利用这个结构来存储对象变量、类方法、常量、全局变量等信息,在c ruby中,方法、变量都是用一个整型作为键值来存储在st_table中,因此这个数据结构对于以整性为键的map类型来说速度非常不错(我没有测试内存的占用情况)。
源码如下:
链表元素类:
完整的StTable实现,没有实现remove,有兴趣的话自己实现一下:
单元测试类就不列了,给一个与HashMap的简单性能对比,以整型为键,显然StTable快多了,对于字符串型,关键是HashFunction的定义,我直接调用String的hashCode方法,不知道有没有其他更好的方法让元素分布的更均匀些:
结果为:
result:49995000
map:55501468
result:49995000
table:60999652
map is faster than table
result:49995000
map:44634444
result:49995000
table:26209477
table is faster than map
ruby中利用这个结构来存储对象变量、类方法、常量、全局变量等信息,在c ruby中,方法、变量都是用一个整型作为键值来存储在st_table中,因此这个数据结构对于以整性为键的map类型来说速度非常不错(我没有测试内存的占用情况)。
源码如下:
java 代码
- //接口,用于定义hash函数
- //HashFunction.java
- public interface HashFunction<T> {
- public int hash(T key);
- }
链表元素类:
java 代码
- public class StTableEntry<T, V> {
- protected int hash; //hash值
- protected T key; //键
- protected V value; //存储值
- protected StTableEntry<T, V> next; //下一节点
- public StTableEntry() {
- }
- public StTableEntry(int hash, T key, V value, StTableEntry<T, V> next) {
- super();
- this.hash = hash;
- this.key = key;
- this.value = value;
- this.next = next;
- }
- public int getHash() {
- return hash;
- }
- public void setHash(int hash) {
- this.hash = hash;
- }
- public T getKey() {
- return key;
- }
- public void setKey(T key) {
- this.key = key;
- }
- public StTableEntry<T, V> getNext() {
- return next;
- }
- public void setNext(StTableEntry<T, V> next) {
- this.next = next;
- }
- public V getValue() {
- return value;
- }
- public void setValue(V value) {
- this.value = value;
- }
- }
完整的StTable实现,没有实现remove,有兴趣的话自己实现一下:
java 代码
- public final class StTable<T, V> {
- private HashFunction<T> hashFunction;
- private int num_bins;
- int num_entries;
- StTableEntry<T, V>[] bins;
- public static int DEFAULT_SIZE = 10;
- private static int DEFAULT_MAX_DENSITY = 5;
- private static int DEFAULT_MIN_SIZE = 8;
- private static long primes[] = { 8 + 3, 16 + 3, 32 + 5, 64 + 3, 128 + 3,
- 256 + 27, 512 + 9, 1024 + 9, 2048 + 5, 4096 + 3, 8192 + 27,
- 16384 + 43, 32768 + 3, 65536 + 45, 131072 + 29, 262144 + 3,
- 524288 + 21, 1048576 + 7, 2097152 + 17, 4194304 + 15, 8388608 + 9,
- 16777216 + 43, 33554432 + 35, 67108864 + 15, 134217728 + 29,
- 268435456 + 3, 536870912 + 11, 1073741824 + 85, 0 };
- public StTable(HashFunction<T> hashFunction) {
- this.hashFunction = hashFunction;
- this.num_bins = DEFAULT_SIZE;
- this.num_entries = 0;
- this.bins = (StTableEntry<T, V>[]) new StTableEntry[this.num_bins];
- }
- public StTable(HashFunction<T> hashFunction, int size) {
- this.hashFunction = hashFunction;
- if (size == 0)
- throw new IllegalArgumentException(
- "The size could not less than zero:" + size);
- this.num_bins = size;
- this.num_entries = 0;
- this.bins = (StTableEntry<T, V>[]) new StTableEntry[this.num_bins];
- }
- private long newSize(int size) {
- for (int i = 0, newsize = DEFAULT_MIN_SIZE; i < primes.length; i++, newsize <<= 1) {
- if (newsize > size)
- return primes[i];
- }
- /* Ran out of polynomials */
- return -1; /* should raise exception */
- }
- public V get(T key) {
- int hash_val = doHash(key);
- StTableEntry<T, V> entry = findEntry(hash_val, key);
- if (entry == null)
- return null;
- else
- return entry.getValue();
- }
- public V put(T key, V value) {
- int hash_val = doHash(key);
- StTableEntry<T, V> entry = findEntry(hash_val, key);
- if (entry == null) {
- // 未有键值,直接添加
- addDirect(key, value);
- return value;
- } else {
- V v = entry.value;
- entry.value = value;
- return v;
- }
- }
- // hash函数,调用hashFunction的hash方法
- private int doHash(T key) {
- if (hashFunction.hash(key) < 0)
- throw new IllegalArgumentException(
- "hash value could not less than zero:"
- + hashFunction.hash(key));
- return hashFunction.hash(key);
- }
- // 过于拥挤,重新分布
- public void reHash() {
- int new_size = (int) newSize(this.num_bins);
- StTableEntry<T, V>[] new_bins = (StTableEntry<T, V>[]) new StTableEntry[new_size];
- for (int i = 0; i < this.num_bins; i++) {
- StTableEntry<T, V> entry = this.bins[i];
- while (entry != null) {
- StTableEntry<T, V> next = entry.next;
- int hash_val = entry.hash % new_size;
- entry.next = new_bins[hash_val];
- new_bins[hash_val] = entry;
- entry = next;
- }
- }
- this.bins = null; //gc
- this.num_bins = new_size;
- this.bins = new_bins;
- }
- private void addDirect(T key, V value) {
- int hash_val = doHash(key);
- int bin_pos = hash_val % this.num_bins;
- if ((this.num_entries / this.num_bins) > DEFAULT_MAX_DENSITY) {
- reHash();
- bin_pos = hash_val % this.num_bins;
- }
- StTableEntry<T, V> entry = new StTableEntry<T, V>();
- entry.setHash(hash_val);
- entry.setKey(key);
- entry.setValue(value);
- entry.setNext(this.bins[bin_pos]);
- this.bins[bin_pos] = entry;
- this.num_entries++;
- }
- private StTableEntry<T, V> findEntry(int hash_val, T key) {
- int bin_pos = hash_val % this.num_bins;
- StTableEntry<T, V> entry = this.bins[bin_pos];
- if (entryNotEqual(entry, key, hash_val)) {
- entry = entry.next;
- while (entryNotEqual(entry, key, hash_val)) {
- entry = entry.next;
- }
- }
- return entry;
- }
- // 判断元素是否相同
- private boolean entryNotEqual(StTableEntry<T, V> entry, T key, int hash_val) {
- return entry != null
- && (entry.getHash() != hash_val || (!key.equals(entry.getKey())));
- }
- }
单元测试类就不列了,给一个与HashMap的简单性能对比,以整型为键,显然StTable快多了,对于字符串型,关键是HashFunction的定义,我直接调用String的hashCode方法,不知道有没有其他更好的方法让元素分布的更均匀些:
java 代码
- import java.util.HashMap;
- import java.util.Map;
- public class Benchmark {
- public static void main(String args[]) {
- long map_cost = testStringMap();
- long table_cost = testStringTable();
- if (map_cost <= table_cost)
- System.out.println("map is faster than table ");
- else
- System.out.println("table is faster than map ");
- map_cost = testIntegerMap();
- table_cost = testIntegerTable();
- if (map_cost <= table_cost)
- System.out.println("map is faster than table ");
- else
- System.out.println("table is faster than map ");
- }
- public static long testIntegerMap() {
- Map<Integer, Integer> map = new HashMap<Integer, Integer>();
- long start = System.nanoTime();
- for (int i = 0; i < 10000; i++)
- map.put(i, i);
- long result = 0;
- for (int i = 0; i < 10000; i++)
- result += map.get(i);
- long end = System.nanoTime();
- System.out.println("result:" + result);
- System.out.println("map:" + (end - start));
- return (end - start);
- }
- public static long testIntegerTable() {
- HashFunction<Integer> intHash = new HashFunction<Integer>() {
- public int hash(Integer key) {
- return key;
- }
- };
- StTable<Integer, Integer> table = new StTable<Integer, Integer>(intHash);
- long start = System.nanoTime();
- for (int i = 0; i < 10000; i++)
- table.put(i, i);
- long result = 0;
- for (int i = 0; i < 10000; i++)
- result += table.get(i);
- long end = System.nanoTime();
- System.out.println("result:" + result);
- System.out.println("table:" + (end - start));
- return (end - start);
- }
- public static long testStringMap() {
- Map<String, String> map = new HashMap<String, String>();
- long start = System.nanoTime();
- for (int i = 0; i < 10000; i++)
- map.put(String.valueOf(i), String.valueOf(i));
- long result = 0;
- for (int i = 0; i < 10000; i++)
- result += Integer.parseInt(map.get(String.valueOf(i)));
- long end = System.nanoTime();
- System.out.println("result:" + result);
- System.out.println("map:" + (end - start));
- return (end - start);
- }
- public static long testStringTable() {
- HashFunction<String> intHash = new HashFunction<String>() {
- int i = 0;
- public int hash(String key) {
- int hashCode = key.hashCode();
- return hashCode < 0 ? -hashCode : hashCode;
- }
- };
- StTable<String, String> table = new StTable<String, String>(intHash);
- long start = System.nanoTime();
- for (int i = 0; i < 10000; i++)
- table.put(String.valueOf(i), String.valueOf(i));
- long result = 0;
- for (int i = 0; i < 10000; i++)
- result += Integer.parseInt(table.get(String.valueOf(i)));
- long end = System.nanoTime();
- System.out.println("result:" + result);
- System.out.println("table:" + (end - start));
- return (end - start);
- }
- }
结果为:
result:49995000
map:55501468
result:49995000
table:60999652
map is faster than table
result:49995000
map:44634444
result:49995000
table:26209477
table is faster than map
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 8546一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached 0.60 优化过程
2009-03-06 14:37 3523充分利用jprofile等 ... -
Xmemcached vs Spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4883翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
xmemcached发布1.0-BETA版
2009-03-09 15:32 4122xmemcached 发布1.0-beta ,从0.6 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 4223俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
yanf4j引入了客户端非阻塞API
2009-02-19 00:15 3118yanf4j 发布一个0.50-beta2 版本,这个版本最 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 74761、xmemcached是什么? xmemcached是基于 ... -
使用yanf4j写个简单聊天室
2008-11-26 11:36 5399yanf4j 简介,请看这里 ... -
Java字符串的最大长度
2009-01-15 01:37 7585在cpp中为了可移植性,s ... -
yanf4j-0.41 beta发布
2009-01-20 14:01 1866项目名称:yanf4j (yet another nio fr ... -
再谈Selector的wakeup方法
2009-02-01 11:15 3052过去推荐过两篇blog《Java NIO类库Selector机 ... -
Yet another nio framework for java
2008-10-11 14:25 2047项目名称:Yanf4j(Yet another nio fra ... -
阻塞队列的性能对比
2008-09-08 10:06 5746阻塞队列的性能对 ... -
java package的设计原则
2008-09-06 00:15 2118典型的J2EE项目,package的设计有成熟的套路可 ... -
线程池池
2008-09-01 19:39 1998这个题目比较怪,听俺道来。俺一直在负责公司游戏服 ... -
第一个MapReduce任务
2008-08-23 11:10 2784前两天在公司内网上搭了个2个节点hadoop集群, ... -
从HDFS看分布式文件系统的设计需求
2008-08-15 22:39 8119分布式文件系统的 ... -
HDFS用户指南(翻译)
2008-08-14 20:27 2141HDFS用户指南 原文地址:http:/ ... -
Ehcache配置的overflowToDisk属性
2008-08-06 23:18 10838Ehcache的overflowToDisk属性用来配 ... -
工作的几个tip
2008-07-07 20:47 28861、如果用java6的ScriptEngineManager ...
相关推荐
【ALSM_EXCEL_TO_INTERNAL_TABLE函数的修改】 在SAP ABAP编程中,ALSM_EXCEL_TO_INTERNAL_TABLE是一个标准函数,用于将Excel文件中的数据读取到内部表中。这个函数通常在处理从用户界面上传的Excel数据时非常有用。...
### DBMS_STATS.GATHER_TABLE_STATS详解 #### 一、概述 `DBMS_STATS.GATHER_TABLE_STATS` 是 Oracle 数据库中的一个重要过程,主要用于收集表、列和索引的统计信息,这些统计信息对于优化器选择合适的执行计划至关...
`gcc_except_table`是GCC(GNU Compiler Collection)编译器在处理C++异常处理时使用的一个内部机制。这个表格在编译过程中自动生成,用于在程序执行期间有效地管理异常捕获和传播。在这个主题中,我们将深入探讨`...
标题中的"trans_table.rar_Table_trans_table"提示我们关注的核心是“trans_table”,它似乎是一个与数据转换相关的表格或矩阵,可能用于生物信息学、数据库管理或其他需要数据转换的领域。"rar"是一个压缩文件格式...
面向对象的 ALV 显示主要依赖于 `CL_SALV_TABLE` 这个类。该类提供了一系列的方法来帮助开发者更加灵活地控制 ALV 的显示效果。相比传统的面向过程的方式,面向对象的方法提供了更多的灵活性和可扩展性。 #### 2. ...
例如,`u_hash_table_init()`函数可能是用来初始化一个新的哈希表,`u_hash_table_insert()`用于插入键值对,`u_hash_table_find()`用于根据键查找对应的值,而`u_hash_table_remove()`则用于删除指定键的键值对。...
标题“get_size_database_and_table.rar_Table_get_table_size_sql”和描述“如何获取SQL数据库大小”都指向了这个核心主题。本文将深入探讨如何使用SQL语句来获取数据库和表的大小信息。 1. 数据库大小获取: ...
标题 "test_table_Table_incomplete_" 和描述 "test_table(incompleted)" 暗示我们正在处理一个与数据库或数据表相关的项目,其中可能包含一个名为 "test_table" 的表格,但这个表格似乎不完整或者存在一些问题。...
在IT领域,特别是数据结构和算法的学习中,ST表(Sqrt-Decomposition Table)是一种高效的数据结构,常用于处理动态区间最值查询问题。它主要适用于那些对一个数组进行频繁的更新和查询操作,而更新操作是局部的,...
`tmp_table_size` 和 `max_heap_table_size` 这两个系统变量就与这种内存中的临时表息息相关,它们对数据库性能有着显著的影响。 `tmp_table_size` 是一个重要的配置参数,它决定了在每个线程中创建的内存临时表的...
商品交叉销售分析所需数据,对同一个订单编号不同的产品进行组合分析相关性.
【标题】"newhh_table1_src.rar_c# console_newhh_table1_src" 指的是一款基于C#语言开发的控制台应用程序,主要用于哈希计算。哈希(Hash)算法是一种将任意长度的数据映射为固定长度输出的算法,常用于数据校验、...
创建CRC16所需要的Table、创建CRC32所需要的Table、执行对数据段的CRC16循环冗余校验、执行对数据段的CRC32循环冗余校验,处理CRC循环校验所需要的方法,可选择临时计算,或者一次计算出数值查表以增加速度。
《CC_Table:深入理解Visual C++中的Table原代码实现》 在编程领域,尤其是在Windows应用程序开发中,Table控件是一种常见的用户界面元素,用于展示数据并允许用户进行交互。本篇将围绕“CC_Table.rar_Table”这个...
这里的改动可能是为了允许其他类或外部代码能够创建和操作"loca_table"这个类的实例。 因此,我们可以深入探讨以下几个知识点: 1. **数据库表格**:在数据库管理中,表格是存储和组织数据的主要方式,由行和列...
在编程和计算机科学领域,尤其是编译器设计中,`parse_reduce_table` 是一个关键的概念,它涉及到解析和语法分析的过程。这个压缩包文件 `parse_reduce_table.rar_Table` 显然是与创建或使用解析减少表(Parse ...
具体到`initrd_table_override.txt`的内容,可能包含了一系列的PCI设备ID、设备类码、中断线路等信息,这些信息会被内核的PCI子系统读取,并用以覆盖默认的PCI中断路由设置。配置文件的格式通常是文本形式,每行代表...
标题“trans_table_for_bases.rar_Table”暗示我们正在处理一个与生物信息学相关的压缩包,特别是涉及到氨基酸转换表的计算或分析。描述中的“trans amino acid table composition”进一步明确了这是一个关于氨基酸...
标题“lock_table.rar_Table_lock table_oracle lock table”表明这个压缩包包含了与Oracle数据库中的表锁定相关的资料,可能是用于诊断和解决表被特定用户锁定的问题。下面将详细解释这些知识点: 1. **Table ...