0

Je me suis efforcé d'implémenter simultanément l'algorithme de Dixon, avec des résultats médiocres. Pour les petits nombres < ~ 40 bits, il fonctionne environ deux fois le temps que d'autres implémentations dans ma classe, et après environ 40 bits, prend beaucoup plus de temps.Java Concurrent Dixon's Algorithm

J'ai fait tout ce que je pouvais, mais je crains qu'il ne s'agisse d'un problème mortel que je ne trouve pas.

Mon code (assez long) est situé here. Idéalement, l'algorithme fonctionnerait plus rapidement que les implémentations non simultanées.

Répondre

0

Pourquoi croyez-vous que ce serait plus rapide? Spinning un thread et l'ajout d'appels synchronisés sont synchrones temps énorme. Si vous ne pouvez pas éviter le mot-clé synchronized, je recommande fortement une solution monothread. Vous pouvez les éviter de diverses manières, par exemple en vous assurant qu'une variable donnée n'est écrite que par un thread même si elle est lue par d'autres ou en agissant comme un langage fonctionnel et en rendant toutes vos variables finales en utilisant Recursion pour le stockage variable (Iffy, difficile d'imaginer cela accélérerait n'importe quoi).

Si vous avez vraiment besoin d'être rapide, mais je ne trouve des choses très contre-intuitif récemment de ma propre tentative de trouver une solution rapide ...

  • Les méthodes statiques n'ont pas aidé plus instances de classe réelles.
  • Briser le code vers des classes et des méthodes plus petites a en fait accéléré la vitesse.
  • méthodes finales ont aidé plus que je ne l'aurais pensé qu'ils
  • Une fois que je remarqué que l'ajout d'un appel de méthode a contribué à accélérer les choses
  • Ne pas insister sur les allocations de classe unique ou les allocations de données, mais éviter les objets allouant Loops (Celui-ci est évident mais je pense que c'est le plus critique)

Ce que j'ai pu deviner, c'est que le compilateur est extrêmement intelligent à l'optimisation et qu'il est optimisé pour optimiser le code java "Ideal". Les méthodes statiques sont loin d'être idéales - elles sont en quelque sorte un contre-modèle ... l'un des plus efficaces. Je vous suggère d'écrire le code OO le meilleur et le plus clair possible, qui fonctionne correctement comme référence, puis chronomètrez-le et commencez à essayer des réglages pour l'accélérer.

+1

"Temps énorme sync" joli calembour! Intentionnel ou typo? –