Performances NDK vs JAVA
Est tout le corps ont une hypothèse à quelle vitesse va être un code C avec le NDK avec les mêmes calculs puis code java?(le cas échéant)
permet de dire que je suis en train de faire X calculs(même calcul) en Y secondes dans du code java.
Combien de X calculs puis-je faire dans le même Y secondes à travers le code C dans NDK?
1.2 ?
2.7 ?
tout deviner?
Permet de dire que le calcul est B=L/A +C/D (le même que pour tout X de calculs).
EDIT:
Pourquoi je demande cela?
parce que je considère que de déplacer mon java de traitement d'images de la caméra pour le code C.pour les grandes résolutions possibilités
source d'informationauteur yarin
Vous devez vous connecter pour publier un commentaire.
Car personne d'autre ne veulent toucher à ce sujet, depuis sa considérons pas grave pour essayer d'y répondre, je vais avoir un aller:
La différence sont vraiment extra étape de compilation, et dans la théorie de java devrait faire un meilleur travail de votre compilateur C, et voici pourquoi:
Ce dernier point que ça a l'air génial, java toutefois venir avec quelques compromis:
GC copies objets vivants et les jette tous morts, depuis le GC n'a pas besoin de faire quoi que ce soit pour les morts que pour les vivants, GC, en théorie, est plus rapide que la normale malloc/free boucle pour les objets.
Cependant, une chose est oublié par la plupart de Java et de défenseurs de la qui est que rien ne dit que vous aurez à malloc/free chaque instance de l'objet lors du codage C. Vous pouvez réutiliser la mémoire, vous pouvez malloc de la mémoire et de blocs de mémoire libre des blocs contenant des milliers de temporairement des objets sur un aller.
Avec des gros tas en Java, GC temps augmente, l'ajout de décrochage temps. Dans certains logiciels, il est tout à fait OK avec décrochage fois au cours de GC cycle de nettoyage, dans d'autres, il provoque des erreurs fatales. Essayez de garder votre logiciel à réagir selon un nombre défini de millisecondes quand un GC qui se passe, et vous verrez de quoi je parle.
Dans certains cas extrêmes, l'équipe peut aussi choisir de ne pas JIT le code. Cela se produit lorsqu'une JITed de la méthode au grand, 8K si je me souviens correcte. Non JITed méthode a un temps d'exécution de la pénalité dans la gamme de 20000% (200 fois plus lent qui est, au moins à notre client qu'il était). JIT est également activé lorsque la Jvm CodeCache commence à être pleine (si l'option conserver le chargement de nouvelles classes dans la JVM, encore et encore, cela peut arriver, aussi se produire chez les clients).
À un moment, JIT statistiques aussi une concurrence réduite sur un 128 de base de la machine fondamentalement la seule base de la performance.
En Java, l'équipe a un montant spécifique de temps pour compiler le bytecode en code natif, il est pas OK pour passer toutes les ressources du PROCESSEUR pour l'équipe, car il fonctionne en parallèle avec le code de faire le travail de votre programme. En C, le compilateur peut courir aussi longtemps que il a besoin de cracher ce qu'il pense est le plus optimisé le code qu'il peut. Il n'a pas d'impact sur le temps d'exécutionoù en Java.
Ce que je dis, c'est vraiment cela:
Donc, pour répondre à votre question:
Si vous ne gardez de simples mathématiques sur une préallouer tampon, Java et en C compilateurs doivent cracher sur le même code.
Vous ne sera probablement pas avoir une réponse de quelqu'un. La question est beaucoup plus complexe que ça ressemble.
Il n'est pas un problème de mettre le même nombre de polys dans OpenGL être avec le NDK ou SDK. Après tout, c'est juste même les appels OpenGL. Le temps de rendre les polys (dans un lot) exeeds moment de l'appel de la fonction de surcharge par des ordres de grandeur. Donc, il est généralement complètement négligeable.
Mais dès qu'une application devient de plus en plus complexe et effectue quelques graves calculs(AI, Scène Graphique de Gestion, l'Abattage, le traitement d'Image, de nombreux calculs, etc.) la version native seront généralement beaucoup plus rapide.
Et il y a autre chose: à Côté du problème fondamental qu'il n'existe actuellement pas de Compilation JIT.
L'actuel dalvikvm avec son compilateur semble être très basique, sans faire la moindre optimisation - pas même le plus basique!
Il y a ce (très bon) vidéo: Google I/O 2009 - l'Écriture en Temps Réel des Jeux pour Android
Après je l'ai vu, il était clair pour moi, je vais certainement utiliser le C++ avec le NDK.
Par exemple: Il parle à propos de la surcharge d'appels de la fonction "Ne pas utiliser les appels de fonction".
... Alors oui, nous sommes de retour - avant 1970 et de commencer à parler du coût de la programmation structurée et la performance de l'avantage de n'utiliser que les variables globales et les gotos.
La collecte des ordures est un problème réel pour les jeux. Ainsi vous passerez beaucoup de votre temps à penser comment vous pouvez l'éviter. Même le formatage d'une chaîne de créer de nouveaux objets. Il y a donc des conseils, comme: ne pas afficher les FPS!
Sérieusement, si vous savez C++, il est probablement plus facile à gérer vous la mémoire avec new et delete de peaufiner votre architecture pour réduire/éviter la collecte des poubelles.
Il semble que si vous voulez un programme non trivial temps réel jeu, vous perdez tous les avantages de Java. Ne pas utiliser les Accesseurs et Mutateurs, Ne pas utiliser les appels de fonction. Éviter toute Abstraction, etc. SÉRIEUSEMENT?
Mais pour en revenir à votre question: L'avantage de performance de NDK vs SDK peut être quelque chose de 0-10000%. Tout dépend de la situation.