AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

Greg Finzer 谈 Compare .NET Objects

  • 2013-11-25
  • 本文字数:1782 字

    阅读完需:约 6 分钟

编写对象比较的代码可能非常枯燥,特别是在处理大对象或者深度图的时候。在类变化的时候错误通常会偷偷的溜进去。减少潜在错误的一种方式是依赖于类库,例如 Greg Finzer 的 Compare .NET Objects 。该类库为多达 1 万个对象的比较提供合理的性能。

InfoQ:启发你创建 Compare .NET Objects 类库的第一件事是什么?

当 Microsoft 发布 Developer Tools for Windows Phone 7 的时候在 Windows Phone 7 社区中引发了非常强烈的抗议,因为 Microsoft 并没有提供一个数据库。而我个人认为这应该是一个非常好的为 Windows Phone 7 创建一个数据库的机会,因为并没有竞争对手并且有清晰的需求。我过去一直想要创建一个对象数据库从而绕开数年来处理 ORM 的痛苦。那时候 Windows Phone 7 允许的应用程序数据最大才是 90MB。我们需要在尽可能最小的空间中存储数据,甚至比 JSON 还小。我发现.NET Framework for Windows Phone 7 早期并没有可用的二进制序列化器。在 CodePlex 上有一个开源的二进制序列化器: https://slserializelzo.codeplex.com/ 。 我注册并成为了那个项目的测试员。为了验证序列化 / 反序列化我创建了 Compare .NET Objects,而不是手工的编写几百个反射测试。最后,创建 Ninja Database Pro 的时候我们并没有利用 CodePlex 序列化类库。但是我们自己的二进制序列化器确实使用了 Compare .NET Objects 进行所有的集成测试。我将 Compare .NET Objects 剥离成了一个独立的开源项目,使它可以为开发者社区服务。

InfoQ:你还看见开发者按照其他的方式使用过你的类库么?

我认为 Compare .NET Objects 非常适合于编写验证 ORM 映射的集成测试。我为 Sogeti 工作。在过去的一年我在俄亥俄州航空办公室的一个项目上使用了 Compare .NET Objects 进行集成测试。在该项目上我们使用了 Compare .NET Objects 验证 Spring Framework .NET 映射。我还看见过其他开发人员使用 Compare .NET Objects 判断一个对象是否是脏对象需要被保存到数据库中,还有人使用它实现审计的目的,有人将它应用于 power shell 脚本中。

InfoQ:它支持所有其他的.NET 平台么,例如 Windows Phone、Windows Store?

在代码中有一个针对 Silverlight 的编译器常量,所以它应该可以在 Windows Phone 和 Silverlight 上使用。但是我现在并没有考虑让它兼容 Windows Store。最后,我计划实现几个独立的项目,为每一个不同的平台单独构建,类似于我在我们的商业产品中所做的事情那样。

InfoQ:Compare .NET Objects 中是否有一些现在没有但是你想要添加的内容?

尽管人们发 email 感谢我它是一个单独的类,但是我认为是时候将 Compare .NET Objects 重构为更多可维护的类了。在过去的几年中我一直在添加功能,现在它有很多坏的代码味道。它明显违反了 S.O.L.I.D. 设计原则,特别是 SRP。同时将所有的内容写到一个类中也带来了很多合并上的痛苦。我将在保持向后兼容性的同时添加一个线程安全的选项。

InfoQ:你发现了没有,反射的使用引发了性能问题?如果是这样,为了缓解它你现在做了什么?

如此之多的人在反射引发性能问题的事情上喋喋不休,但是我从来没有真正地看到有很大的影响。之前有一个项目客户端请求将 9000 个条目加载到 Web 页面上的一个下拉列表中,加载过程大约花费了 20 秒钟。我们使用了 NHibernate 从 Oracle 数据库中加载数据。NHibernate 就使用了反射。所以性能问题在哪里呢?数据库?NHibernate?Internet Explorer?都不是,性能问题是网络带宽。我们最终实现了一个 Ajax 自动完成下拉列表,它每次仅加载 20 个条目。如果你正在处理大量的对象,那么比较起来反射引发的担心最少。

我已经在 Compare .NET Objects 中添加了反射缓存,这样确实有助于提高性能。看看测试项目中的 CachingTest 就行了。在我的机器上,如果禁用反射缓存比较 1 万个对象要花费 319 毫秒,如果启用反射缓存则要花费 224 毫秒。我会说如果你一次性比较超过 1 万个对象,那么我不会使用 Compare .NET Objects。在那种情况下,我会为那些类重写 Equals 和 GetHashCode 方法。

InfoQ:你现在正在寻找志愿者为 Compare .NET Objects 工作么?

当然,我们有很多工作要做呢:

  • 将每一种类型的比较器重构为单独的类
  • 线程安全的配置和比较
  • 为每一个平台提供单独的项目:Mono、Silverlight、Windows Phone、Windows Store

查看英文原文 An Interview with Greg Finzer of Compare .NET Objects

2013-11-25 07:251225
用户头像

发布了 321 篇内容, 共 124.6 次阅读, 收获喜欢 19 次。

关注

评论

发布
暂无评论
发现更多内容

基于 MinIO 对象存储保障 Rancher 数据

Rancher

Kubernetes k8s rancher

A tour of gRPC:05 - gRPC server straming 服务端流

BUG侦探

gRPC RPC protocolBuffer

如何有效进行回顾会议(上)?

敏捷开发

敏捷 回顾会 项目开发

这50道Java面试题看完,想不进大厂都难

王小凡

Java 程序员 面试 面试题 大厂面试

【微服务测试教程】使用Python测试gRPC接口案例

和牛

测试

NFTScan 与 NFTPlay 在 NFT 数据领域达成战略合作

NFT Research

区块链 大数据 NFT 合作 Web3.0

语音社交系统——完善有声系统产业链

开源直播系统源码

开源源码 语音直播系统源码 语音直播系统 语音直播系统连麦

分布式 hdfs-over-ftp 工具实现方案

移动云大数据

Rust 入门指南(rustup, cargo)

王泰

rust

详解Kafka分区副本分配的Bug

石臻臻的杂货铺

7月月更 签约计划第三季

有奖活动分享:使用WordPress搭建一个专属自己的博客后最高可领取iPhone13

云端explorer

Wordpress 博客部署

兆骑科创创业大赛平台,活动路演,投融资对接

兆骑科创凤阁

活动速递| Apache Doris 性能优化实战系列直播课程初公开,诚邀您来参加!

SelectDB

数据库 性能优化 数据仓库 OLAP Doris

数牍 X Rust,那些不得不说的事

Jessica@数牍

联邦学习 隐私计算 数牍科技 rust开发者大会 分布式计算框架

你面试十家java开发才能总结出来的面试题(建议收藏)

程序员啊叶

Java 编程 程序员 架构 java面试

围绕新市民金融聚焦差异化产品设计、智能技术提效及素养教育

易观分析

新市民金融 差异化产品设计 素养教育

面试官:ThreadLocal使用场景有哪些?内存泄露问题如何避免?

程序员啊叶

Java 编程 程序员 架构 java面试

10次面试9次被刷?吃透这500道大厂Java高频面试题后,怒斩offer

程序员啊叶

Java 编程 程序员 架构 java面试

TDengine 助力西门子轻量级数字化解决方案

TDengine

数据库 tdengine 时序数据库

ApacheCon Asia 2022 启动!7场阿里云大数据+AI议题分享等你围观

阿里云大数据AI技术

人工智能 大数据

融云实时社区解决方案

融云 RongCloud

Rust 入门指南(crate 管理)

王泰

rust

蓝海大脑高性能气象大数据平台为气象局掌握风云变幻提供助力

GPU算力

一文读懂如何部署具有外部数据库的高可用 K3s

Rancher

Kubernetes k8s rancher

58子站安居,经纪人营销管理平台登录接口加密逆向

梦想橡皮擦

Python 爬虫 7月月更

看了就会的 Rainbond 入门教程

北京好雨科技有限公司

Kubernetes 云原生

一些企业数据平台建设的思考

Bright

数据平台 大数据平台

什么是SpringMVC?工作流程是什么?九大组件有哪些?

程序员啊叶

Java 编程 程序员 架构 java面试

35道MySQL面试必问题图解,这样也太好理解了吧

程序员啊叶

Java 编程 程序员 架构 java面试

管理区解耦架构见过吗?能帮客户搞定大难题的

华为云开发者联盟

云计算 后端 华为云

Greg Finzer谈Compare .NET Objects_.NET_Jonathan Allen_InfoQ精选文章