Cererea GUI performantă (Windows, Linux)

I've been tasked with updating a series of applications which are performance critical VB.NET apps that essentially just monitor and return networking statistics. I've only got three requirements: convert it to C#, make it fast, and make it stable

One caveat is that we "may" migrate from a .NET platform to linux "soon"

Voi fi responsabil pentru menținerea acestor aplicații în viitor, așa că aș vrea să fac acest lucru drept. Am decis să refacționez aceste aplicații în conformitate cu modelul MVP, astfel încât să pot testa în mod corespunzător dracu de acest băiat rău. Însă m-am gândit încă de când am folosit MVP că aș putea să fac și chestii computationale scumpe în codul nativ C/C ++, în timp ce GUI-ul ar fi făcut cu formularele .NET sau Qt sau orice altceva.

întrebări:

  1. are sens să faci un GUI în winforms dar chestii scumpe în C/C ++ nativ, neangajat?

  2. orice recomandări pentru un set de ferestre de bună încrucișare care să corespundă scenariului descris mai sus?

0
fr hi bn

12 răspunsuri

1) are sens să faci un GUI în winforms, dar chestii scumpe în C/C ++ nativ, neangajat?

Cel mai probabil nu. Cu excepția cazului în care comunicați cu multe alte dll-uri native, C# este probabil să fie între 5% mai lent și 5% mai rapid decât C ++ (std :: string vă ucide, folosiți-o)

2) orice recomandări pentru un set de ferestre de bună încrucișare care să se potrivească scenariului descris mai sus?

Dacă sunt doar câteva forme simple cu butoane, mono va fi probabil capabil să le execute nemodificate. Este suport pentru .NET WinForms este destul de bun în zilele noastre. Cu toate acestea, este tare urât :-)

0
adăugat
std :: șirul te ucide? într-adevăr. În comparație cu șirurile .NET (și de obicei, ștergeți și creați un nou GC încurajează), acestea sunt foarte rapide. Notă Arhitecții wpf au sfătuit să nu utilizeze numeroase șiruri de coduri wpf din motive de performanță. (google pentru wpf de difuzare web de către Kiran Kumar)
adăugat autor gbjbaanb, sursa

1) Optimizarea prematura este rea. Implementați-vă "lucrurile scumpe" în C# și vedeți dacă trebuie să-l refaceți. Sau, cel puțin configurați un test care vă va permite să determinați acest lucru.

2) Yowch. Interfața UI încrucișată. Nu m-aș împăca cu chestiile "mai". Unghiul coboară; cum poți lua deciziile de proiectare fără să știi ce proiectezi? Dacă te duci cu o implementare pură .NET, se vor plânge dacă trebuie să-l (cel puțin) refactor să lucreze în Mono? Dacă îl creați în Java, vor fi supărați că arată urât ca iadul și că utilizatorii se plâng că nu își pot găsi fișierul .exe printre toate acele .jars?

0
adăugat

Pentru prima întrebare, este greu de spus dacă ar avea sens, deoarece ar depinde probabil de ce fel de performanță trebuie să obțineți. Eu personal nu am vazut nici un sistem de lent larg sistem datorită GUI în GUI-uri proiectate corespunzător folosind WinForms, așa că nu văd de ce ar fi ar trebui să provoace orice probleme, și, în orice caz, ar face viața mai ușoară în ceea ce privește GUI .

În ceea ce privește a doua întrebare, dacă doriți să vă deplasați la o altă platformă la un moment dat - doriți să aruncați o privire la bibliotecile implementate de Mono ( http://www.mono-project.com/Main_Page ), aceasta ar trebui să acopere, de asemenea, majoritatea nevoilor dvs. în ceea ce privește ferestrele intermediare, deoarece acceptă WinForms și GTK #.

0
adăugat

Și din nou, permiteți-mi să subliniez, lucrurile C ++ este veerrrryyyy scump. Ar fi logic să faceți ceea ce am menționat mai sus? (Formele .NET care ascund C ++ grele de ridicare)

Așa cum am notat anterior, personal nu am observat niciun sistem de întârzieri datorate WinForms în aplicații scrise atât în ​​VB.NET, cât și în C #. Cu toate acestea, dacă aplicația este cu adevărat performantă, atunci este posibil să observați o ușoară încetinire dacă ați scris totul în C# datorită respectării acesteia în CIL ( http://www.cl.cam.ac.uk/research/srg/han/hprls/orangepath/timestable-demo/ ). Ca atare, scrierea GUI într-o limbă precum C# va face probabil o parte a dezvoltării un pic mai ușoară, ceea ce ar da mai mult timp pentru a lucra la părțile critice ale codului. Singura captură -22 aici este posibil să observați unele încetiniri datorită apelurilor către codul C/C ++ din codul C #; totuși, acest lucru este foarte puțin probabil.

0
adăugat

First off, I would put some time into trying out a few VB.NET to C# converters. You're basically porting syntax, and there's no reason to do that by hand if you don't have to. Sure, you might have to clean up what comes out of the converter, but that's way better than a by-hand conversion.

Acum, în ceea ce privește întrebările dvs.:

1) are sens să faci un GUI în winforms, dar chestii scumpe în C/C ++ nativ, neangajat?

Nu inca. Așteptați până veți efectua conversia și apoi aflați unde vă petreceți timpul. Nu există niciun motiv să sarăți în amestecarea C/C ++ cu C# până când veți afla că este necesar. S-ar putea să observați că ar fi suficient să cadeți în C# nesigur. Chiar și asta poate fi inutil. S-ar putea să aveți nevoie doar de optimizarea algoritmilor. Aflați care sunt blocajele dvs. și apoi decideți cum să le remediați.

2) orice recomandări pentru un set de ferestre de bună încrucișare care să se potrivească scenariului descris mai sus?

Aș căuta în siguranță mono . Asta e cel mai bun lucru pe care îl poți face dacă mergi cu C #. Este destul de mult fie mono, fie o altă rescriere într-o altă limbă atunci când/dacă vă mutați la Linux.

0
adăugat
Fiți atenți la suportul limitat al Windows Forms - nu totul poate fi suportat vreodată.
adăugat autor Blaisorblade, sursa

S-ar putea să doriți să căutați folosind Mono . Aceasta este o versiune open source a .NET care rulează pe mai multe platforme ... Linux, Mac, Solaris, Windows etc.

Now about coding your expensive stuff in C/C++. Here's an article that does a very good job explaining the differences between C/C++ & C# performance.

0
adăugat
Având în vedere că articolul menționează setul de instrucțiuni HyperThreaded, cred că ar putea exista surse mai sigure.
adăugat autor Blaisorblade, sursa

The c/c++ stuff may end up being a good idea, but right now YAGNI. Same with the Linux stuff. Ignore it, you ain't gonna need it until you need it. Keep it simple. Unit test the hell out of it, as you say. Get the code working and evolve the design from there.

0
adăugat
Utilizarea de biblioteci neportabile atunci când portabilitatea ar putea fi o preocupare? Păstrați-l simplu nu se aplică. Având alegerea rezonabilă a oricărei , costul de implementare pentru UI este același și este același cu costul de portare. Sprijinul WinForms trebuie investigat înainte de alegere.
adăugat autor Blaisorblade, sursa
Portabilitatea ar putea fi o preocupare, dar nu este o cerință. Este de aur placarea pentru ao adăuga.
adăugat autor Andrew Cowenhoven, sursa

I might be misunderstanding the issue, but if it is a network monitoring system, why isn't it written as a "dedicated" Windows service?

VB.NET nu ar trebui să fie mult mai lent decât C #. Eu nu sunt 100% sigur dacă există diferențe mari în codul IL generat, dar singurul avantaj (și motiv justificat de a rescrie în C #) M-aș putea gândi (cu excepția faptului că C# au o sintaxă mai frumoasă și alte bunuri ) este utilizarea unui bloc de coduri nesigure care ar putea accelera lucrurile puțin.

0
adăugat

Nu, nu are sens să faci "lucrurile scumpe" în C/C ++. Potențialele îmbunătățiri de performanță (și cel mai probabil minore) nu depășesc niciodată productivitatea dvs. fiind o glumă abjectă, bolnavă în comparație cu C #. Într-adevăr. Nici măcar nu este aproape.

Read through this (and all posts referenced within): http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx

0
adăugat

1) Nu neapărat. Cred că ar fi mai corect să spunem că probabil merită să scrieți codul de backend în C ++, indiferent de implicațiile de performanță. Chiar dacă nu poți să-ți iei legăturile de sus în jos pe comutatorul platformei, ți-ar fi prudent să faci pregătiri pentru această eventualitate, din moment ce tipurile de management tind să-și schimbe mintea fără prea multe motive sau avertismente; chiar dacă decid să nu schimbe acum, nu înseamnă că nu vor decide să schimbe șase luni de acum. Scriind logica în C ++ acum, știind că este o posibilitate, deși mai dificilă, vă poate face viața mai ușoară mai târziu.

2) Nu chiar. Există "soluții", cum ar fi wxWindows și GTK #, dar de cele mai multe ori sunt buggy sau dificil de a lucra corect sau lipsesc ceva important pe o platformă sau alta. De asemenea, vă blochează, de obicei, într-un UI cu cel mai mic numitor comun (de exemplu, controalele generale funcționează bine, dar puteți uita că vreodată faceți ceva interesant - WPF, de exemplu). UI-urile sunt ușor de scris, deci cred că dacă îți scrieți logica în ceva portabil, ar trebui să fie o problemă banală de a bate împreună mai multe UI-uri specifice platformei.

0
adăugat
Ei bine, o astfel de afirmație despre GTK # este destul de ciudată. Nu știu legăturile C#, dar GTK + este o platformă foarte matură pe Linux - dacă ați văzut vreodată un desktop Ubuntu care este GTK + pur și unele aplicații noi (Beagle) sunt în GTK #. Nu știu însă WPF.
adăugat autor Blaisorblade, sursa
Er, da, GTK + este o platformă foarte matură pe Linux . Ceea ce vorbim aici este interfata platforma inter-platforma. GTK + nu este așa. Folosirea pe Mac este o experiență dezamăgitoare, și doar obținerea unei bune construi pe Windows este o cantitate fenomenală de muncă în comparație cu aproape orice altceva.
adăugat autor TheSmurf, sursa

gtk-sharp is a pretty nice cross platform toolkit.

Gtk # este un set de instrumente de interfață grafică pentru utilizatorii mono și .Net. Proiectul leagă setul de instrumente gtk + și bibliotecile GNOME asortate, permițând dezvoltarea completă a aplicațiilor grafice native Gnome folosind cadrele de dezvoltare Mono și .Net.

0
adăugat

Am avut o dilemă similară și am încercat să găsesc cel mai bun mod de a dezvolta un instrument de testare H/W bazat pe PC (ceea ce înseamnă în mod evident "cu opțiuni UI") care interacționează cu un hardware încorporat (prin interfața PCMCIA).

Blocajele au constat în faptul că testarea ar trebui să se desfășoare la o abatere maximă de 10ms față de timpul prevăzut de tester.

Ex .: Dacă testerul creează următoarea secvență de testare:

    1. Activați de la distanță H/W
    2. Așteptați o întârziere de 50 ms 3. Citiți informații H/W.

the delay mentioned in step 2 should not be > 60ms.


I chose C++ WIN32 application as my back-end and VC++ 2005 Winform (.NET platform) for UI development. Detailed information on how to interface these two is available in msdn
I segregated the system like this:
In VC++ .NET:

    1. UI pentru a avea informații complete despre H/W (citiți prin aplicația back-end) și pentru a controla H/W la cerere. (Butoane, combo-box etc .. etc) 2. UI pentru a rula secvențele de testare critice de timp (așa cum se menționează în exemplul de mai sus) 3. Colectarea acestor informații și construirea unui flux (File-stream) într-un format Time-linear (adică, în ordinea exactă a pașilor în care trebuie efectuată). 4. Mecanism de declanșare și agitare a mâinilor (prin redirecționarea intrărilor standard și a ieșirilor standard) cu aplicația back-end WIN32. Resursele comune vor fi fluxurile de fișiere.

În C ++ WIN32:

    1. Interpretarea fluxului de fișiere de intrare 2. Interacțiunea cu H/W.
    3. Colectarea informațiilor din H/W și punerea lor în fluxul de fișiere de ieșire

    4. Indicarea finalizării încercării în UI (prin ieșirea standard redirecționată)

Sistemul complet este în funcțiune. Pare a fi destul de stabilă. (Fără deviația de sincronizare menționată mai sus).
Rețineți că PC-ul de testare pe care îl folosim este destinat exclusiv scopului de testare H/W (tocmai avea interfața UI care rulează pe acesta, fără actualizări automate, scanare de virus etc. etc.).

0
adăugat