NDK vs performance JAVA

Un corps a-t-il une hypothèse à quelle vitesse sera le code C avec NDK avec les mêmes calculs que le code java? (Le cas échéant)

Disons que je fais des calculs X (les mêmes calculs) en Y secondes dans le code java.
Combien de calculs X puis-je faire dans les mêmes Y secondes via le code C dans NDK?
1.2?
2.7?
Un numéro de récapitulation?

  • Configuration du package de support Android v7 pour eclipse - GridLayout
  • Recommandations pour .NET Web Service Format / Protocole pour Android, iPhone, etc. intégration
  • Comment créer Android VectorDrawables depuis Illustrator (ou un outil similaire)?
  • Java.lang.IllegalStateException: FirebaseApp avec le nom
  • Impossible de définir un drapeau débogable dans AndroidManifest.xml
  • Android Studio 2.2 Aperçu 1 Problèmes de rendu
  • Disons que Calc est B = L / A + C / D (le même pour tous les calculs X).

    MODIFIER:

    Pourquoi je pose ça?
    Parce que je considère déplacer mes cadres de caméra de traitement java vers le code C. Pour de plus grandes opportunités de résolution

  • Lancez la version personnalisée de Gradle Android dans Android Studio
  • Android Studio et Gradle build error
  • ORMLite sur Android en utilisant des annotations javax.persistence
  • Android: comment générer une fréquence?
  • Android Webview POST
  • Comment mettre l'identifiant de session Cookie dans la demande de volley?
  • 2 Solutions collect form web for “NDK vs performance JAVA”

    Comme personne d'autre ne veut toucher ce sujet, puisqu'il ne considère pas sérieux pour tenter de le répondre, j'irai:

    • Java compile à bytecode, et le bytecode compile au code natif par le JIT.
    • C compile directement le code natif.

    La différence est vraiment l'étape de compilation supplémentaire, et en théorie, java devrait faire un meilleur travail que votre compilateur C, et voici pourquoi:

    • Java peut insérer des calculs de statistiques dans le code natif généré, puis, après un certain temps, le régénérer pour l'optimiser contre les chemins d'exécution actuels dans votre code!

    Ce dernier point semble génial, mais java vient avec quelques compromis:

    • Il faut que GC fonctionne pour nettoyer la mémoire
    • Il se peut qu'il contienne quelques imprécisions par rapport à l'original.

    GC copie des objets vivants et lance tous les morts, car GC n'a pas besoin de faire quoi que ce soit pour le mort, seul pour les live, le GC en théorie est plus rapide que le malloc / boucle libre normale pour les objets.

    Cependant, une chose est oubliée par la plupart des défenseurs de Java et c'est que rien ne dit que vous devrez malloc / libérer chaque instance d'objet lors du codage C. Vous pouvez réutiliser la mémoire, vous pouvez mallouer des blocs de mémoire et des blocs de mémoire gratuits contenant des milliers de temporairement Des objets d'une seule fois.

    Avec de gros tas sur Java, le temps GC augmente, ajoutant le temps de décrochage. Dans certains logiciels, il est totalement correct avec les temps de décrochage pendant le cycle de nettoyage de GC, dans d'autres, il provoque des erreurs fatales. Essayez de conserver votre logiciel pour répondre sous un nombre défini de millisecondes lors d'une GC, et vous verrez de quoi je parle.

    Dans certains cas extrêmes, le JIT peut également choisir de ne pas JIT le code. Cela se produit quand une méthode JITed serait grande, 8K si je me souviens bien. Une méthode non JITed a une pénalité d'exécution dans la gamme de 20000% (200 fois plus lente, au moins chez notre client). JIT est également tourné lorsque les JVMs CodeCache commencent à se remplir (si vous continuez de charger de nouvelles classes dans la JVM, cela peut se produire, se produisent également sur le site du client). À un moment donné, les statistiques de JIT ont également réduit la concurrence sur une machine de 128 core pour des performances essentiellement simples.

    En Java, le JIT a une durée spécifique pour compiler le code bytecode en code natif, il n'est pas correct de dépenser toutes les ressources de processeur pour le JIT, puisqu'il est en parallèle avec le code qui fonctionne réellement dans votre programme. Dans C, le compilateur peut fonctionner aussi longtemps qu'il faut cracher ce qu'il pense être le code le plus optimisé possible. Il n'a aucun impact sur le temps d'exécution , là où il a Java.

    Ce que je dis, c'est vraiment ceci:

    • Java vous en donne plus, mais ce n'est pas toujours à la hauteur de la façon dont il fonctionne.
    • C vous donne moins, mais c'est à vous de savoir comment cela fonctionne.

    Donc, pour répondre à votre question:

    • Aucune sélection de C sur Java ne rendra votre programme plus rapide

    Si vous ne respectez que des calculs simples sur un tampon de préallocation, les compilateurs Java et C devraient cracher sur le même code.

    Vous ne obtiendrez probablement aucun commentaire sur n'importe qui. Les questions sont beaucoup plus complexes qu'elles ne le ressemblent.

    Il n'y a aucun problème pour mettre le même nombre de polys dans OpenGL, qu'il soit avec NDK ou SDK. Après tout, ce sont les mêmes appels OpenGL. Le temps de rendre les polys (dans un lot) exete le temps de la fonction appel en surcharge par ordre de grandeur. Donc, il est généralement complètement négligeable.

    Mais dès qu'une application devient plus complexe et effectue des calculs sérieux (AI, Scene Graph Management, Culling, Traitement d'image, Number Crunching, etc.), la version native sera généralement beaucoup plus rapide.

    Et il y a une autre chose: outre le problème fondamental, il n'y a pas de JIT Compilation. Le dalvikvm actuel avec son compilateur semble être très basique, sans faire d'optimisations – même pas les plus basiques!

    Il y a cette vidéo (très bonne): Google I / O 2009 – Écriture de jeux en temps réel pour Android Une fois que je l'ai vu, il était clair pour moi que je vais certainement utiliser C ++ avec le NDK.

    Par exemple: Il parle de la surcharge des appels de fonction "Ne pas utiliser les appels de fonction". … Donc oui, nous sommes de retour – avant 1970 et commencer à parler du coût de la programmation structurée et de l'avantage de performance d'utiliser uniquement les vars et les gotos mondiaux.

    La collecte des ordures est un véritable problème pour les jeux. Donc, vous passerez beaucoup de temps à penser comment vous pouvez l'éviter. Même le formatage d'une chaîne créera de nouveaux objets. Donc, il existe des conseils comme: ne pas afficher le FPS! Sérieusement, si vous connaissez C ++, il est probablement plus facile de gérer votre mémoire avec de nouvelles et de supprimer que de modifier votre architecture afin de réduire / éviter les collectes de déchets.

    Il semble que si vous voulez programmer un jeu en temps réel non trivial, vous perdez tous les avantages de Java. N'utilisez pas Getters and Setters, N'utilisez pas les appels de fonction. Évitez toute abstraction, etc. GRAVEMENT?

    Mais revenez à votre question: l'avantage de performance de NDK vs SDK peut être de 0 à 100%. Tout dépend.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.