主要观点:F#语言作者需考虑多方面,如语言设计等,2015 年出现关于 F#中相等性测试的问题,代码中简单的结构体相等性测试会导致不必要的装箱,影响性能,后续多次尝试修复但未达预期,直到 2024 年通过多个 PR 实现了优化,包括在泛型上下文中更快的相等性和新的 Equals 重载等,同时总结了避免类似问题的经验教训。
关键信息:
- 2015 年的问题涉及多种语言相关场景的相等性问题。
- 简单的
MyVal
结构体相等性测试会装箱,影响性能,如在集合操作中多次装箱。 - 多次尝试修复该问题的 PR 历经坎坷,如部分被合并后又被撤回等。
- 2024 年的两个 PR 实现了重要优化,如在泛型上下文中更快的相等性和新的 Equals 重载。
重要细节: - 最初的代码
[<Struct>] type MyVal = val X: int new x = { X = x } let equalityTest = MyVal 1 = MyVal 2
,最后一行本质上会装箱。 - 早期的修复尝试如PR513,但合并延迟且后来被撤回。
- 新的优化 PR 详细描述了变化和更多基准测试,如在结构体元组中的性能提升。
- 总结的经验教训包括创建问题要具体、创建 PR 要专注、帮助可通过审查 PR 等。
- 技术上通过分析 IL 代码来发现和解决问题,如使用 ILSpy 或 sharplab.io 等工具。
- 后续仍有大量在相等性和比较方面的工作要做,欢迎贡献。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。