2011-04-04 1 views
3

Est-ce que cela a du sens en termes de meilleures performances pour construire un cache de type LRU en C/C++ et obtenir Java pour y accéder via JNI?Cache dans C accédé via JNI

+0

Cela dépend entièrement de ce que vous mettez en cache. Mettre en œuvre, profiler, observer. –

Répondre

6

Douteux

JVMs faire le travail tout à fait décent ces jours-ci, d'autant plus que toutes les applications qui ont besoin d'un cache probablement rester assez longtemps pour que la machine virtuelle Java pour optimiser un peu. Quel que soit votre code de cache gagnerait en vitesse en évitant la JVM, vous perdriez probablement pousser des objets dans JNI. Sans oublier les difficultés inhérentes au développement, à la maintenance et au déploiement du code C++ par rapport à Java. Ou les dangers de réinventer la roue en déployant votre propre cache - il doit y avoir quelque chose que vous pourriez utiliser au lieu de déployer le vôtre.

+0

Tandis que tout le monde répondait exactement à ce que je cherchais, vous avez eu le plus de votes. Donc, je vais vous donner la réponse :) et upvote tout le monde aussi. Merci tout le monde. –

1

Le compilateur JIT est assez rapide. Il rivalise avec le code compilé.

Votre meilleur pari est de l'implémenter dans tout ce qui est le plus facile à développer, puis de le profiler pour identifier les problèmes de performance. Ensuite, voyez ce que vous pouvez faire à partir de là.

1

Improbable.

Le cache fonctionne avec les objets dans le tas. L'allocation et la désallocation de mémoire en tas dans C++ ne sont pas meilleures que celles de Java. En fait, dans un test de courte durée, le cache Java gagnerait probablement en raison du GC reporté (le C++ doit libérer la mémoire explicitement et immédiatement).

D'autres opérations (put, find) devraient être à égalité avec C++ en raison de JIT (ce sont des points chauds, et seront bientôt compilés en code natif). Remarque: comme toujours avec performance, la réponse définitive ne peut être obtenue que par des tests.

+1

Même dans un test de longue durée, la gestion de la mémoire de Java est généralement plus performante en C en raison de la fragmentation de ce dernier. –

4

Vous n'allez probablement pas optimiser la bonne chose ici. L'implémentation du cache est rarement ce qui nécessite une optimisation dans un grand système. Il y a beaucoup d'implémentations bonnes et rapides pour Java. Il y a peu de chances que vous obteniez beaucoup de rien d'une implémentation native. Et même si vous le pouvez, êtes-vous sûr que vous avez vraiment besoin de cela?

C'est généralement tout ce que vous faites autour du cache que fait réellement. Requêtes de base de données, opérations de blocage et tâches gourmandes en ressources processeur. Vous devez certainement profiler votre application et optimiser uniquement les zones qui en ont besoin. Si vous optimisez quelque chose qui ne prend que 5% du temps total, alors vous n'obtiendrez qu'une amélioration de 5% au mieux (c'est-à-dire si vous l'avez fait infiniment vite).

J'ai traité avec de grands systèmes avec de grands caches et la surcharge de l'implémentation de cache est vraiment faible, des pourcentages à un chiffre au maximum. Vous devriez vous assurer que vous passez votre temps sur la bonne chose. Je ne dis pas que vous n'en auriez pas besoin, je dis juste que c'est douteux et vous devriez vérifier d'abord. Vous n'avez pas indiqué d'un côté ou de l'autre, donc je suppose que vous n'avez pas de problème connu avec une implémentation de cache existante.

Questions connexes