如何解决F#简单类型和结构比较
| 在这个问题中,为什么这个F#代码这么慢?,讨论结构比较使函数ѭ0慢。简单类型的结构比较不应该像本机一样快吗? 我很困惑,因为人们一直在谈论在FSharp中的F#中始终对字典使用HashIdentity.Structural
来运行我的算法要比Python慢。如果我有一个以简单类型(整数或字符串)为键的字典,使用HashIdentity.Structural
是否会受到性能损失?
解决方法
一般来说,我不会担心比较的性能,因为对于典型的代码而言,比较不太可能成为性能瓶颈。如果确定存在性能问题,并且通过分析发现比较是原因,那么您可以考虑如何最好地解决它。
如果确实需要考虑比较的性能,则可能需要了解编译器的工作方式。在您引用的第一个示例中,
min3
函数的类型为\'a * \'a * \'a -> \'a when \'a : comparison
。该函数将被编译为.NET方法,该方法将使用3个泛型类型的参数,在C#中将如下所示:
using LP = Microsoft.FSharp.Core.LanguagePrimitives;
T min3<T>(T a,T b,T c) {
T d = LP.HashCompare.GenericLessThanIntrinsic(b,c) ? b : c;
return LP.HashCompare.GenericLessThanIntrinsic(d,a) ? d : a;
}
GenericLessThanIntrinsic
方法也是通用的,并且在其中必须具有根据所比较的实际类型执行比较的逻辑。这可能需要进行一些类型测试和虚拟方法调用。这些操作不是很昂贵,但是比直接比较两个整数值要慢得多。因此,如果比较工作量很大,那么使用通用比较例程可能会对整体性能产生重大影响,而专门的min3
函数只能在整数而不是在任何通用值上工作可能会大大提高性能。 。
同样,如果仅将整数存储为字典键,则在键上使用内置的GetHashCode()
和Equals()
实现(这是字典默认将执行的操作)会比使用结构比较更快。但是,这是否对您来说很重要,取决于您正在编写的实际代码-正如我之前所说,密钥比较占用算法运行时间的大部分并不常见。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。