68 votes

Performances de type de données décimal C #

Je suis en train d'écrire une application financière en C# où la performance (vitesse) est critique. Parce que c'est un financière de l'app que j'utilise le type de données Décimal de manière intensive.

J'ai optimisé le code autant que j'ai pu avec l'aide d'un profileur. Avant d'utiliser la Virgule, tout a été fait avec le Double de type de données et la vitesse a été plusieurs fois plus rapide. Toutefois, le Double n'est pas une option en raison de sa nature binaire, causant beaucoup de précision les erreurs au cours de plusieurs opérations.

Est-il décimal de la bibliothèque que je peux l'interface avec le C# qui pourrait me donner une amélioration des performances sur le natif de Décimal de type de données dans .NET?

Sur la base des réponses que j'ai déjà eu, j'ai remarqué que je n'était pas assez clair, alors voici quelques détails supplémentaires:

  • L'app doit être aussi rapide comme il peut éventuellement aller (c'est à dire aussi vite qu'il était lors de l'utilisation de la Double à la place de la Virgule serait un rêve). Double était d'environ 15x plus rapide que la Virgule, que les opérations sont basées sur matériel.
  • Le matériel est déjà top-notch (je suis en cours d'exécution sur un Double Xénon Quad-Core) et l'application utilise des threads, de sorte que l'utilisation CPU est toujours à 100% sur la machine. En outre, l'application est en cours d'exécution, en 64 bits mode, ce qui lui donne un avantage de performance mesurables sur 32 bits.
  • J'ai optimisé au-delà de la santé mentale (plus d'un mois et demi de l'optimisation, ne le croyez ou pas, il faut maintenant env. 1 / 5000e, de ce qu'il a fallu faire les mêmes calculs que j'ai utilisé comme référence initialement); cette optimisation impliqués tout: chaîne de traitement, I/O, l'accès base de données et d'index, de mémoire, de boucles, de changer la façon dont certaines choses ont été faites, et même à l'aide de "passer" au dessus de "si" partout où il fait une différence. Le profiler est maintenant montrant clairement que le solde de la performance coupable, c'est sur le type de données Décimal opérateurs. Rien d'autre n'est l'ajout d'une quantité considérable de temps.
  • Vous devez me croire ici: je suis allé aussi loin que je pouvais peut-être faire dans le domaine de la C#.NET pour optimiser l'application, et je suis vraiment étonné de ses performances actuelles. Je suis maintenant à la recherche d'une bonne idée pour améliorer la Virgule performance à quelque chose près du Double. Je sais que c'est seulement un rêve, mais je voulais juste vérifier que je pensais de tout ce qui est possible. :)

Merci!

45voto

gbjbaanb Points 31045

vous pouvez utiliser le type de données long. Bien sûr, vous ne pourrez pas y stocker de fractions, mais si vous codez votre application pour qu'elle stocke des sous au lieu de deux kilos, tout ira bien. La précision est de 100% pour les types de données longs et, à moins que vous ne travailliez avec de grands nombres (utilisez un type long de 64 bits), tout ira bien.

Si vous ne pouvez pas imposer de stocker des sous, insérez un entier dans une classe et utilisez-le.

26voto

Jon Skeet Points 692016

Vous dites qu'il doit être rapide, mais ne vous en béton exigences en matière de vitesse? Si non, vous pouvez ainsi optimiser passé le point de la folie :)

Comme un ami assis à côté de moi a juste suggéré, vous pouvez mettre à niveau votre matériel à la place? C'est probablement moins cher que de réécrire le code.

Le plus évident option est d'utiliser des entiers au lieu de décimales - où l'on "unité" est quelque chose comme "un millième de un cent" (ou ce que vous voulez - vous voyez l'idée). Si c'est faisable ou pas dépendra des opérations que vous effectuez sur les valeurs décimales pour commencer. Vous devez être très prudent lors de la manipulation, il est facile de faire des erreurs (au moins si vous êtes comme moi).

Ne le générateur de profils montrent notamment les points sensibles de votre application que vous pouvez optimiser individuellement? Par exemple, si vous avez besoin de faire beaucoup de calculs dans une petite zone de code, vous pouvez convertir un nombre décimal en un nombre entier de format, de faire les calculs et ensuite de les convertir en arrière. Qui pourrait empêcher l' API en termes de décimales pour l'essentiel du code, ce qui peut le rendre plus facile à maintenir. Toutefois, si vous n'avez pas prononcé de points d'accès, qui peut ne pas être faisable.

+1 pour le profilage et de nous dire que la vitesse est essentielle, btw :)

8voto

Brian Rasmussen Points 68853

Le problème est fondamentalement que les doubles / float sont supportés dans le matériel, alors que Decimal et autres ne le sont pas. C'est-à-dire que vous devez choisir entre vitesse + précision limitée et une précision supérieure + performances plus médiocres.

3voto

Sergey Shandar Points 1123

Je ne pense pas que les instructions SSE2 pourraient facilement fonctionner avec les valeurs décimales .NET. Le type de données .NET Decimal est un type à virgule flottante décimal 128 bits http://en.wikipedia.org/wiki/Decimal128_floating-point_format , les instructions SSE2 fonctionnent avec des types entiers 128 bits .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X