一般来说,我不会担心比较的性能,因为对于典型的代码比较不太可能成为性能瓶颈。如果您确定存在性能问题并且分析表明比较是原因,那么您可以考虑如何最好地解决它。
如果您确实需要考虑比较的性能,那么您可能需要了解编译器的工作原理。在您引用的第一个示例中,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() 实现(这是字典默认执行的操作)将比使用结构比较更快。但是,这对您来说是否会产生重要差异将取决于您正在编写的实际代码 - 正如我之前所说,关键比较占用算法运行时间的很大一部分是不寻常的。