Que faire avec Java BigDecimal la performance?

J'écris le trading de devises applications pour la vie, donc je dois travailler avec des valeurs monétaires (c'est une honte que Java n'ai toujours pas decimal float type et n'a rien à soutien de précision arbitraire des calculs monétaires). "L'Utilisation BigDecimal!" — pourrait-on dire. Je ne. Mais maintenant j'ai un code où les performances est un problème, et BigDecimal est plus de 1000 fois (!) plus lent que double primitives.

Les calculs sont très simples: ce que le système ne calcule a = (1/b) * c beaucoup de beaucoup de fois (où a, b et c sont point fixe de valeurs). Le problème, cependant, réside avec cette (1/b). Je ne peux pas utiliser de point fixe de l'arithmétique, car il n'y a pas de point fixe. Et BigDecimal result = a.multiply(BigDecimal.ONE.divide(b).multiply(c) n'est pas seulement laid, mais lentement lentement.

Que puis-je utiliser pour remplacer BigDecimal? J'ai besoin d'au moins 10x augmentation de la performance. J'ai trouvé par ailleurs un excellent JScience bibliothèque qui a une précision arbitraire arithmétique, mais il est encore plus lent que BigDecimal.

Des suggestions?

  • si les valeurs de a, b et c ont peu de variation, vous pouvez memoize les valeurs.
  • Curieusement, c'était quelque chose qui était plus facile à C. Juste un lien à l'encontre d'une BCD bibliothèque et que vous avez été fait!
  • pas bizarre du tout, Java facilite les tâches courantes, tandis que les grandes décimal n'est pas tellement commun.
  • Ne riez pas, mais une solution est d'utiliser PHP. Je viens de trouver cette annonce alors qu'il enquête sur la raison pour laquelle un petit programme que je me suis converti à partir de PHP Java a été beaucoup plus lent en Java qu'en PHP.
  • Comment avez-vous atteint? N'PHP vous donner accès à AVX ou avez-vous eu recours au GPU? Plaisir à côté, je suis vraiment curieux. Peut-être poser une question...
  • Je me rends compte que je suis quelques années de retard à la fête, mais quelle est la valeur de b? Sauf b est spécial, le code ONE.divide(b) en panne. Donc, vous êtes en laissant quelques détails de votre question.