8
votes

VC ++ / C ++ Considérations d'interface graphique multithreau à haute performance élevée pour le commerce

Je suis intéressé à voir quelles considérations les développeurs expérimentés font lors de la mise au point d'une interface graphique multithread à haute performance pour une plate-forme Windows. Je pose cette question dans le contexte de l'élaboration d'applications de négociation dans lesquelles l'interface graphique est une latence très dynamique et l'application est un problème.

Quelles architectures avez-vous vue ou recommandez-vous de regarder sur le document / la vision de MFC pour mettre en œuvre le modèle d'observateur dans ce contexte. Je crois que le document / la vue ne serait pas utilisé en raison de problèmes de performance.

Quelles considérations spécifiques doivent être apportées aux composants / fenêtres UI qui sont mises à jour dans un thread séparé, à la fois dans MFC et QT? Existe-t-il des règles générales qui s'appliqueraient à toutes les bibliothèques d'interface graphique?


6 commentaires

Pensez-vous vraiment que le document / la vue ajouterait une augmentation inacceptable? La plupart des gites de négociation ces jours-ci sont écrits dans .NET. Même en 2000, j'étais impliqué dans un système de négociation basé sur le Web qui, lorsqu'il est exécuté à côté d'une alimentation d'échange sur site à l'échange, la latence était inperceptible. Cela dit que j'avais définitivement passer de MFC, mais je n'ai effectué aucune GUI C ++ pendant des années, je ne peux donc pas commenter ce que le meilleur cadre est ces jours-ci. Je sais que qt obtient beaucoup de presse.


Pouvez-vous nous donner une idée de l'élaboration de votre interface graphique, comme quel type de graphiques et combien d'entre eux, et à quelle fréquence ils nécessitent une mise à jour, etc.?


@Phil: - Je dis que le document / la vue serait une surcharge inacceptable des entretiens techniques que j'ai connus avec des logiciels de trading basés sur la ville.


@Musigenèse: - Fondamentalement, la gamme complète des graphiques d'analyse technique, par exemple le chandelier, les moyennes mobiles, la force relative, le prix, le volume, le support automatique / résistance. Égimentez également les commandes réelles placées en temps réel, c'est-à-dire des données de niveau 2, des flux de nouvelles. En ce qui concerne le nombre d'écrans / de vues sur les données, environ 30.


Fréquence max de la mise à jour, 250 ms


Lorsque vous dites la latence, voulez-vous dire la latence dans la réception de données ou de la latence dans la mise à jour de l'affichage?


3 Réponses :


10
votes

Vous cherchez entièrement les mauvais endroits. La "surcharge" d'une architecture de document / vue est dans la plage nanoseconde (essentiellement, accéder aux données via un pointeur).

Pour la comparaison, la vitesse maximale absolue à laquelle vous pouvez mettre à jour de manière significative l'écran est le taux de rafraîchissement du moniteur, généralement 60 Hz (c'est-à-dire une fois tous les 16,67 millisecondes).

Faire même ce genre de taux de rafraîchissement significatif, vous ne pouvez pas vraiment modifier beaucoup dans une mise à jour de moniteur donnée - si vous essayez de changer trop, l'utilisateur ne pourra pas suivre ce qui se passe.

En ce qui concerne la filetage, la méthode la plus simple consiste à effectuer toute la fenêtre réelle mise à jour dans un thread et à utiliser les autres threads pour effectuer des calculs et de générer des données pour la fenêtre mise à jour. Tant que vous assurez que le thread n'a pas besoin de faire beaucoup de calcul et de telle, la mise à jour de la fenêtre aussi vite que nécessaire pour être assez facile.

Edit: En ce qui concerne C ++ contre c # va, cela dépend. Je n'ai aucun doute sur tout ce que vous pouvez obtenir tout à fait suffisant affichage performance de l'un quelconque. La vraie question est la quantité de calcul que vous faites derrière ces affichages. Ce que vous avez mentionné a fait preuve principalement assez près des données brutes (prix, volume, etc.) pour cela, c # sera probablement très bien. Je suppose que les personnes que vous avez parlé de faire beaucoup plus de calculent plus de calcul - et c'est la vraie Achille guérir de .NET (ou presque toute autre chose qui fonctionne sur un virus VM). D'après ce que j'ai vu, pour un calcul très lourd, c # et tellement n'est pas vraiment très compétitif.

Juste par exemple, dans une autre réponse, j'ai mentionné une demande que j'ai écrite à l'origine en C ++, qu'une autre équipe a réécrit en C #, qui a couru environ 3 fois plus lent. Depuis la publication de cela, j'étais curieux et parlais avec eux un peu plus à ce sujet, demandant s'ils ne pouvaient pas améliorer sa vitesse pour être au moins proches de la même chose que C ++ avec un petit travail supplémentaire.

Leur réponse était, en substance, qu'ils avaient déjà fait ce travail supplémentaire, et c'était pas juste "un peu". La réécriture C # a pris quelque chose comme 3 1/2-4 mois. De cette époque, il leur a fallu moins d'un mois pour dupliquer les caractéristiques de l'original; Le reste du temps a été consacré à (essayer de) le rendre assez rapide pour être utilisable.

Je m'empresse de faire preuve de prudence que 1) Ce n'est qu'un point de données, et 2) je ne sais pas à quel point ce que vous puissiez faire. Néanmoins, cela donne une idée du type de ralentissement que vous pourriez rencontrer lorsque (et si) vous commencez à faire un calcul réel plutôt que de simplement transmettre des données à partir du réseau à l'écran. Dans le même temps, un aspect rapide indique qu'il est généralement conforme aux résultats sur le Shootout de langue informatique site Web - Bien que gardez à l'esprit les résultats là-bas sont pour mono plutôt que la mise en œuvre de Microsoft.

Du moins pour moi, la vraie question revient à ceci: Votre préoccupation est-elle vraiment bien fondée ou non? Pour quelque chose comme 90% des applications autour, ce qui est important, c'est simplement que le code quel vous voulez, et la rapidité d'exécution importe peu, tant qu'elle ne reçoit pas drastiquement plus lentement (par exemple, des centaines ou des milliers de fois plus lents). Si votre code tombe dans cette catégorie (grande), C # peut très bien être un bon choix. Si vous avez vraiment une bonne raison de vous préoccuper de la rapidité d'exécution, il me semble que choisir C # serait un lot plus discutable.


2 commentaires

Pour ce type d'application, diriez-vous une bonne raison de choisir C ++ sur C # .NET lorsqu'il s'agit de latence? Je sais que les métriques que j'ai données sont très vagues. Il semble y avoir une préférence dans les cercles de développement financier de Londres pour opter pour C ++ pour des raisons de latence. Peut-être que c'est vraiment de ne pas pouvoir justifier une réécrire dans C # .NET.


shootout.alioth.debian.org/demo/... < / a>



3
votes

Depuis que vous avez mentionné dans un commentaire, le problème de choisir C ++ ou C #, je vais recommander C # et en particulier WPF (Fonds de présentation Windows). Théoriquement, une application C ++ a un plafond de performance plus élevé qu'une application .NET. Mais cela va aussi prendre plus de temps pour développer (probablement) et être plus sujet aux erreurs et aux fuites de mémoire.

Si vous allez écrire vos propres commandes d'affichage, WPF (ou même WinForms) est suffisamment rapide pour gérer ce type de charge de contrôle (si, comme avec n'importe quelle langue / plate-forme, elle est écrite correctement). De plus, il existe un grand nombre de contrôles personnalisés disponibles qui font exactement ce genre de chose (affichant des cartes d'achat et ce que ce serait la construction de cette application beaucoup plus rapidement que de tout faire de vous-même de zéro.


6 commentaires

Je serais d'accord avec toutes les bonnes raisons d'aller pour les technologies .NET et associées. Pourquoi pensez-vous que la ville de Londres est toujours bloquée sur C ++ pour ces types d'applications? J'avais l'impression que c'était l'une des rares zones de niche que C ++ a été préférée pour les applications GUI.


TBH J'ai travaillé pour quelques-unes des banques d'investissement à Londres et que partout semble utiliser C # pour l'interface graphique avec C ++ pour le Calc. bibliothèques (et com ou c ++ / cli à pont). Je n'ai pas vu de code d'interface graphique MFC pendant une longue période autre que quelques anciens systèmes hérités qui étaient de toute façon sur leur chemin.


C'est bon à savoir. Il pourrait être que les entreprises me invitant à une interview étaient celles avec les systèmes hérités intéressés aux années de MFC que j'ai fait il y a longtemps. Peut-être que je devrais frapper le CV.


@RAF: "Ville de Londres" ne sait pas squat sur la programmation, un fait que les programmeurs travaillant pour la ville de Londres exploitent à leur avantage en utilisant une plate-forme / un langage qui profite à leur propre sécurité d'emploi à la dépense de leur employeur. C ++ est (généralement) flamboyant vite, mais c'est donc tout le reste de nos jours (même Java et sauf ror). Je pense que le coût du temps de développement dépasse considérablement tout le reste des logiciels. Si je payais réellement pour logiciels à écrire, C ++ est la dernière chose que j'utiliserais.


Ok, c'était un peu extrême. C ++ a sa place, bien sûr; Je ne suis tout simplement pas sûr à 100% que c'était ça.


Ce n'est pas. En dehors de la lumière, des applications de style de plateau de système, il existe pratiquement zéro bénéfice à l'utilisation de C ++ pour GUI. Sur le côté de la calcul, cependant, c'est une histoire de différence. Et ce n'est pas seulement une vitesse de calcul brute - si vous distribuez de petits calculs sur une grille, l'heure de démarrage d'un VM a tendance à dominer!



4
votes

J'ai travaillé sur le côté interface graphique d'une demande de trading. Fondamentalement, quelque chose de local (c'est-à-dire non-web) est assez rapide. C ++, C # ou Java feraient tous. L'inconvénient principal de l'utilisation de C ++ est qu'il supprime la barrière naturelle entre le code de calcul et l'interface utilisateur. Les programmeurs devant moi avaient été un peu bâclées, utilisées C ++, et donc le code de calcul et l'intervalle d'intervalle étaient quelque peu liés. Qui a rendu le port QT plus dur.

La multithreading est surtout non pertinente pour l'interface utilisateur. Cependant, il devrait être exécuté sur son propre fil, ce qui signifie que seule l'interface avec le ou les moteurs de calcul doivent être concernés par la possibilité d'être appelé d'autres threads.


1 commentaires

A aimé votre point de forcer une scission entre la présentation et les couches de données / calculs.