2010-03-04 5 views
3

Je dois écrire un logiciel qui fera beaucoup de maths. La plupart du temps ce sera la multiplication matricielle avec des entiers pour calculer DCT. Combien de temps devrais-je attendre que le code s'exécute en natif c par rapport à VB .Net? Facteur de 2, facteur de 10, facteur de 1000 ...? Est-ce que quelqu'un a essayé et recueilli des statistiques à ce sujet?Quelle est la vitesse de VB .net par rapport au code natif pour l'arithmétique?

+1

Je n'ai pas de statistiques strictes, mais je ne m'attendrais pas à ce qu'il y ait une grande différence ... Le MSIL est compilé en code machine de toute façon en cours d'exécution ... –

Répondre

0

Le code .NET est compilé en code natif par le compilateur JIT, de sorte que vous obtenez du code natif dans les deux cas.

La différence est que le code C a un peu moins frais généraux autour des calculs, vous devriez peut-être attendre une différence de performace du facteur 2.

+0

"overhead around the calculations" parler de? Le code .net qui manipule avec des structures de données de base comme des entiers est compilé sous une forme très efficace – Andrey

+1

@Andrey, je pense que les vérifications de dépassement d'entier ne sont qu'un exemple. –

+1

@Andrey: VB fait un travail supplémentaire ici et là, comme par exemple initialiser toutes les variables locales à zéro. Ensuite, il y a une surcharge qui vient avec la façon de faire les choses, par exemple la vérification de l'indice lorsque vous lisez un entier à partir d'un tableau. Dans .NET, il n'est pas possible de lire en dehors du tableau, tandis que C vous tendra aveuglément tout ce que vous pointez. – Guffa

1

Code .Net est JIT compilé en code natif avant l'exécution, il ne devrait pas être plus lent que le code natif en général. Je m'attendrais à un facteur < 10.

En outre, les techniques d'optimisation adaptative profilent le code lors de son exécution, en obtenant plus d'informations qu'un compilateur statique typique. Ainsi, le JIT peut prendre des décisions plus éclairées pour d'autres optimisations

+0

Existe-t-il un moyen de voir le code natif compilé JIT? – Eyal

+0

Le débogueur peut aider avec cela. Pas sûr de JIT, mais je suppose que ce ne serait pas très différent de celui-ci: http://www.programmingforums.org/post166503.html –

0

VB est 93,7% aussi rapide que C. Si vous choisissez, vous choisissez le bon scénario. En fait, si votre C natif inclut des appels réguliers à malloc() et à free(), tout type de langage Gargage Collected comme VB.Net va littéralement faire tourner des cercles autour de lui. Le GC peut être 10 fois plus rapide que les mallocs dans vos boucles internes.

Si vous décomposez et utilisez C, essayez de réutiliser les structures que vous avez déclarées une seule fois au lieu d'en créer de nouvelles, pour éviter ce problème. Cela peut être bénéfique même en VB si votre solution s'y prête. Cependant, il sera plus difficile de programmer et GC est très rapide. En ce qui concerne les contrôles de limites/débordements, si la vitesse est importante et que les tests ont révélé qu'ils ne se produisent pas, et que vous ne risquez pas la vie ou des millions d'erreurs, ils sont une perte de temps. Mais si vous ne pouvez pas vous en débarrasser, votre temps est probablement encore plus précieux dans une langue avec laquelle vous pouvez programmer plus rapidement. Si vous attendez une taille et une utilisation importantes, il est avantageux de fractionner la tâche avec un programme de contrôle et de stocker les 'définitions de tâches' allouées dans un répertoire partagé avec un solveur de fichier par tâche ou une base de données. Ensuite, vous pouvez exécuter un solveur par processeur (2 par CPU HT), ou des ordinateurs en réseau. Soyez fatigué des structures de file d'attente - il est difficile d'atomiquement 'Mark-Pris-Et-Get-Data-If-Not-Taken'. Vous savez combien de résolveurs de tâches vous allez commencer. Je l'ai fait avec un utilitaire d'imagerie que je développe, c'était beaucoup plus facile que prévu, et il a crémé la version précédente. De plus, si vous utilisez plusieurs processus avec un domaine de problème correctement divisible, vous évitez le fardeau de programmation léger à important du multithreading. Ou convaincre vos collègues que vos accolades sont au bon endroit. Paix.

+2

Que signifie "VB est 93,7% aussi rapide que C"? 93,7%, où avez-vous obtenu ce nombre? – AMissico

+0

"bounds/overflow checks", lecteur, notez que vous pouvez désactiver les contrôles de débordement d'entier de VB.NET, ce qui donne à VB.NET les mêmes performances que C#. – AMissico

+2

Comment est-ce qu'un type de code LITEREMENT court cercles autour d'un autre? J'aimerais regarder ça. – Dinah

Questions connexes