加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 提高序列化/散列函数的性能

发布时间:2020-12-15 17:21:42 所属栏目:百科 来源:网络整理
导读:我正在研究一种专门的磁盘哈希表(之前的实验与Berkeley,ManagedESENT等没有成功).它有一个相当简单的链式结构,每个键值对(KVP)在文件中跟随一个长(Int64)值,指向链中的下一个KVP(如果没有一个,则使用零值) ).我正在使用MD5生成哈希码. 在分析代码以评估添加
我正在研究一种专门的磁盘哈希表(之前的实验与Berkeley,ManagedESENT等没有成功).它有一个相当简单的链式结构,每个键值对(KVP)在文件中跟随一个长(Int64)值,指向链中的下一个KVP(如果没有一个,则使用零值) ).我正在使用MD5生成哈希码.

在分析代码以评估添加条目的速度时,散列函数负责大约55%的运行时间,这并不奇怪.但是大约25%的时间来自ObjectToByteArray序列化函数中的binForm.Serialize(ms,obj)调用.两种功能如下所示.我假设我不能在哈希算法本身上取得任何大的收益,但我想知道我是否可以从序列化函数中获得一些性能?

// Compute hash code
    long hash(object s)
    {
        byte[] y = md5.ComputeHash(ObjectToByteArray(s)); // Produces byte[16]
        long z = BitConverter.ToInt64(y,0);
        long res = z & bitMask;
        return res;
    }

    // Convert an object to a byte array
    private byte[] ObjectToByteArray(Object obj)
    {
        if (obj == null)
            return null;

        MemoryStream ms = new MemoryStream();
        binForm.Serialize(ms,obj);
        return ms.ToArray();
    }

解决方法

使用protobuf.net,发现 here,它快得多!

更新

从查看代码开始,我假设没有任何计算哈希在AppDomains中保持一致的要求?如果不计算您的HashCode可以像下面这样简单:

private static long GenerateHash(object key)
{
  long typeHash = key.GetType().GetHashCode();
  long keyHash = key.GetHashCode();
  return (typeHash << 32) + keyHash;
}

为了将来参考,你的MemoryStream应该真的在一个使用块中,否则你冒着泄漏内存的风险:

private byte[] ObjectToByteArray(Object obj)
{
    if (obj == null)
        return null;

    using (MemoryStream ms = new MemoryStream()) 
    {
      binForm.Serialize(ms,obj);
      return ms.ToArray();
    }   
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读