Ce qui est plus rapide - C# code unsafe brut ou C++
Je suis en train d'écrire un programme de traitement d'image pour effectuer le traitement en temps réel d'images vidéo. C'est en C# à l'aide de la Emgu.CV de bibliothèque (C#) qui encapsule la bibliothèque OpenCV dll (C++). Maintenant, je dois écrire mon propre algorithme spécial et il doit être aussi rapide que possible.
Qui sera une mise en œuvre plus rapide de l'algorithme?
-
L'écriture d'un "dangereux" de la fonction en C#
-
Ajout de la fonction de la bibliothèque OpenCV et en l'appelant par Emgu.CV
Je devine que C# dangereuses est plus lent, car il va à travers le compilateur JIT, mais serait la différence significatifs?
Edit:
Compilé .NET 3.5 sous VS2008
Vous devez vous connecter pour publier un commentaire.
il doit être aussi rapide que possible
Puis vous posez la mauvaise question.
Code en assembleur, avec des versions différentes pour chaque architecture de la variante de soutien.
Utiliser comme un guide à la sortie d'un bon compilateur C++ avec l'optimisation, car il sait probablement quelques trucs que vous n'avez pas. Mais vous serez probablement en mesure de penser à des améliorations, parce que le C++ n'est pas nécessairement transmettre le compilateur toutes les informations qui pourraient être utiles pour l'optimisation. Par exemple, le C++ n'est pas le C99 mot clé de restreindre. Bien que dans ce cas particulier, de nombreux compilateurs C++ (y compris MSVC) faire maintenant le soutenir, afin de l'utiliser lorsque cela est possible.
Bien sûr, si vous voulez dire, "je veux que ce soit rapide, mais pas au point d'aller à l'extérieur de C# ou C++", alors la réponse est différent 😉
Je m'attends C# pour au moins l'approche de la performance d'apparence semblable C++, dans beaucoup de cas. Je suppose bien sûr que le programme sera exécuté assez longtemps que le temps JIT prend elle-même est sans importance, mais si vous êtes de traitement de beaucoup de vidéo alors que cela semble probable. Mais je voudrais aussi qu'il y ait certaines choses qui, si vous les faites à risque C#, sera beaucoup plus lent que l'équivalent chose en C++. Je ne sais pas ce qu'ils sont, parce que toute mon expérience de l'Ece est en Java plutôt que de CLR. Il peut également y avoir des choses qui sont plus lents en C++, par exemple, si votre algorithme fait des appels de nouveau dans le code C#.
Malheureusement, la seule façon d'être sûr de savoir comment fermer c'est d'écrire à la fois et de tester ce qui manque le point que l'écriture de la version C++ est un tas d'effort supplémentaire. Cependant, vous pourriez être en mesure d'obtenir une idée approximative par le piratage rapide code, qui se rapproche de la transformation que vous voulez faire, sans nécessairement faire tout cela, ou la droite. Si vous algorithme va faire une boucle sur tous les pixels et faire un peu de FP ops par pixel, puis de piratage, ensemble, un brut de référence devrait prendre toutes d'une demi-heure.
Habituellement, je ne vous le conseille de commencer à penser "ce doit être aussi rapide que possible". Les exigences doivent être réalisables, et par définition "comme X que possible" n'est à la limite possible. Exigences doivent également être testable, et "comme X que possible" n'est pas testable, sauf si vous savent quelque sorte un maximum théorique. Plus conviviale exigence est "ce besoin de traiter des images vidéo de telle ou telle résolution en temps réel sur telle ou telle vitesse du PROCESSEUR", ou "ce doit être plus rapide que notre principal concurrent du produit". Si la version C# n'est que, avec un peu de réserve pour compte de l'imprévu questions mineures dans l'utilisateur de l'installation, puis le travail est accompli.
Il dépend de l'algorithme, la mise en œuvre, le compilateur C++ et le compilateur JIT. Je suppose que dans la plupart des cas, l'implémentation C++ sera plus rapide. Mais cela peut changer.
Le compilateur JIT pouvez optimiser votre code pour la plate-forme, votre code est en cours d'exécution sur la place de la moyenne pour toutes les plates-formes de votre code peut s'exécuter que le compilateur C++ n'. C'est quelque chose que les nouvelles versions du compilateur JIT sont de plus en plus bon et peut dans certains cas donner JITted code un avantage. Donc la réponse n'est pas aussi claire que vous pourriez vous attendre. Le nouveau Java hotspot compilateur cela très bien par exemple.
D'autres situations où le code géré peut faire mieux que le C++ est l'endroit où vous avez besoin d'allouer et de libérer beaucoup de petits objets. L' .net runtime preallocates de gros blocs de mémoire qui peuvent être réutilisés de sorte qu'il n'a pas besoin d'appel dans l'os à chaque fois que vous avez besoin d'allouer de la mémoire.
Je ne suis pas sûr dangereux C# s'exécute beaucoup plus rapidement que la normale C#. Vous aurez à essayer cela aussi.
Si vous voulez savoir quelle est la meilleure solution pour votre situation, vous aurez à essayer les deux et de mesurer la différence. Je ne pense pas qu'il y aura plus de
C# est généralement plus lent que C++. Des contrôles sont effectués dans le code managé. Ces sont ce faire il a réussi, après tout. C++ n'a pas à vérifier si les limites d'un tableau ont été dépassés par exemple.
De mon expérience, à l'aide de mémoire fixe aide beaucoup. Il y a un nouveau Système.IO.UnmanagedMemoryAccessor classe .NET 4.0 qui peut aider dans l'avenir.
Langues n'ont pas de "vitesse". Il dépend du compilateur et le code. Il est possible d'écrire inefficace code dans n'importe quelle langue, et un habile compilateur va générer près-un code optimal, peu importe la langue de la source.
Le seul vraiment inévitable facteur de performance entre C# et C++, c'est que C# apps avez à faire plus au démarrage (charge l' .NET framework et peut-être JIT peu de code), donc, toutes choses étant égales par ailleurs, ils vont lancer un peu plus lent. Après, ça dépend, et il n'y a pas de raison fondamentale pour qu'une langue doit toujours être plus rapide que l'autre.
Je suis pas au courant des raisons pour lesquelles dangereux C# doit être plus rapide que le coffre-fort. En général, la sécurité est bonne parce qu'elle permet au compilateur de faire quelques beaucoup plus forte des hypothèses, et en toute sécurité pourrait être plus rapide. Mais encore une fois, cela dépend du code de la vous êtes de la compilation, le compilateur que vous utilisez et une douzaine d'autres facteurs.
En bref, donner à l'idée que vous pouvez mesurer la performance d'une langue. Vous ne pouvez pas. Une langue n'est jamais "rapide" ou lente". Il n'a pas une vitesse.
Si vous allez mettre en œuvre un algorithme de manière standard, je pense que c'est sans importance.
Mais certaines langues ont des fixations, des api ou des bibliothèques qui peuvent vous donner non standart coup de pouce.
Déterminez si vous pouvez utiliser le GPU (carte graphique - nvidia et ati fournir le CUDA et CTM cadres et est constamment à la direction de la standarisation de l'effort de le khronos group (openGL). Un pressentiment me dit aussi que amd va ajouter au moins un streaming de cœurs de processeur dans leurs futures puces. Je pense donc qu'il est tout à fait une promesse dans ce domaine.
Essayez de voir si vous pouvez exploiter les instructions SSE, il existe des bibliothèques autour de -plus en C++ ou en C - qui fournissent pratique api, consultez Intel site pour la pratique bibliothèques optimisées je ne me souviens "Intel Performance Primitives" et "Math Kernel".
Mais sur la politique de côté, de faire intégrer votre algorithme en OpenCV alors que d'autres peuvent également en bénéficier.
C'est une bataille qui fait rage à jamais. C par rapport à C++ par rapport à C# contre quoi que ce soit.
En C#, la notion de risque est pour déverrouiller "dangereux" des opérations. c'est à dire, l'utilisation de pointeurs, et d'être en mesure de lancer pour annuler les pointeurs, etc, que vous pouvez dans le C et le C++.
Très dangereux, et très puissant! Mais vaincre ce que le C# a été basé.
Vous trouverez que, de nos jours, Microsoft a fait des progrès dans le sens de la performance, surtout depuis la sortie de la .NET, et la prochaine version de .NET sera effectivement soutenir inline méthodes, comme vous pouvez le avec C++. Cela permettra d'accroître la performance des situations très spécifiques. J'ai hate que ça ne va pas être un c#, mais un méchant attribut le compilateur ramasse sur - mais vous ne pouvez pas tout avoir.
Personnellement, je suis en train d'écrire un jeu avec C# et géré DirectX (pourquoi ne pas XNA?? au-delà de la portée de ce post). Je suis en utilisant le code unsafe dans le graphique de situations, ce qui entraîne un clin d'œil dans la direction de ce que les autres ont dit.
C'est seulement parce que les pixels d'accès est rediculously lent avec GDI++ que j'ai été conduit à chercher des alternatives. Mais dans l'ensemble, le compilateur c# est assez maudits bon, et pour le code des comparaisons (vous pouvez trouver des articles), vous trouverez la performance est très comparable à c++.
Qui ne veut pas dire qu'il n'y a pas une meilleure façon d'écrire le code.
À la fin de la journée, personnellement, je vois le C, le C++ et le C# comme environ la même vitesse lors de l'exécution. C'est juste que dans certaines situations douloureuses, où vous voulez travailler très étroitement avec le matériel sous-jacent ou très proches de celles de pixels, que vous trouverez un notable avantage pour le C/C++ foule.
Mais pour les affaires, et la plupart des choses de nos jours, le C# est un concurrent sérieux, et en restant dans l'environnement "sûr" est certainement un bonus.
Lorsque le pied à l'extérieur, vous pouvez obtenir la plupart des choses avec un code, que j'ai - et le garçon, ai-je allé à certains extrêmes! Mais était-ce la peine? Probablement pas. Personnellement, je me demande si je ne l'aurais cru plus le long des lignes de temps critique de code en C++, et tous l'Orienté-Objet, coffre-fort trucs en C#. Mais j'ai de meilleures performances que j'ai pensé que j'allais avoir!
Aussi longtemps que vous êtes prudent avec la quantité de l'interopérabilité des appels que vous faites, vous pouvez obtenir le meilleur des deux mondes. J'ai personnellement éviter cela, mais je ne sais pas à quel coût.
Donc une approche que je n'ai pas essayé, mais j'aimerais entendre des aventures, à l'aide de C++.NET afin de développer une bibliothèque - qui serait plus vite que le c#'s dangereux pour ces graphiques situations? Comment comparer natif C++ le code compilé? Maintenant, il y a une question!
Hmm..
Si vous connaissez votre environnement et que vous utilisez un bon compilateur (pour le traitement de la vidéo sur windows, Intel C++ compiler est probablement le meilleur choix), C++ va battre C# les mains vers le bas pour plusieurs raisons:
malloc()
ou de toute autre dynamique de l'allocateur est non déterministe, et presque tous les non-natifs de langues de la force plus lourd l'utilisation du tas, et donc plus lourd de l'allocation).Si vous utilisez un mauvais compilateur, ou si vous ne pouvez pas cibler un bon chipset, tous les paris sont éteints.
Je suis un peu en retard dans la réponse mais je peux vous donner un cas anecdotique. Nous avons eu de la matrice de multiplication des routines qui ont été à l'origine codé en C# à l'aide de pointeurs et de code non sécurisé. Cela s'est avéré être un goulot d'étranglement dans notre application, et nous avons ensuite utilisé l'épinglage+P/Invoke pour appeler dans une version C++ de la multiplication de Matrice de routine et a obtenu un facteur de 2 amélioration. C'était il y a longtemps avec .NET 1.1, les choses pourraient être mieux maintenant. Comme l'autre, ce prouve rien, mais c'était un exercice intéressant.
Je suis également d'accord avec thAAAnos, si vous algorithme a vraiment à être "aussi vite que possible" effet de levier de chargement initial ou, si vous devez, envisager une mise en œuvre du GPU.
Pour être honnête, langue que vous écrivez n'est pas aussi important que ce que les algorithmes que vous utilisez (OMI, de toute façon). Peut-être en allant en code natif vous pourrait rendre votre application plus rapide, mais il peut également le rendre plus lent--ça dépend du compilateur, la façon dont les programmes sont écrits, ce qui sorte de l'interopérabilité des frais que vous auriez engager si vous utilisez un environnement mixte, etc. Vous ne pouvez pas vraiment dire sans profilage il. (et, d'ailleurs, avez-vous profilé de votre application? Connaissez-vous vraiment où c'est passer du temps?)
Un meilleur algorithme est complètement indépendante de la langue que vous choisissez.
En cours d'exécution sur le PROCESSEUR est toujours plus rapide que de courir sur une machine virtuelle sur le CPU. Je ne peux pas croire que des gens essaient de soutenir le contraire.
Par exemple, nous en avons assez lourd traitement de l'image des travaux sur notre serveur web qui l'a mis en file d'attente. D'abord afin d'obtenir ce travail, nous avons utilisé PHP GD fonctions.
Ils ont été lents comme l'enfer. Nous avons réécrit la fonctionnalité nécessaire en C++.