Depuis que F # 2.0 fait partie de VS2010, je m'intéresse à F #. Je me demandais à quoi ça sert de l'utiliser. J'avais lu un peu et j'ai fait un benchmark pour mesurer les fonctions d'appel. Je l'ai utilisé la fonction Ackermann :)Performances de l'appel de fonction .Net (C# F #) VS C++
C#
sealed class Program
{
public static int ackermann(int m, int n)
{
if (m == 0)
return n + 1;
if (m > 0 && n == 0)
{
return ackermann(m - 1, 1);
}
if (m > 0 && n > 0)
{
return ackermann(m - 1, ackermann(m, n - 1));
}
return 0;
}
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Console.WriteLine("C# ackermann(3,10) = " + Program.ackermann(3, 10));
stopWatch.Stop();
Console.WriteLine("Time required for execution: " + stopWatch.ElapsedMilliseconds + "ms");
Console.ReadLine();
}
}
C++
class Program{
public:
static inline int ackermann(int m, int n)
{
if(m == 0)
return n + 1;
if (m > 0 && n == 0)
{
return ackermann(m - 1, 1);
}
if (m > 0 && n > 0)
{
return ackermann(m - 1, ackermann(m, n - 1));
}
return 0;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
clock_t start, end;
start = clock();
std::cout << "CPP: ackermann(3,10) = " << Program::ackermann(3, 10) << std::endl;
end = clock();
std::cout << "Time required for execution: " << (end-start) << " ms." << "\n\n";
int i;
std::cin >> i;
return 0;
}
F #
// Ackermann
let rec ackermann m n =
if m = 0 then n + 1
elif m > 0 && n = 0 then ackermann (m - 1) 1
elif m > 0 && n > 0 then ackermann (m - 1) (ackermann m (n - 1))
else 0
open System.Diagnostics;
let stopWatch = Stopwatch.StartNew()
let x = ackermann 3 10
stopWatch.Stop();
printfn "F# ackermann(3,10) = %d" x
printfn "Time required for execution: %f" stopWatch.Elapsed.TotalMilliseconds
Java
public class Main
{
public static int ackermann(int m, int n)
{
if (m==0)
return n + 1;
if (m>0 && n==0)
{
return ackermann(m - 1,1);
}
if (m>0 && n>0)
{
return ackermann(m - 1,ackermann(m,n - 1));
}
return 0;
}
public static void main(String[] args)
{
System.out.println(Main.ackermann(3,10));
}
}
Un alors
C# = 510ms
C++ = 130ms
F # = 185ms
Java = Stackoverflow :)
Est-ce la puissance de F # (sauf petite quantité de code) Si nous voulons utiliser .Net et gagner une exécution un peu plus rapide? Puis-je optimiser l'un de ces codes (en particulier F #)?
MISE À JOUR. Je me suis débarrassé de Console.WriteLine et exécuter le code C# sans le débogueur: C# = 400ms
Vos temps ont inclus le temps pris pour JIT la langue intermédiaire. En outre, prenez des méthodes comme Console.WriteLine() en dehors de votre benchmark, car elles sont très lentes. –
"Exécutez votre méthode une fois avant d'exécuter le test de performance.Vos temps ont inclus le temps pris pour JIT la langue intermédiaire." Est-ce? j'ajoute let dd = ackermann 3 10 et me donne 7 ms supplémentaires. pour C# n'a pas changé :) "Aussi, prenez des méthodes comme Console.WriteLine() en dehors de votre banc d'essai, car ils sont très lents." Bonne idée mais n'a pas accéléré –
Ouais, F # et C# sont tous les deux compilés JIT - exécutez la méthode deux fois et utilisez le second benchmark. La raison en est que le compilateur JIT optimise le code machine pour les capacités spécifiques de votre processeur (qualité informatique CISC) – Aaronontheweb