Rychlost. C++ || JAVA || C# ???
Rychlost. C++ || JAVA || C# ???
Potreboval bych poradit, jak je to s rychlosti vysledneho kodu v techto jazycich: C++, JAVA, C#. Jde mi o to, ze mam jako bakalarku programovat urcitou aplikaci (pracujici v textovem rezimu), kde je hlavnim faktorem rychlost. Program bude pracovat s velkym poctem souboru (radove tisice, ze kterych bude nacitat realna cisla) a take s celkem velkymi maticemi, kde bude presouvat sloupce a provadet elementarni matematicke operace. Jde mi o to, ze programovani v C++ jsem uz davno opustil a navic se ted ve skole ucime C#. Zajimalo by me, zdali se nekde na internetu daji najit nejake rychlostni testy. Zatim jsem nic nenasel. Diky Honza
kazdy nazor titulek mit nemusi ;)
celé vláknoRe: kazdy nazor titulek mit nemusi ;)
celé vláknomat. operace = prumerovani (scitani, deleni), pocitani logaritmu
pak celkem dost trideni (asi quick sortem)
pristup na disk bude v mensi mire nez mat. operace
Re: kazdy nazor titulek mit nemusi ;)
celé vláknoAk chces ale jednoz tych troch, zabudni na javu - sialene pomala zalezitost, a predpokladam ze c# tiez este nema dostatocne vyspele kompilatory, aby boli schopne rozumnej optimalizacie.
Takze bud c++ (v ceckovom style) alebo c++ ako bolo c++ myslene (a to ti prajem prijemnu zabavu ;))
Re: kazdy nazor titulek mit nemusi ;)
celé vláknoRe: kazdy nazor titulek mit nemusi ;)
celé vláknoHlavne si opravdu davej bacha na to, at prilis (nevyhnes se jim) nevyuzivas objekty. Pri nich je pak zpomaleni velmi vyrazne.
Taky bych Ti mozna doporucil udelat si ve vsech trech jazycich dummy aplikace, ktere nebudou delat nic moc uzitecneho, ale vyzkousis si na nich to zpomaleni. Aspon pak budes mit duvod, proc sis pro implementaci zvolil to, co sis zvolil.
Re: kazdy nazor titulek mit nemusi ;)
celé vláknoRe: kazdy nazor titulek mit nemusi ;)
celé vláknoAle fortran je fortran ;)
Matlab NE!
celé vláknoRe: Matlab NE!
celé vláknoRe: Matlab NE!
celé vláknofortran
celé vláknokdy jsi to psal? 1995? driv? ja delal asi pred 5 lety test rychlosti javy a c++ pro ciste matematicke operace. vysledek: naprosto stejna rychlost. jsou veci kde java trochu prohraje, ale urco se to netyka celociselnych operaci. c# bude asi to samy.
ani cisty cecko ti neda zadnou opravdovou vyhodu. ztrata casu
delej jak sces, ale zapomen na fortran.... naprosta ztrata casu.
Re: fortran
celé vláknopokud jsou operace čistě nad základními matematickými typy - tedy int, long, float, double, pak je asi rychlost javy a c# srovnatelná plus mínus s c++. pokud ale už počítáme matice a složitější typy, pak java a c# už začíná ztrácet, pokud se nepoužije specializovaná knihovna (existuje vůbec taková pro javu?), neboť začne narůstat režie javy a c#, která není v c++.
proč bych ale javu pro složitější matematiku určitě nepoužil je fakt, že nemá přetěžování operátorů. počítat v tom matice, polynomy, vektory a další bez operátorů bych nechtěl. to je nedostatek, který v javě nezmizí ani s žádnou doplňující knihovnou. strašně to zamlžuje zdrojový kód a mnohem snáze se přehlédnou chyby, pokud v tom máte plno matematiky a operací. pokud volíte mezi javou a c#, zvolte raději c#, kde máte možnost operátorů.
Re: fortran
celé vláknoPro Javu existuje knihovna JAMA (math.nist.gov/javanumerics/jama). Nemám s ní ale skoro žádné zkušenosti, programoval jsem s ní jeden nebo dva zápočty a na to byla dobrá.
Re: fortran
celé vláknoRe: fortran
celé vláknoRe: kazdy nazor titulek mit nemusi ;)
celé vláknoJde o to, kolik je času a zda je chuť. Člověk se na tom dost naučí.
A co takhle Matlab
celé vláknoRe: A co takhle Matlab
celé vláknoRe: A co takhle Matlab
celé vláknoRe: A co takhle Matlab
celé vláknonazor
celé vláknozáleží na tom...
celé vlákno1. Pokud to má být rychlé a je málo času na ladění - použít Javu
2. Pokud to má být rychlé, mám moře času a rád optimalizuji - použít C++
3. Musí to být co nejrychlejší, každé promile výkonu přináší velký užitek - použít C a udržet ho kompaktní
Důvody:
A. Java obsahuje JIT a velice agresivní metody optimalizace, umí přestavět aplikaci za běhu a pokud nezačnete vytvářet haldy objektů, pak dává mnohem lepší výsledky než "dobře napsaný" program v C/C++
B. Jazyk C/C++ přeci jen nabízí lepší možnosti jak řídit výkon a optimalizovat. Je to práce pro odborníka, který má hodně zkušeností a ovládá práci s profilerem. Výsledek je nesrovnatelně pracnější než v případě Javy, ale také je o poznání lepší
C. Jazyk C++ není jen rozšířením jazyka C, některé věci prostě dělá po svém a jinak. Ne vždy rychleji. Navíc pokud se použijí "standardní prostředky" C++, bude výkon opět nižší než v případě C, kde si to budete muset napsat sám a tedy máte prostor k optimalizaci. Virtuální metody nebo STL nejsou cesta k výkonově optimálním výsledkům.
A jako obvykle: pro jazyky Java a C/C++ platí, že nejdůležitější je algoritmus. Ten může znamenat rozdíly výkonu několika řádů. Samotný "výkon jazyka" pak při dodržení základních zásad programování dělá nejvýše desítky procent.
Re: záleží na tom...
celé vláknoRe: záleží na tom...
celé vláknoRe: záleží na tom...
celé vláknoPri mldach cyklu je rozdil mezi rychlejsim nevirtualnim volanim celkove jen v nekolika nebo desitkach ms, alespon v pripade vc8 nebo g++. Navic zapis a cteni do souboru spotrebuje daleko vice casu. Navic se to tyka implementace prekladace, ne standardu C++.
Za druhe otazka rychlosti STL je hlavne dana opet implementaci, opet se to netyka standardniho C++. Takze muzete narazit na nejakou spatnou implementaci STL, ale o tom pochybuju. STL knihovny, ktere se nejvice pouzivaji v produkcnim prostredi jsou navrzene lidma, kteri to umi navrhnout. Pochybuji, ze Vy byste to zvladnul, bez jejich znalosti lepe.
Re: záleží na tom...
celé vláknoŽe "Virtuální metody nebo STL nejsou cesta k výkonově optimálním výsledkům" je svatá pravda a pokud tvrdíte že ne, tak jste to vy, kdo o tom nemá ani páru! Celé OOP se týká zefektivnění vývoje za cenu méně efektivního výsledku. To je prostě fakt který lze matematicky dokázat.
Vaše démonizace profi vývojářů je opět velice naivní.
A pokud by náhodou někdo argumentoval super hyper optimalizátory, pak tvrdím, že žádný, podtrhuji, _žádný_ optimalizátor není schopen vyprodukovat efektivnější kód, než jaký je schopen napsat člověk zběhlý v Assembleru. Neboli - možnosti jakéhokoliv optimalizátoru jsou omezené a v případě jazyků jako Java, C++ a C# je jejich úkolem spíše udělat výsledný kód aspoň rozumně přijatelný než jaký by byl po "čisté" kompilaci.
Pokud jde o numerické výpočty pak jednoznačně doporučuji Fortran. Efektivita kódu z C++ nebo dokonce z Javy se mu těžko přiblíží.
Re: záleží na tom...
celé vláknoRe: záleží na tom...
celé vláknoRe: záleží na tom...
celé vláknoRe: záleží na tom...
celé vláknoRe: záleží na tom...
celé vláknoTo je pravda jen do urcite velikosti kodu. Predstavte si funkci, ktera bude delat strasne slozite veci se strasnou spoustou promennych a v C bude treba na 4000 radku. Tvrdim, ze i z gcc vyleze lepsi kod nez z toho nejlepsiho assembleristy.
A vubec - je jeste v lidskych silach psat opravdu efektivni kod pro dnesni hypersuper multijadrove venku CISC uvnitr RICS procesory? Staci se podivat na aplikace, kde a rychlosti zalezi a kde klicove rutiny psane v assembleru jsou male funkce a kde stejne trva az nekolik let nez se vyladi na maximalni vykon.
Testy
celé vláknoRe: Testy
celé vláknoDoplnění
celé vláknoZ dotazu lze odvodit, že je poněkud omezený čas na vývoj a umíte (zřejmě) C#. Otázka rychlosti - čas běhu aplikace musí být minimální nebo stačí, aby to doběhlo v nějakém rozumném čase? Jak velké je to "celkem" u matic - jde o matice s řádem 10, 100 nebo 1000000?
Jsou matice nějak zvláštní (řídké, symetrické, ...)?
Z dotazu se zdá, že preferujete práci se sloupci matic. Musí to být jeden program? Musí běžet vše na jednom stroji?
Osobně bych se pokusil data ze souborů vyzobat něčím hotovým (např. perl) a dále bych řešil samotné zpracování matic.
Pokud jsou úloha preferuje určité operace a jde o větší matice (s řádem řekněme nad 1000) zkusil bych buď najít hotovou knihovnu nebo vytvořit spec. třídu optimalizovanou na danou úlohu. Preferoval bych jazyk, který (dobře) umím, případně se kterým si nejlépe rozumí použitá knihovna. Pro opravdu velké úlohy a/nebo speciální matice rychlost více ovlivní použitý algoritmus než samotný jazyk (např. jak je matice uložená v paměti, zda je nutno při třídění přesouvat data v paměti, je nutno přesouvat sloupce nebo lze změnit číslo sloupce, ...)
Re: Doplnění
celé vláknoHonza
Re: Doplnění
celé vláknoA jeste trochu obecne k uloham tohoto typu (pokud jde o praci, kde mate asi demonstrovat znalisti tak mozna nepouzitelne):
- Nejlepsi je pouzit nejakou osvedcenou knihovnu, kterou lze pouzit v jszyce ktery uz umite a hodi se pro dany typ ulohy.
- Vybrat spravny algoritmus byva dulezitejsi nez resit rozdily par procent v optimalite kodu ktere generuji ruzne komilatory.
- Hodne casu muzete usetrit pri praci s pameti. V c/c++ nebo fortranu to mate pod kontrolou, v C#/Java na to musite myslet a musite rozumet co dela VM / framework muze to byt paradoxne slozitejsi.
- Byva dobre myslet na to, aby se k datum pristupovalo v takovych sekvencich, ze budete mit dobry cache hit rate - procesory jsou rychle a sbernice pomale...
Re: Doplnění
celé vláknoPoznámka k C++
celé vláknoRychlost kódu C++ velmi podstatně (snad až o mnoho desítek, možná i stovek procent) brutálně závisí na zkušenostech toho, kdo v něm programuje. Proto se testy na C++ zase tak moc brát v úvahu nedají. Pokud máte značné zkušenosti v C++, napíšete jednoznačně nejrychlejší kód.
Kdosi tu psal o rychlejším C, než C++, to je samozřejmě nesmysl. C++ má naprosto všechny prostředky jazyka C a dobrý programátor C++, kterému sdělíte, že prioritou je rychlost bude psát v C++ stejně rychlé kódy jako v C.
Samotné OOP v C++ není neefektivní, a rychlost volání virtuálních metod a další věci mají z hlediska rychlosti význam jen ve velmi speciálních případech. Používání tříd není v C++ z hlediska rychlosti rozhodující, je to skoro jedno.
Java a C# jsou určitě pomalejší, než C++, možná je C# trochu rychlejší. Jejich výhodou oproti C++ je prostě jednoduchost a zaručený výsledek, pokud moc programovat neumíte, a nebo se tím nechcete zabývat a chcete to mít rychle za sebou.
Re: Poznámka k C++
celé vláknoRe: Poznámka k C++
celé vláknoNeznám prostě jediný důvod, proč by C++ kód měl být byť jen o milióntinu procenta pomalejší. Je samozřejmé, že musíte kompilovat za stejných podmínek a stejným kompilátorem. Není k tomu prostě důvod.
Re: Poznámka k C++
celé vláknoJa bych doporucil C#
celé vlákno1) Pokud budes pouzivat velke mnozstvi souboru, rychlost kodu tveho programu je temer irelevantni - zasadni bude rychlost tech IO operaci.
2) V C++ mohou byt nektere veci rychlejsi, ale v C# je mnoho veci snazsich, coz napriklad uvolnuje ruce programatorovi, aby se zabyval "high level" optimalizaci, coz muze znamenat ve vysledku rychlejsi kod.
3) Pokud vytipujes misto, ktere je vykonnostne opravdu kriticke a pritom v C# nejde napsat tak, jak by sis pral, treba pomuze unsafe mod.
4) Je mozne, ze to co pisu neni dobra rada, protoze to cos napsal skutecne nerika dost o tom, co vlastne delas. Pokud je ta prace zalozena na matematickem zpracovani cehosi, treba bude opravdu nejlepsi volbou nejaky specializovany matematicky software.
a co stare dobre C?
celé vláknonema sice ficury co C++ (pro praci s maticemi me napada pretezovani operatoru) ale
zase vis _presne_ co delas a _presne_ proc je to pomale/rychle.
z praxe, C v prumeru vychazi 4 rychleji na pcu/pamet nez C++, ale vecinou i lip, dano tim C++kari sou vecinou nejaky nahodny opicky co ani presne nevi co ten jazyk (a jak rychle) dokaze...
ze nema C interface a implementation? ale panacku, procpak se asi vsechno rozdeluje
do vice .c souboru a v .h sou takove ty extern ... :)
a ze C nema automatic memory management (garbage collector), vezte ze ma a to hned nekolik (z fleku treba Boehm - http://www.hpl.hp.com/personal/Hans_Boehm/gc/, vetsinou
se ale vyplati napsat si nejaky pseudovlastni pro danou ulohu).
.NET/Java atp jsou naprosto mimo a vhodne opravdu jen na RAD kde vypocetni cas je kratsi nez cas potrebny k napsani aplikace. Na nejake seriozni vypocty te s polointerpretovanymi jazyky vyhodej - to neni nic jineho nez mrhani vypocetnim casem a hlavne pameti - nad tou mas faktickou kontrolu opravdu jen v C. C++ je ta nejzassi hranice.
kategorie ciste (pseudo)funkcionalnich jazyku kde se zamerujes na algoritmickou cistotu/efektivitu (lisp,ocaml,haskell..) je trosku jina liga, tato uloha do nich pravdepodobne nespada.
a jestli fakt chces jenom provokovat oponenturu, tak to napis ve forthu (vetsinu casu stravi tim ze to budou lustit a zjistovat cim to prelozit)
Re: a co stare dobre C?
celé vláknoA rozdil v rychlosti ... prijde mi, ze jediny rozdil, proc by mohlo byt C++ pomalejsi je ten, ktery jste uvedl - osoba programatora.
Jinak souhlasim.
Re: a co stare dobre C?
celé vláknoVelmi často se vyskytují názory obhajující C před C++ s různými smyšlenkami ve stylu "v C to mám víc pod kontrolou" (naprostá blbost), nebo "v C je lepší kontrola paměťi" (otázka: kde?), nebo spousta dalších lží.
C a C++ dokáže udělat stejně rychlý, efektivní program a v obou jazycích to máte pod kontrolou přesně jak budete potřebovat. Akorát v C _musíte_ řešit problémy, které C++ leckdy vyřeší za Vás, pokud ho o to požádáte.
Akceptovatelným důvodem proč lidé dávají přednost C před C++ v nových projektech je ten, že neumím C++ (pak je ale potřeba jasně sdělit, že C++ neumím a neztrapňovat se argumenty ve stylu, že v C++ nemám věci pod kontrolou, nebo je tam horší správa pěmti a podobnými nepravdami), nebo ten, že používám exotickou architekturu, kde neexistuje dobrý kompilátor C++ (pak často existuje jen kompromisní kompilátor C, často je třeba nutné definovat K&R syntaxi funkcí).
Pro spoustu lidí je C++ složité a pak dávají přednost C, ale je třeba aby nelhali.
Re: a co stare dobre C?
celé vláknoZe by neumeli C++? To se mi nezda...
Co takhle zkusit Sphinx C-- :-)
Re: a co stare dobre C?
celé vláknoTomáš
Re: a co stare dobre C?
celé vláknoJinak v pripade techto vypoctu pujde asi hodne o RAM pamet, alokace souvislych bloku.
C# neznam a zatim nehodlam, z hlediska naroku na zdroje. Na druhou stranu efektivita psani kodu vypada skutecne lip. Prenositelnost asi neni taky nekdy k zahozeni. No a pro distribuovany vypocet je to o knihovnach. Muzes zkusit i ten assembler ale tam je to 50 na 50, jestli skutecne vic vic nez autori prekladace.
Preji hezky novy rok
Re: a co stare dobre C?
celé vláknoAssembler nedoporučuji, protože pokud nejste opravdoví machři, jakých je možná pár na světě, tak C/C++ udělá rychlejší kód, než Vy v assembleru. Ono totiž napsat rychlý kód v něm není žádná legrace a není problém, aby nepatrná změna v kódu, třeba přehození dvou instrukcí způsobila změny rychlosti o desítky procent. Zápas mezi asm a Intel C/C++ kompilátor určitě vyhraje v rychlosti ten Intel C/C++ kompilátor. Výjimku tvoří jen pár velmi nabušených lidí na této planetě.
Re: a co stare dobre C?
celé vláknoAssembler nedoporučuji, protože pokud nejste opravdoví machři, jakých je možná pár na světě, tak C/C++ udělá rychlejší kód, než Vy v assembleru. Ono totiž napsat rychlý kód v něm není žádná legrace a není problém, aby nepatrná změna v kódu, třeba přehození dvou instrukcí způsobila změny rychlosti o desítky procent. Zápas mezi asm a Intel C/C++ kompilátor určitě vyhraje v rychlosti ten Intel C/C++ kompilátor. Výjimku tvoří jen pár velmi nabušených lidí na této planetě.
Re: a co stare dobre C?
celé vláknoC++ je prostě jeden z jazyků, je to nejefektivnější jazyk pokud chcete z počítače vymáčknout maximum (s výjimkou strojáku). Pokud chcete tohle, je C++ lepší. Pokud chcete něco jiného, mohou existoval lepší jazyky na daný účel.
Školení: Hackujeme operační systém Android

Školení vám ukáže, jak se dostat k Linuxu (tzv. "rootování"), který se pod hezkou tváří Androida skrývá a jak ho naplno využít. Pomůže vám to při záloze dat, zvětšování prostoru pro aplikace nebo sdílení připojení k internetu a pokud chcete z telefonu dostat opravdové maximum, ukážeme vám, jak v něm vyměnit kompletní systém za lepší.
Podrobnější informace a přihláška

