Ma question vise à régler un différend avec mes collègues de travail sur le thème C++ vs C#.
Nous avons implémenté un serveur qui reçoit une grande quantité de flux UDP. Ce serveur a été développé en C++ en utilisant des sockets asynchrones et des E/S superposées en utilisant des ports de complétion. Nous utilisons 5 ports de complétion avec 5 threads. Ce serveur peut facilement gérer un débit de 500 Mbps sur un réseau gigabit sans aucune perte de paquets / erreur (nous n'avons pas poussé nos tests plus loin que 500 Mbps).
Nous avons essayé de réimplémenter le même type de serveur en C# et nous n'avons pas été en mesure d'atteindre le même débit entrant. Nous utilisons la réception asynchrone en utilisant ReceiveAsync
et un pool de SocketAsyncEventArgs
pour éviter la surcharge de créer un nouvel objet pour chaque appel de réception. Chaque SAEventArgs
a un tampon qui lui est attribué, ce qui nous évite d'avoir à allouer de la mémoire pour chaque réception. Le pool est très, très grand et nous pouvons mettre en file d'attente plus de 100 demandes de réception. Ce serveur n'est pas en mesure de gérer un débit entrant de plus de 240 Mbps. Au-delà de cette limite, nous perdons certains paquets dans nos flux UDP.
Ma question est la suivante : dois-je m'attendre à obtenir les mêmes performances en utilisant les sockets C++ et les sockets C# ? Je pense que les performances devraient être les mêmes si la mémoire est gérée correctement en .NET.
Question secondaire : quelqu'un connaît-il un bon article/référence expliquant comment les sockets .NET utilisent les ports de complétion d'E/S sous le capot ?