Skocz do zawartości

Język a wydajność


Mellon

Pomocna odpowiedź

Rpi 2 z systemem Rasbian Jessie. Jaki użyć język jeśli to ma być urządzenie sterujące z uwzględnieniem wydajności.

Są następujące możliwości:

-phyton - wydaje się, że to język interpretowany zatem wydajność programu może być niższa niż skompilowanego,
-C++ - daje natywny kod - powinien być najbardziej wydajny. Standardowo kompilator gcc. Jest kilka znanych IDE.

-C# - stosuje kod pośredni, może być mniej wydajny ale nie wiem czy znacząco. Może ktoś testował. Istnieją ciekawe biblioteki do tego języka. Korzysta z projektu Mono. IDE - MonoDevelop.

-Java - stosowany w linuxie. Nie wiem czy jest biblioteka do obsługi GPIO, SPI itp. Też ma kod pośredni. Posiada rozbudowane środowisko programistyczne netbeans.

Co o tym sądzicie?

Co o tym sądzicie?

Link do komentarza
Share on other sites

Ogólnie najwięcej czasu jest marnowane przez niepoprawną implementację, a nie przez wybór określonego języka.

Najwyższą wydajność i kontrolę nad kodem uzyskasz pisząc w asemblerze.

Dalej są języki kompilowane, czyli np.:

C, C++

Jest ich oczywiście dużo więcej, np. Pascal, Ada, Fortran, itd.

Dużo zależy od kompilatora. Marny kompilator może dać zupełnie inny rezultat, niż dobry z wydajną optymalizacją. Poza tym wybór opcji kompilatora będzie miał wpływ na wyniki.

Następne w kolejności są języki z prekompilacją, czyli Java, Python, C#, Node.js wiele dialektów Basic-a

Natomiast najwolniej działają języki interpretowane, jak chociażby bash.

Link do komentarza
Share on other sites

Ogólnie najwięcej czasu jest marnowane przez niepoprawną implementację, a nie przez wybór określonego języka.

Najwyższą wydajność i kontrolę nad kodem uzyskasz pisząc w asemblerze.

Nie bądźmy masochistami. Asemblera użyłem ostatnio 10 latek temu

Mówimy tu Rapsberry 2.

We fortranie nie ma obsługi GPIO

Link do komentarza
Share on other sites

Mówimy tu Rapsberry 2.

A jaki ma to związek z asemblerem? Raspberry to całkiem dobra platforma do nauki programowania w asemblerze.

Zadałeś bardzo nieprecyzyjne pytanie. Nie napisałeś co chcesz sterować, ani w jaki sposób. Ogólnie, właśnie nie licząc asemblera, większość wydajności nie zależy od języka, ale od kompilatora (albo raczej od programisty). Oczywiście pewne języki są znane z dobrych kompilatorów, a do niektórych są tylko interpretery. Ale jeśli chcesz uzyskać wysoką wydajność na skomplikowanym systemie, jest wiele czynników które mogą mieć wpływ, a sam język implementacji może być najmniej istotny. Powstają bardzo ciekawe projekty pisane w pythonie, które działają akceptowalnie szybko. Prawdopodobnie mogłyby działać szybciej, ale ważniejszym kryterium jest np. przejrzystość kodu, czy łatwość pielęgnacji.

Jeśli napiszesz coś więcej o swoim projekcie, użytkownicy forum pewnie chętnie pomogą.

Ale jeśli zadajesz ogólne i mocno "akademickie" pytanie, nie powinieneś spodziewać się cudów. Już prędzej świętej wojny, o wyższość jednego języka nad drugim.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Chodzi o budowę regulatora wykorzystującego sieci neuronowe stosowanego np. w transformatorach elektroenergetycznych. Chodzi mi o to, czy dużo spadnie wydajność na RPi 2 jeśli zamiast w C++ zrobię aplikację w C#. Będzie 6 pomiarów analogowych i kilka wyjść binarnych.

Na optymalizację kompilatora mamy niewielki wpływ (np. przekazując mu opcję).

Bo różne opinie słyszałem o Javie i C# na linuksie.

Tu okres decyzji to 20ms - okres napięcia w sieci. Także pomiary powinny wykonać trochę szybciej niż 1 ms.

Myślałem o wykorzystaniu AForge.NET i Accord.NET. Umożliwiają implementację różnych metod sztucznej inteligencji oraz rozwijać własnego frameworka (są kody źródłowe)

ważniejszym kryterium jest np. przejrzystość kodu, czy łatwość pielęgnacji
To prawda zwłaszcza w większych projektach
Link do komentarza
Share on other sites

Obawiam się, że do takich zastosowań to wąskim gardłem nie będzie język, ale sam sprzęt... RPi 2 to nadal bardzo słaba platforma. Oczywiście jest lepiej niż w wersji 1, ale Cortex-A7 to nie jest demon wydajności. Oczywiście Java, czy .net to nawet 10-20 krotne spowolnienie obliczeń.

Moim zdaniem powinieneś przemyśleć i oszacować zapotrzebowanie na moc obliczeniową. RPi to jeden z najsłabszych komputerów wbudowanych (ale za to najtańszy). Do takich obliczeń lepiej nadawałaby się Tegra: https://developer.nvidia.com/embedded/develop/hardware

Natomiast na RPi może warto pomyśleć o GPU? Procesorek jest słabiutki, ale koprocesor graficzny może całkiem sporo - w przypadku sieci neuronowej może dałoby się tą moc wykorzystać?

Natomiast co do języków, to część obliczeniową proponowałbym w C/C++, ew. wstawki w asemblerze... Ewentualny interfejs, czy sterowanie oczywiście można w czymś wygodniejszym.

Link do komentarza
Share on other sites

No to zacząłeś od najgorszego możliwego pytania, ale nie martw się - to częsta tutaj przypadłość. Dopóki nie masz napisanego i uruchomionego algorytmu obliczeń, dopóty nie powinieneś myśleć o optymalizacji. Co Ci da wiedza, że C jest najszybsze a dajmy na to Python 10 czy 50 razy wolniejszy, skoro nie wiesz ile czasu potrzebujesz i ile czasu/mocy obliczeniowej potrzebują wszystkie pozostałe rzeczy działające jednocześnie w Malinie? Jeżeli już teraz masz wątpliwości czy wybrana platforma podoła, to od razu weź większą, zbuduj własny kontroler i programuj go od zera lub na przewidywalnym systemie czasu rzeczywistego albo przeprowadź stosowne testy na tym co masz. Napisz co chcesz liczyć, może to jakoś pokaże obciążenie komputera.

Kolejna sprawa to praca nadążna w systemie elektroenergetycznym. Jeśli nie robisz szybko działających zabezpieczeń a tylko pomiary i ew. sterowanie jakimiś (jakimi?) parametrami pracy transformatora, to być może nie musisz mieć czasów reakcji rzędu 20ms. Robisz pomiary synchronicznie z siecią - to prawda, ale dalej możesz mieć potok obliczeniowy i kolejne próbki mogą być liczone w wielu kolejnych fazach jednocześnie. W takiej architekturze na wejście wchodzą zestawy danych pomiarowych co każdy okres sieci a wyniki wypadają z drugiej strony także co 20ms, ale czas obliczeń może być np. 100ms i każdy wynik dotyczy pięciu okresów wcześniej. Systemy energetyczne są wolne. Czy wprowadzane w wyniku obliczeń zmiany muszą być synchroniczne z okresem sieci? Co będziesz regulował?

Moim zdaniem, przy niewielkich(?) ilościach danych i prostych(?) obliczeniach to nie język będzie ograniczeniem a raczej system operacyjny i jego nieprzewidywalne opóźnienia związane z podziałem czasu, przydziałem priorytetów, zarządzaniem pamięcią i wymaganiami np. systemu plików czy komunikacji.

---------------------------

EDIT: Pisaliśmy razem 🙂

Link do komentarza
Share on other sites

Co do zadań i ich wymagań czasowych to się dowiem zrobię trochę analiz i jak przesymuluję układ w Simulinku cały układ. Myślę o takim tandemie - kontroler STM32 serii F3 lub F7 do szybkich (synchronicznych) pomiarów i sterowań (pracujący samodzielnie lub FreeRTOS) oraz układu nadrzędnego z metodami sztucznej inteligencji - układ jednopłytkowy do uruchamiania algorytmów ewolucyjnych, sieci neuronowych a na podstawie wyników ich pracy zadaje parametry kontrolerowi STM32. Podział taki zapewni szybie i przewidywalne sterowanie z wykorzystaniem sztucznej inteligencji do jego adaptacji.

To taka praca naukowa a koncepcja dopiero się rozwija.

Link do komentarza
Share on other sites

Ale to jest zupełnie inny pomysł niż Malina mierząca i sterująca procesem w czasie rzeczywistym. Widać, że "koncepcja dopiero się rozwija" 🙂

Gdybyś to napisał od razu, nie byłoby dyskusji bo nowe rozwiązanie ma ręce, nogi i dużą szansę powodzenia. Oczywiście jeśli nie zarżniesz STMa wyrafinowanymi algorytmami DSP - to jednak tylko 32-bitowy kontroler.

Link do komentarza
Share on other sites

Powiem więcej - przy takiej koncepcji, możesz spokojnie schować na razie malinkę do szuflady. Podczas prototypowania, czy też prac badawczych, spokojnie możesz wykorzystać PC. Będzie dużo mniej problemów, a i mocy obliczeniowej powinno wystarczyć. Jak już wszystko będzie (poprawnie) działać wystarczy przenieść program na RPi i gotowe.

A przy okazji możesz zainstalować Linuxa na PC i nabrać trochę wprawy. Bo mam wrażenie że jeszcze sporo jest do nauki przed Tobą.

Link do komentarza
Share on other sites

Malina mogłaby sterować zupełnie wolnobieżnymi dodatkowymi rzeczami, obsłużyć klawiaturę i wyświetlacz LCD, komunikację ze światem zewnętrznym.

A tak się zastanawiam czy oprócz Maliny są podobne układy - ja nie potrzebuję tak naprawdę HDMI (korzystam tylko podczas programowania) i karty graficznej, wyjścia audio a w zamian więcej mocy obliczeniowej.

Dawno z linuxem nie miałem styczności. Red Hat 6 - trochę czasu temu. Zainstalowałem Debiana i go męczę 😃

Link do komentarza
Share on other sites

Ale to jest zupełnie inny pomysł niż Malina mierząca i sterująca procesem w czasie rzeczywistym. Widać, że "koncepcja dopiero się rozwija" 🙂
. Taką postać miała od razu bo trudno na malinie robić FFT co 10 us:). Ale też będzie miała swoje funkcje - może nie tak twardo czasowo zdeterminowane. Chodziło mi czy ktoś jakieś testy wydajnościowe już robił, ponadto Rasbian nie jest systemem czasu rzeczywistego, także trudno z niej zrobić prawdziwy sterownik jak PLC.
Link do komentarza
Share on other sites

Jak przeprowadzę symulację to przyjrzę się temu układowi. Jest dobry do nauki bo ma zintegrowane przyciski itp. W celach produkcyjnych można wybrać wersję odchudzoną o niepotrzebne wejścia (przyciski na płytce), diody LED. Ale te elementy ułatwiają naukę programowania aczkolwiek samodzielne podłączenie LED i rezystora nie jest takie straszne. Spartana 6 mam w szufladzie od Xlinx-a. Pewnie się przyda:). Co prawda Zybo Zynq-7000 ARM/FPGA wygląda kusząco.

Podczas prototypowania to użyję starego PC+liniux+jakiś interfejs np. SPI. Później zajmę się testami wydajnościowymi różnych platform. Mam pytanie czy znacie jakieś karty np. na PCI lub PCI-E obsługujące SPI lub I2C?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.