高效克隆缓存对象

2024-01-07

我们有一个应用程序,可以对数据对象进行比较,以确定对象的一个​​版本是否与另一个版本不同。我们的应用程序还对这些对象进行了一些广泛的缓存,并且在进行这些比较时我们遇到了一些性能问题。

这是工作流程:

  1. 数据项 1 是内存中的当前项。该项目最初是从缓存中检索并深度克隆的(所有子对象,例如字典等)。然后编辑数据项 1,并修改其属性。
  2. 然后,我们将该对象与存储在缓存中的原始版本进行比较。由于数据项 1 已被克隆且其属性已更改,因此这些对象应该不同。

这里有几个问题。

主要问题是我们的深度克隆方法非常昂贵。我们针对浅克隆对其进行了分析,结果慢了 10 倍。那是废话。这是我们深度克隆的方法:

    public object Clone()    
    {
        using (var memStream = new MemoryStream())
        {
            var binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
            binaryFormatter.Serialize(memStream, this); 
            memStream.Seek(0, SeekOrigin.Begin);
            return binaryFormatter.Deserialize(memStream);
        }
    }

我们最初使用以下内容进行克隆:

public object Clone()
{
    return this.MemberwiseClone();
}

这性能更高,但因为它进行了浅克隆,所以作为该对象属性的所有复杂对象(例如字典等)都没有被克隆。该对象仍将包含与缓存中的对象相同的引用,因此在比较时属性将相同。

那么,是否有人有一种有效的方法来对 C# 对象进行深度克隆,从而涵盖克隆整个对象图?


如果不在所有需要克隆的数据对象上显式实现 ICloneable,您将无法获得比通用二进制序列化更好的结果。另一种可能的途径是反思,但如果您正在寻找性能,您也不会对此感到满意。

如果对象不同,我会考虑使用 ICloneable 进行深度复制和/或 IComparable 进行比较……如果性能对您来说是一个大问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高效克隆缓存对象 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • JIT 自动内联的方法的大小是多少?

    我听说 JIT 自动内联小型方法 例如 getter 它们大约有 5 个字节 边界是什么 有 JVM 标志吗 HotSpot JIT 内联策略相当复杂 它涉及许多启发式方法 例如调用方方法大小 被调用方方法大小 IR 节点计数 内联深度 调
  • Zoidberg曲线,无法达到“zoidberg”解

    我正在尝试绘制在Matlab中只是为了好玩 I just copied the equation shown there and defined the sgn and theta functions but I can t achieve
  • 在一次替换调用中替换多个字符

    我需要将 的每个实例替换为空格 并将 的每个实例替换为空 空 var string Please send an information pack to the following address 我试过这个 string replace
  • 解析 XML 命名空间?

    使用 JavaScript Ajax 我正在尝试从中提取值
  • 如何在 SVG 中显示占位符图像,直到加载真实图像?

    我正在使用 D3 js 渲染包含光栅图像的节点的图形 var mainscreenURL s3 base url viewController screenshot jpeg svg select mainScreen transition
  • java中使用正则表达式进行字符串匹配

    我想像这样匹配电话号码 它应该有3 digits except 000 666以及之间的任何数字900 999后面加 然后2 digits后面加 然后4 digits 例如 123 75 3456 is a match 000 23 345
  • ruby 中的大括号与前面的字符匹配

    我在这里阅读了很多关于使用 Regexp 在 Ruby 中匹配嵌套大括号的文章 然而我无法适应我的情况 我陷入了困境 Ruby 1 9 书中使用以下内容来匹配一组嵌套大括号 A
  • DefaultSelenium 和 RemoteWebDriver 有什么区别?

    RemoteWebDriver 是 Selenium 2 0 中 DefaultSelenium 的替代品还是两者可以结合使用 RemoteWebDriver 只是用于连接到远程 selenium 服务器的驱动程序 您可以将 WebDriv
  • 忽略我对文件的更改,但不要从远程代表中删除它们

    我的工作目录中有几个文件存在于远程代表中 我总是出于特定原因更改它们 是否可以使 git 在提交时忽略这些文件 同时这些文件不应从远程代表中删除 当我从远程代表中提取更改时 不应合并这些文件 是否有可能做到这一点 P S git updat
  • 缺少“部署”按钮 Visual Studio 2012

    昨天 我已在 SharePoint 2013 开发计算机上安装了 Visual Studio 2012 Premium 我还安装了 Office 开发人员工具来获取 SP2013 项目模板 打开我的 SP 2010 解决方案文件并成功转换为
  • IPython笔记本上CSV文件的SQL语句

    我有一个tabledata csv文件和我一直在使用pandas read csv阅读或选择具有特定条件的特定列 例如 我使用以下代码来选择所有 名称 session id 1 它在数据科学家工作台上的 IPython Notebook 上
  • python list(zipobject) 返回空(列表)容器[重复]

    这个问题在这里已经有答案了 我在 Python 3 4 3 中遇到了一个奇怪的问题 而且似乎没有在任何地方提到它 可以说 a 1 2 3 4 and b 5 6 7 8 要垂直连接这些 ab zip a b 在Python 3中 ab本身会
  • React Context 未将类更新为值

    我有一个使用类实例作为上下文值的上下文 在我更新了类实例之后 这种变化不会反映在消费者身上 消费者仍然可以获得旧类别的价值 有人可以指出我如何实现这一目标的方向吗 Service class class Service name oldNa
  • Spring Cloud Zuul代理网关不从Spring Boot应用程序加载css、js

    我使用 Spring Cloud Zuul 代理创建了一个网关应用程序 网关应用程序工作正常 但它没有加载静态文件 如 img css 和 js 文件 我在我的中添加了以下设置应用程序属性我的网关应用程序的文件 zuul routes de
  • SQLAlchemy Core 和 ORM 有什么区别?

    两者的目的有什么区别SQLAlchemy 核心 http docs sqlalchemy org en latest core and SQLAlchemy ORM http docs sqlalchemy org en latest or
  • 如何将上下文菜单附加到 Chromium 浏览器

    我有一个来自 Delphi Chromium Embedded 的 TChromium broser http code google com p delphichromiumembedded 我想为其附加一个上下文菜单 我怎样才能做到这一
  • 如何在 WinUI 3 桌面中使用 Prism MVVM

    我是 WinUI 3 和 PRISM 库的新手 WinUI 3 中是否支持 PRISM 库 如果答案是 是 那么哪个图书馆是 进行初步搜索后 我看到 Prism Uno 支持 WinUI 3 我的理解正确吗 为了尝试示例 我完成了以下步骤并
  • 在比较函数中使用非静态类成员

    我目前正在开发一个语法分析器类 它需要在代码的某个点对包含运算符信息的结构进行排序 每个运算符都有一个优先级 这是用户通过我的分析器类的公共成员函数定义的 因此 在排序时 我需要排序函数根据相应运算符的优先级对元素进行排序 我使用以下代码来
  • python - 如何将日期时间对象舍入到最近的前一刻钟?

    假设我有日期时间对象 我希望它们四舍五入到最近的前一刻钟 2014 07 18T14 23 12 gt 2014 07 18T14 15 00 2014 07 18T14 14 59 gt 2014 07 18T14 00 00 2014
  • 高效克隆缓存对象

    我们有一个应用程序 可以对数据对象进行比较 以确定对象的一个 版本是否与另一个版本不同 我们的应用程序还对这些对象进行了一些广泛的缓存 并且在进行这些比较时我们遇到了一些性能问题 这是工作流程 数据项 1 是内存中的当前项 该项目最初是从缓