2017-09-18 13 views
0

Je travaille sur une application React and Redux qui utilise ImmutableJS pour stocker tout son état. L'application reçoit des données d'un capteur à environ 100 Hz. J'ai besoin de dessiner un graphique qui se met à jour en temps réel et affiche ces données. J'ai utilisé React-Vis pour le graphique, le problème est qu'il prend un tableau d'objets et non une structure de données ImmutableJS.Visualisation des données ImmutableJS à partir du magasin Redux dans un graphique

J'ai résolu ce problème en convertissant la structure de données ImmutableJS à un tableau comme celui-ci:

const data = this.props.HEGPercentage.toIndexedSeq().toArray() 

Cela fonctionne, mais le problème que je rencontrais est retard énorme si je lance ce avec des données réelles, je pense parce qu'il doit créer un nouveau tableau tout le temps.

Comment puis-je créer une solution haute performance pour cela et toujours utiliser ImmutableJS?

+0

Il semble que vous répartissez 100 actions de changement d'état par seconde. Je pense que cela pourrait ralentir les choses de façon significative par lui-même, même sans l'énorme surcharge supplémentaire d'essayer de rendre un graphique avec ces données à 100 images par seconde. Je ne sais pas si l'utilisation de 'toIndexedSeq(). ToArray()' est le problème. Si vous sautez le graphe et que vous faites simplement quelque chose comme 'console.log (this.props.HEGPercentage)'. Est-ce que cela rend le décalage de la page (rendant difficile le défilement ou la saisie dans les champs de saisie, ou similaire)? Essayez simplement d'établir si cela vaut la peine d'essayer d'optimiser 'toIndexedSeq(). ToArray()'. – jonahe

+0

J'ai un code pour simuler l'entrée des données du capteur et le régler à un débit qui devrait être similaire et sans décalage. Maintenant, j'ai également refacturé le réducteur pour utiliser des objets JS réguliers au lieu de Immuable et il semble avoir beaucoup amélioré les performances. Je voudrais toujours utiliser Immutable si possible pour la cohérence avec le reste de l'application ... –

+0

Ok. Les données du capteur sont-elles si précises (ou les fluctuations si importantes) que les valeurs ne réapparaissent presque jamais? Sinon, peut-être qu'il serait possible d'optimiser grâce à une sorte de mise en cache. Si les valeurs sont inutilement précises (peut-être que la résolution de l'écran ne peut pas représenter la différence entre 0.00001 et 0.00002), les données d'entrée peuvent être arrondies pour que les valeurs ne changent pas aussi souvent (moins de restitutions) et répètent plus souvent (mieux pour la mise en cache). Peut-être regarder https://github.com/reactjs/reselect. – jonahe

Répondre

1

La conversion entre des objets JS et des objets Immutable.js peut être très coûteuse. En particulier, les opérations fromJS() et toJS() sont les opérations les plus coûteuses de la bibliothèque Immutable.js, et devraient être évitées autant que possible (et en particulier dans les fonctions Redux mapState).

Il semble que vous soyez déjà au moins quelque peu sur la bonne voie. Utilisez des sélecteurs memoized pour réduire les transformations coûteuses, essayez d'arrondir ces nombres si possible afin qu'il y ait moins de changements inutiles et réduisez le nombre total de mises à jour.

Mon React/Redux links list a une grande section d'articles sur improving performance for React, Redux, and Immutable.js, qui peut être utile. Il est également intéressant de noter que j'ai personally advise against use of Immutable.js for a variety of reasons.

+0

D'accord, après avoir lu certains des articles que vous avez liés, je pense que je penche pour retirer Immutable.js du projet depuis l'une des principales préoccupations de l'application est de dessiner le graphique en temps réel et cela semble nécessiter une conversion en un objet JS. Maintenant, je pense à si je devrais juste muter le tableau. J'utilise concat chaque fois que j'ajoute une valeur mais pour autant que je sache cela crée un nouveau tableau qui semble un peu inutile. Ma principale préoccupation est le rendu en temps réel des données de capteurs, de préférence aussi rapide et réactif que possible. –

+0

Si vous utilisez React-Redux, il utilise des mises à jour immuables pour produire de nouvelles références afin de détecter les modifications et de les restituer. Si vous n'utilisez pas React-Redux, ce n'est peut-être pas un problème. Cependant, je continuerais d'essayer de le faire de la bonne façon, et de voir comment les choses fonctionnent. – markerikson