Следующая программа F # определяет функцию, которая возвращает меньшую из двух пар int, представленных как структурные кортежи, и для запуска требуется 1.4s:
let [<EntryPoint>] main _ =
let min a b : int = if a < b then a else b
let min (struct(a1, b1)) (struct(a2, b2)) = struct(min a1 a2, min b1 b2)
let mutable x = struct(0, 0)
for i in 1..100000000 do
x <- min x (struct(i, i))
0
Если я декомпилирую CIL на С#, я получаю этот код:
public static int MinInt(int a, int b)
{
if (a < b)
{
return a;
}
return b;
}
public static System.ValueTuple<int, int> MinPair(System.ValueTuple<int, int> _arg2, System.ValueTuple<int, int> _arg1)
{
int b = _arg2.Item2;
int a = _arg2.Item1;
int b2 = _arg1.Item2;
int a2 = _arg1.Item1;
return new System.ValueTuple<int, int>(MinInt(a, a2), MinInt(b, b2));
}
public static void Main(string[] args)
{
System.ValueTuple<int, int> x = new System.ValueTuple<int, int>(0, 0);
for (int i = 1; i <= 100000000; i++)
{
x = MinPair(x, new System.ValueTuple<int, int>(i, i));
}
}
Перекомпиляция с компилятором С# занимает всего 0,3 с, что на 4 раза быстрее, чем исходный F #.
Я не понимаю, почему одна программа намного быстрее, чем другая. Я даже декомпилировал обе версии для CIL и не вижу никакой очевидной причины. Вызов функции С# Min
из F # дает ту же (плохую) производительность. CIL внутренней петли вызывающего абонента буквально идентичны.
Может ли кто-нибудь объяснить эту существенную разницу в производительности?