2016-10-27 2 views
1

Je suis en train de mettre en œuvre un système qui stocke et manipule beaucoup de chaînes courtes répétitives. Par exemple des séries de prix d'actions. Je vais avoir un grand nombre d'entrées répétitives des cours des actions Microsoft:Boost mouche pour chaînes courtes

<time1>,MSFT,60.01 
<time2>,MSFT,60.02 
<time3>,MSFT,60.00 

Je pense à l'aide Boost::Flyweight pour optimiser l'allocation de mémoire, chaîne recherche/comparaison/coût de la copie de ces petits noms ticker répétitifs (comme MSFT dans ce Cas).

Mais la chose est que ces chaînes sont assez petites pour commencer - habituellement juste quelques octets. Alors qu'un type long est déjà de 8 octets dans les ordinateurs modernes. Cela vaut-il la peine d'utiliser Boost::Flyweight dans ce cas?

Ma compréhension de Boost::Flyweight est que les chaînes intériorisées sont des entiers pour améliorer les performances. Mais je pense que rechercher/comparer/copier une chaîne de 8 octets ne serait pas radicalement différent de fonctionner sur un type de données long de 8 octets. Alors vaut-il la peine de passer à Boost::Flyweight?

Mon objectif principal est plus du côté de l'optimisation de la vitesse que de l'optimisation de la mémoire, si je dois en choisir un.

+0

Quelques pensées viennent à l'esprit: 1) Je ne suis pas au courant de la mise en œuvre de Boost, mais je me sens comme le poids mouche modèle est principalement pour les économies de mémoire, pas de vitesse. 2) Ne pas oublier la localisation du cache. Un poids mouche va certainement être dans une partie différente de la mémoire que tout ce que vous travaillez avec "localement", ce qui signifie des échecs de cache. 3) Si votre compilateur est assez récent, vous devriez obtenir une petite optimisation de chaîne, qui alloue des chaînes sur la pile si elles sont assez courtes. Cela peut faire une plus grande différence que le poids mouche. Mais je pense que vous devriez faire quelques tests pour être sûr. – 0x5453

+0

Je suis d'accord avec @ 0x5453 que, dans ce cas particulier, stocker les chaînes comme des tableaux char à terminaison NUL (par exemple 'std :: array ') pourrait être le meilleur pour les performances. Bien sûr cela dépend de l'échelle des allocations – sehe

+0

@ 0x5453 merci pour votre réponse. Je me sens comme ceci devrait être une réponse pas un commentaire. :) – CodeNoob

Répondre

0

La masse volumique est très générique et configurable.

Je suggère d'utiliser un support de chaînes allouées à partir d'un seul pool de mémoire de taille fixe (par exemple std::vector<CharType>). Vous n'auriez alors qu'à retourner std::string_view s à la plage d'octets dans le stockage de sauvegarde.

Vous pouvez utiliser FlyWeight pour configurer des choses comme ça, mais il faudrait que je trouve le temps de le faire.

Vous pouvez également "rouler le vôtre". J'ai quelques échantillons de ce sur StackOverflow:

Mon expérience avec Flyweight a varié (https://stackoverflow.com/search?tab=votes&q=user%3a85371%20flyweight, par exemple boost multi_index_container and slow operator++). Il semble que la mise en œuvre naïve de Flyweight est rarement ce que vous voulez.

MISE À JOUR juste rappeler cette démo connexe j'ai fait en utilisant Hashage Parfait pour les symboles boursiers NASDAQ: Is it possible to map string to int faster than using hashmap?

+0

Ajout de l'approche de hachage parfaite. (Tenez aussi compte du ¹ note de bas de page) – sehe