Question

Je dois écrire un logiciel qui va faire beaucoup de mathématiques. La plupart du temps, il sera multiplication matricielle avec des nombres entiers pour calculer TCD. Quel gain de temps dois-je attendre le code exécuté en c natif par rapport à VB .Net? Facteur de 2, facteur de 10, facteur 1000 ...? Quelqu'un at-il des statistiques essayé et recueillies sur ce sujet?

Était-ce utile?

La solution

Le code .NET est compilé en code natif par le compilateur JIT, de sorte que vous obtenez le 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, donc vous devriez vous attendre peut-être une différence de performace du facteur 2.

Autres conseils

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

De plus, les techniques d'optimisation adaptative le profil le code tel qu'il fonctionne, obtenir plus d'informations qu'un compilateur statique typique. Ainsi, le JIT peut prendre des décisions plus éclairées pour d'autres optimisations

VB est 93,7% aussi vite que C. Si vous choisissez le bon scénario.

En fait, si votre « C native » comprend les appels réguliers à malloc () et free (), toute sorte de langue Gargage Collected comme VB.Net va littéralement courir des cercles autour d'elle. GC peut être 10 fois plus rapide que mallocs dans vos boucles internes.

Si vous décomposez et utilisez C, essayez de réutiliser des structures qui vous ont déclaré qu'une fois au lieu de faire de nouveaux, pour éviter ce problème. Cela peut être bénéfique même dans VB si votre solution s'y prête. Cependant, il sera plus difficile à programmer et GC est très rapide.

En ce qui concerne les contrôles des limites / débordement, si la vitesse est importante et les tests ont révélé qu'ils ne se produisent pas, et vous ne risquez pas la vie ou des millions d'une erreur ou Abend, ils sont une perte de temps. Mais si vous ne pouvez pas vous débarrasser d'eux, votre temps est probablement encore plus précieux dans une langue avec laquelle vous pouvez programmer plus rapidement.

Si vous attendez la taille grave et l'utilisation, il est utile de diviser la tâche avec un programme de contrôle et de stocker les « alloués définitions de tâches » dans un répertoire partagé avec un fichier par solveur de tâches, ou une base de données. Ensuite, vous pouvez exécuter un solveur par processeur (2 par CPU HT) ou les ordinateurs du réseau. Lassons des structures de file d'attente - il est difficile de atomicly Mark-taken-et-Get-Data-Si-non-taken. Vous savez combien de solveurs tâche que vous allez commencer. Je l'ai fait avec un utilitaire d'imagerie je développe, il était beaucoup plus facile que prévu, et il crémé la version précédente. De plus, si vous utilisez plusieurs processus avec un domaine de problème correctement divisibles, vous évitez la charge de la programmation légère à importante de multithreading. Ou convaincre vos collègues que vos accolades culrly sont au bon endroit. La paix.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top