永利国际源码下载

永利国际源码下
地址一:【hubawl.com】狐霸源码论坛
地址二:【bbscherry.com】

由于采用字典的方式来保存属性变更值的底层设计思想,导致了性能问题,虽然.NET的字典实现已经很高效了,但相对于直接读写字段的方式而言依然有巨大的性能差距,同时也会导致对属性的读写过程中产生不必要的装箱和拆箱。
那么这次我们就来彻底解决这个问题,同时还要解决“哪些属性发生过变更”、“获取变更的属性集”这些功能特性,所以我们先把接口定义出来,以便后续问题讲解。

/ 源码位于 Zongsoft.CoreLibary 项目的 Zongsoft.Data 命名空间中 /

/// <summary> 表示数据实体的接口。</summary>
public interface IEntity
{
/// <summary>
/// 判断指定的属性或任意属性是否被变更过。
/// </summary>
/// <param name="names">指定要判断的属性名数组,如果为空(null)或空数组则表示判断任意属性。</param>
/// <returns>
/// <para>如果指定的<paramref name="names"/>参数有值,当只有参数中指定的属性发生过更改则返回真(True),否则返回假(False);</para>
/// <para>如果指定的<paramref name="names"/>参数为空(null)或空数组,当实体中任意属性发生过更改则返回真(True),否则返回假(False)。</para>
/// </returns>
bool HasChanges(params string[] names);

/// <summary>
/// 获取实体中发生过变更的属性集。
/// </summary>
/// <returns>如果实体没有属性发生过变更,则返回空(null),否则返回被变更过的属性键值对。</returns>
IDictionary<string, object> GetChanges();

/// <summary>
/// 尝试获取指定名称的属性变更后的值。
/// </summary>
/// <param name="name">指定要获取的属性名。</param>
/// <param name="value">输出参数,指定属性名对应的变更后的值。</param>
/// <returns>如果指定名称的属性是存在的并且发生过变更,则返回真(True),否则返回假(False)。</returns>
/// <remarks>注意:即使指定名称的属性是存在的,但只要其值未被更改过,也会返回假(False)。</remarks>
bool TryGetValue(string name, out object value);

/// <summary>
/// 尝试设置指定名称的属性值。
/// </summary>
/// <param name="name">指定要设置的属性名。</param>
/// <param name="value">指定要设置的属性值。</param>
/// <returns>如果指定名称的属性是存在的并且可写入,则返回真(True),否则返回假(False)。</returns>
bool TrySetValue(string name, object value);

}
设计思想
根本要点是取消用字典来保存属性值回归到字段方式,只有这样才能确保性能,关键问题是如何在写入字段值的时候,标记对应的属性发生过变更的呢?应用布隆过滤器(Bloom Filter)算法的思路来处理这个应用场景是一个完美的解决方案,因为布隆过滤器的空间效率和查询效率极高,而它的缺点在此恰好可以针对性的优化掉。

将每个属性映射到一个整型数(byte/ushort/uint/ulong)的某个比特位(bit),如果发生过变更则将该 bit 置为 1,只要确保属性与二进制位顺序是确定的即可,算法复杂度是O(1)常量,并且比特位操作的效率也是极高的。

实现示范
有了算法,我们写一个简单范例来感受下:

public class Person : IEntity
{
#region 静态字段
private static readonly string[] NAMES = new string[] { "Name", "Gender", "Birthdate" };
private static readonly Dictionary<string, PropertyToken<Person>> TOKENS = new Dictionary<string, PropertyToken<Person>>()
{
{ "Name", new PropertyToken<Person>(0, target => target._name, (target, value) => target.Name = (string) value) },
{ "Gender", new PropertyToken<Person>(1, target => target._gender, (target, value) => target.Gender = (Gender?) value) },
{ "Birthdate", new PropertyToken<Person>(2, target => target._birthdate, (target, value) => target.Birthdate = (DateTime) value) },
};
#endregion

#region 标记变量
private byte _MASK_;
#endregion

#region 成员字段
private string _name;
private bool? _gender;
private DateTime _birthdate;
#endregion

#region 公共属性
public string Name
{
    get => _name;
    set
    {
        _name = value;
        _MASK_ |= 1;
    }
}

public bool? Gender
{
    get => _gender;
    set
    {
        _gender = value;
        _MASK_ |= 2;
    }
}

public DateTime Birthdate
{
    get => _birthdate;
    set
    {
        _birthdate = value;
        _MASK_ |= 4;
    }
}
#endregion

#region 接口实现
public bool HasChanges(string[] names)
{
    PropertyToken<Person> property;

    if(names == null || names.Length == 0)
        return _MASK_ != 0;

    for(var i = 0; i < names.Length; i++)
    {
        if(__TOKENS__.TryGetValue(names[i], out property) && (_MASK_ >> property.Ordinal & 1) == 1)
            return true;
    }

    return false;
}

public IDictionary<string, object> GetChanges()
{
    if(_MASK_ == 0)
        return null;

    var dictionary = new Dictionary<string, object>(__NAMES__.Length);

    for(int i = 0; i < __NAMES__.Length; i++)
    {
        if((_MASK_ >> i & 1) == 1)
            dictionary[__NAMES__[i]] = __TOKENS__[__NAMES__[i]].Getter(this);
    }

    return dictionary;
}

public bool TryGetValue(string name, out object value)
{
    value = null;

    if(__TOKENS__.TryGetValue(name, out var property) && (_MASK_ >> property.Ordinal & 1) == 1)
    {
        value = property.Getter(this);
        return true;
    }

    return false;
}

public bool TrySetValue(string name, object value)
{
    if(__TOKENS__.TryGetValue(name, out var property))
    {
        property.Setter(this, value);
        return true;
    }

    return false;
}
#endregion

}

// 辅助结构
public struct PropertyToken<T>
{
public PropertyToken(int ordinal, Func<T, object> getter, Action<T, object> setter)
{
this.Ordinal = ordinal;
this.Getter = getter;
this.Setter = setter;
}

public readonly int Ordinal;
public readonly Func<T, object> Getter;
public readonly Action<T, object> Setter;

}
上面实现代码,主要有以下几个要点:

属性设置器中除了对字段赋值外,多了一个位或赋值操作(这是一句非常低成本的代码);
需要一个额外的整型数的实例字段 MASK ,来标记对应更改属性序号;
分别增加 NAMES TOKENS 两个静态只读变量,来保存实体类的元数据,以便更高效的实现 IEntity接口方法。
根据代码可分析出其理论执行性能与原生实现基本一致,内存消耗只多了一个字节(如果可写属性数量小于9),由于 NAMESTOKENS 是静态变量,因此不占用实例空间,理论上该方案的整体效率非常高。

原文地址:http://blog.51cto.com/13880620/2148010

时间: 2024-10-28 08:50:30

永利国际源码下载的相关文章

永利国际源码搭建什么是小程序

简单来说小程序是一种不需要下载安装即可使用的应用,它实现了应用"×××"的梦想,用户扫一扫或搜一下即可打开应用.小程序点开既用完既走不占用内存,他还带有记忆功能比如别人点开过这个小程序,它将永远留在这个人的微信,发现里面.永利国际源码搭建QQ:2152876294 网址diguaym.com小程序的好处有哪些??1.服务和体验更有优势:先不说无需下载即可安装这个优势,小程序的核心主要是针对一些轻度用户和新用户,提供基础服务,有一个重要的特点就是:能简化用户路径去享受更好的服务,通过碎片

tomcat服务永利国际源码出售器启动成功但是访问404问题

症状:永利国际源码出售论坛:haozbbs.com Q1446595067 tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误.同时其他项目页面也不能访问. 关闭eclipse里面的tomcat,在tomcat安装目录下双击startup.bat手动启动tomcat服务器.访问htt://localhost:8080/能正常访问tomcat管理页面. 症状原因: eclipse将tomcat的项目发布目录(tomcat

如何写出永利国际平台出租没有BUG的代码?

1947年9月9日,美国海军准将 Grace Hopper 在哈佛学院计算机实验室里使用 Mark II 和 Mark III 计算机进行研究工作.她的团队跟踪到 Mark II 上的一个错误,操作人员发现是由于一只飞蛾钻到了 Mark II 的继电器里导致的.团队清除了这只飞蛾,一切恢复正常.当时的工作人员记录了这样一句日志:" First actual case of bug being found. "? 这次著名的事件,犹如潘多拉打开了魔盒,从此,永利国际平台出租扣326639

BLAST(2004版)本地化永利国际平台搭建安装与使用,生成PSSM打分矩阵

一.软件永利国际平台搭建安装论坛:haozbbs.com Q1446595067 1.软件下载:该软件目前已更新到2.3.0+(ftp://ftp.ncbi.nlm.nih.gov/blast/executables/blast+/2.3.0/),我使用的是师姐给的2004年2.2.9版(ftp://ftp.ncbi.nlm.nih.gov/blast/executables/release/2.2.9/)大家可以根据自己的需求来下载.两个软件在Dos环境下的命令还是不一样的,我个人感觉2004

八合一平台源码下载

八合一平台源码下载hubawl.com/thread-279-1-1.html 无论是迈向智能制造,还是使用优化生产过程的MES系统,都需要大前提也就是需要先将工业设备的数据进行采集,才能对数据进行下一步利用和分析. 据不完全统计,制造行业的信息孤岛断裂问题,离散行业至少存在60-70%的信息孤岛,而流畅连续型行业的信息孤岛现象占50%左右.这么看来,关于数据采集和传输问题可改造和挖掘的空间真的大到我们无法想象.当然,肯定会有很多制造业人员抱怨"数据采集的重要性我们都心知肚明还用你说?但是问题是

cocos Creator js 房卡麻将/血战/H5四川麻将源码下载搭建

房卡麻将/血战/H5四川麻将 源码 支持iOS/Android/H5 完整源码 1.基于NODEJS+MYSQL的服务器,成熟的技术方案,高效稳定,且方便Windows开发,Linux平台布署,节约服务器运转成本. 2.采用最新版本的cocos引擎,cocos creator开发,可快速的进行界面调整.且能够快速地发布iOS,Android版本. 3.如需H5版本,只需针对H5平台进行资源优化即可. 4.成熟可靠的房卡式设计,能满足大部分用户使用体验. 5.产品经过大量测试,可以运转稳定. 测试

微信小程序源码下载(200多个)

微信小程序源码下载汇总,点击标题进入对应的微信小程序下载页面. 最新 demo源码(点击标题进入帖子下载) 描述 1 微信小程序 会议室预定小程序 微信小程序 会议室预定小程序**** 本内容被作者隐藏 **** 2 微信小程序-双人五子棋小游戏 微信小程序-双人五子棋小游戏**** 本内容被作者隐藏 **** 3 打卡签到小程序 用微信小程序实现的一个简单的打卡签到的小程序拒绝 4 微信小程序---左滑删除 微信小程序---左滑删除**** 本内容被作者隐藏 **** 5 一个借钱的记事本的微

跟我学SpringMVC目录汇总贴、PDF下载、源码下载

跟我学SpringMVC目录汇总贴.PDF下载.源码下载 http://jinnianshilongnian.iteye.com/blog/1752171 跟开涛学SpringMVC 在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller接口控制器详解(2) 第四章 Controller接口控制器详解(3) 第四章 Controller接口控制器详解(

开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(非官方文章)

BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一旦整理完成也全部开源). 源码下载地址: asp.net(c#)开源商店系统Brn shop 1.9(免费仿京东商城) asp.net(c#)开源商店系统Brn shop 2.1(免费仿京东商城) 项目结构图如下: 后台管理页面: 功能简介: 1 基本数据:品牌,分类,属性(有些属性用作sku,有些属性还要提供商品筛选功能). 2 商品属性:商品图库,商品属性列表,商品