为什么F#内联会导致11倍的性能提升?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

我正在处理一些CPU绑定问题。当我使用inline关键字时,我看到了很大的性能提升。我从标准.net库中创建一个字典,传递一个自定义的键比较器看下面的代码和计时结果

https://gist.github.com/4409734

Eq_cmp没有内联关键字

> perf_run 10000000 ;;
Real: 00:00:11.039, CPU: 00:00:11.029, GC gen0: 771, gen1: 3, gen2: 1
val it : unit = ()

在Eq_cmp上使用内联关键字

perf_run 10000000 ;;
Real: 00:00:01.319, CPU: 00:00:01.388, GC gen0: 1, gen1: 1, gen2: 1
val it : unit = ()
> 

为什么有这么大的差异?

提问于
用户回答回答于

添加inline关键字后,我可以在我的机器上重现3倍的性能提升。

ILSpy下反编译两个版本给出了几乎相同的C#代码。显着的区别在于两个平等测试:

// Version without inline
bool IEqualityComparer<Program.Pair<a>>.System-Collections-Generic-IEqualityComparer(Program.Pair<a> x, Program.Pair<a> y)
{
    a v@ = x.v@;
    a v@2 = y.v@;
    if (LanguagePrimitives.HashCompare.GenericEqualityIntrinsic<a>(v@, v@2))
    {
        a w@ = x.w@;
        a w@2 = y.w@;
        return LanguagePrimitives.HashCompare.GenericEqualityIntrinsic<a>(w@, w@2);
    }
    return false;
}

// Version with inline
bool IEqualityComparer<Program.Pair<int>>.System-Collections-Generic-IEqualityComparer(Program.Pair<int> x, Program.Pair<int> y)
{
    int v@ = x.v@;
    int v@2 = y.v@;
    if (v@ == v@2)
    {
        int w@ = x.w@;
        int w@2 = y.w@;
        return w@ == w@2;
    }
    return false;
}
用户回答回答于

你正在使用非常低效的通用比较。随着inline的通用性被删除,你可以直接使用int比较。

扫码关注云+社区

领取腾讯云代金券