2016-07-07 1 views
-1

Je suis un programmeur Java, et je l'ai récemment commencé à la concurrence de codage (Codechef, Hackerearth, etc ..)Manipulation efficace des bits en Java?

J'ai le sentiment que mordit la manipulation est vraiment très lent en Java en matière de valeurs d'entrée très grandes. De mon expérience, le même code C/C++ (Par le même je veux dire si converti de Java avec le même algorithme, même stratégie, etc. Je ne change pas ma logique lors de la conversion de Java en C/C++ ou vice versa) exécute tous les cas de test avec succès, génère une limite de temps dépassée en Java. Je suis conscient que la plupart des sites de programmation compétitifs fournissent un temps d'exécution 2x pour les programmes Java, mais il dépasse tout de même la limite de temps.

Dans des langages comme C++, nous avons des fonctions comme __builtin_popcount qui peuvent exploiter les fonctions intégrées du CPU qui sont très rapides. De telles choses ne sont pas disponibles en Java. Certaines fonctions comme java.lang.Integer.bitCount() ne fonctionneront que pour un int 32 bits.

Alors devrions-nous préférer aller avec C++ pour de tels problèmes? Devrions-nous même envisager de résoudre des problèmes de type manipulation de bits en utilisant Java? Si non, alors y a-t-il des astuces efficaces plutôt que d'appliquer notre propre logique?

(Il y a aussi le fait que les différentes machines d'architecture prendront différentes de temps, mais permet d'ignorer cela. Ma question est dans le contexte de la programmation concurrentielle)

+1

Pourquoi est-ce marqué C++? Les recommandations linguistiques ne reposent pas sur des faits, nous ne pouvons pas fournir une réponse qui ne soit pas fondée uniquement sur des opinions. –

+2

La manipulation des bits n'est pas lente en Java, et Java a des opérateurs de bits similaires à C/C++. Vous faites probablement d'autres choses qui ralentissent, comme la boxe/unboxing. Sans voir votre code Java, nous ne pouvons pas dire ce qui le rend lent. – Jesper

+1

Il n'y a pas de '__builtin_popcount' en C++. Si votre programme expire, c'est parce que votre solution est inefficace, pas à cause de Java. Si vous avez besoin de recourir aux intrinsèques du compilateur pour ne pas perdre de temps en C++, vous faites quelque chose de mal. – molbdnilo

Répondre

3

Long a Bitcount aussi, et lowestOneBit, numberOfLeadingZeroes, numberOfTrailingZeroes etc.etera.

Et puis il y a BitSet, plus pour des buts booléens.

Ces opérations sont en petits programmes courts de fonctionnement horriblement lent que le compilateur Just-In-Time ne se déclenche pas.

Java est pas C, mais revenir dans un programme Java à C/C++ pour ce genre de opérations, souvent ne méritent pas à cause des frais généraux JNI. Jusqu'à présent, j'ai trouvé java suffisant pour atteindre des performances similaires, même là où on ne s'y attendrait pas. C'est dans les allocations où java peut parfois battre C/C++. Mais personne ne bat C sur le niveau de calcul, comment par exemple n % 12 est calculé.

+0

Oui, je suis d'accord. Ces méthodes sont lentes et certaines d'entre elles sont conçues uniquement pour une longueur de bit fixe. Je pense que c'est peut-être la raison pour laquelle, pour de très grandes valeurs, ça va être lent. –