Já bych to nezatracoval. Jedná se o poctivý assembler, viz. např. formátování disku (https://github.com/Microsoft/MS-DOS/blob/master/v2.0/source/FORMAT.ASM). Jen ať se mládež podívá, jak to dříve dělalo :-)
Dnesni mladez neumi programovat ale googlit. Nasledne pouzivat CTRLC CTRLV. Bez jakychkoliv hlubsich znalosti.
PS: Mluvim jako clovek co zazil strojovy kod u pocitacu jako ZX Spectrum, Didaktik Gama, PC XT (8086), atd. Dnes jsem za to nevyslovne vdecen. Aplikace, ktere programuji dnes samozrejme ve vyssich programovacich jazycich, jsou velice rychle a pametove absolutne nenarocne a to paradoxne i v momente kdy se pracuje s velkymi daty.
To je váš subjektivní názor. Důkazy o mém tvrzení mám od nás z práce u některých čerstvých absolventů VŠ (paradoxně dost častý výskyt). Jakýkoliv framework co najde, použije, nedejbože zuby nehty prosazuje. Že je to obvykle o 150% pomalejší, než když to po něm přepíšeme buď já nebo kolega včetně testů, měření časů daných operací a důkladného logování, student na to reaguje obvykle slovy "Aháááá, tak to jsem netušil". Holt zkušenosti a praxe jsou prostě zkušenosti a praxe.
Pořád lepší pamětník, který si dokáže uvědomit jak data v paměti mohou leckdy nabobtnat, než student, který si myslí, že framework je univerzální řešení na vše. Vždyť to přeci používají na facebooku, tak to musí fakčit. Jenže my nejsme facebook.
@ted
Ano je to můj názor.
No, tak za prvé bych řekl že ani ty jsi zkušený z nebe nespadl, ale když už teda asi ano, tak za druhé teda jak to že nějakému tomu po-školákovi bobtnají data, napíše to 1,5 * pomalejší když "dnes samozrejme ve vyssich programovacich jazycich, jsou velice rychle a pametove absolutne nenarocne a to paradoxne i v momente kdy se pracuje s velkymi daty."
No přiznám že mám s "mladšími kusy" podobné problémy, ale že by jenom kopírovali z webu a dnešní programovací jazyky byly bezproblémové (bezp., optimalizace ....) bych rozhodně neřekl. spíš naopak. A kéž by ti mladí radši občas něco odněkud zkopírovali správně, než zmatlali vlastnoručně, když už neumí použít hubu na to, aby se poradili ...
Ano .. i tihle experti existují, potvrzuji. Ty to obvykle nebaví.Ale mají ego jako kráva a jsou si svým názorem naprosto jisti. Opět dokud jim není ukázáno a opakovaně změřeno, že smyčka, která dělá totéž, co napsal dotyčný expert po svém trvá 450 milisekund misto jejich 2.6 sekundy a místo 650 mega ram potřebuje jen 2.5 mega.
když "dnes samozrejme ve vyssich programovacich jazycich, jsou velice rychle a pametove absolutne nenarocne a to paradoxne i v momente kdy se pracuje s velkymi daty."
Nevím jestli jste pochopil, ale právě ta vybičovanost z dřívějšího slabého HW tehdejší doby mě (ne jim, ale mě osobně) dnes umožňuje myslet stále tak, jako by systémových prostředků bylo sakra málo a bylo potřeba neplýtvat. Ani časem, ani pamětí, ani diskem, ani sítí, ani čímkoliv.
Dnešní mládež má systémových prostředků dostatek, a tak si jich neváží. V testu s mikrodaty mu to běhá obstojně, ale jak se to pošle do produkce s mnohem většími daty, sčítá se bajt k bajtu a milisekunda k milisekundě a pak aplikace tuhne a dělá různé psí kusy, logy na serverech bobtnají, místo dochází, stroj swapuje jak o život.
Čím to je? Nikdo tyhle studenty neučí pořádně myslet do hloubky. Vše je tak nějak povrchní, látané, slepované, googlené.
Zmiňovaným průserářům samozřejmě radíme jak to udělat lépe a nezabastlit to tunou odpadu, o kterém dotyčný ani neví jak funguje, nebo na jaké konkrétní řešení daný autor daného frameworku chtěl své dílo použít, které ne až tak zcela sedí na naše potřeby. Jenže za půldenní školení nejsme placeni.
Na druhou stranu jsou i studenti, kteří s IT co se svého studia nemají vůbec nic společného, třeba jeden je stavař, ale od dětství ho to skutečně zajímá a má to jako svůj koníček. Jeho kód je mnohem pružnější než kód toho, který prošel VŠ.
@ted
No pochopil a bojuju s tím taky. Nevěř tomu, že dnes není potřeba to hlídat. Není to sice jako v časech 8-bitů s pár kilo paměti, a i s tím se lze lehce setkat i dnes, ale shodit server datovou zhovadilostí není nic tak neobvyklého - jeden k druhému, pak někdo přimatlá třetí a už to jede ... To ale není tím co jsi psal, to je osobní leností a nezájmem. Neprofesionalitou. To ano. Ale že by to dnes řešili jazyky vyšší úrovně, to neplatí ani z daleka ... Proto jsem se ozval. Fakt bych byl radši kdyby mi tu někteří výjímečníci kód zkopírovali a jazyk to dořešil za ně, ale tak to fakt nefunguje. Ve finále je za tím nezájem, lenost a hloupost - ale neřekl bych že to platí pro nějako majoritní skupinu - jsem ochoten uznat půl na půl a taky uznávám že jsem nepotkal 1/2 světa.
Osobní lenost a nezájem. Ano. Například teď řeším rekurzivní funkci po jednom borcovi s VŠ. Jedná se o PHP. V parametrech, které té funkci předává má docela hutnou datovou strukturu, mnohaúrovňové asociativní pole. Samozřejmě si ji jako parametr dáva při volání rekurze znovu a znovu.
Co se stane, když mu to vletí 150x do sebe. No octne se ta hutná struktura 150x v zásobníku.
Hele Franto, pojď sem prosímtě. Podívej se. Když před parametr v definici funkce dáš ampersand, pak předáváš jen referenci. a NE KUR*A DO HAJZ*U UZ 150x TU TVOU 15TI MEGOVOU STRUKTURU VŠECH VÝSLEDKŮ Z DB SE VŠEMI DATY, KTERÉ NAVÍC V TOMHLE ŘEŠENÍ K NIČEMU NEPOTŘEBUJEŠ. Zákazník mě (MĚ .. CHÁPEŠ .. MĚ) naposled jeb*l za to, že ten upgrade je ještě horší než před tím.
A takhle já tu občas teču :(
@ted
No to teču taky. Pár takových kusů, mladých i starších, máme taky. To se pozná rychle, otázka je co s tím. Code review zase zdržuje a obtěžuje ostatní, taky vyvolává mezi některými dokonce dlouhodobé spory. Oh, jak lidské ... A bez toho zápalu to je prostě marný, je to marný, je to marný ....
Pak je tu ale ještě množinka horlivých s velkým egem, tam to učení jde taky pomalu. Ale aspoň jde ...
Takže na zásobníku se ocitne jediný pointer na to asociativní pole. A to i bez reference.
Protože všechny proměnné jsou (jako v každém dynamicky typovaném jazyce) jen jména s jednoduchou strukturou s odkazem na hodnotu.
Navíc pokud je pole jen pro čtení, tak existuje stále jedna jediná kopie pole, ať jí předá na kolik bambiliónů míst chce. Protože pole se zkopíruje až při změně pomocí mechanismu "copy on write".
Miloslav Ponkrác: "Takže na zásobníku se ocitne jediný pointer na to asociativní pole. A to i bez reference."
Nemate pravdu.
PHP:
$t=array();
for ($i=0;$i<2000;$i++)
$t[]="fucking ".$i;
rekurze($t,0);
function rekurze($t,$level)
{
echo $level." ".memory_get_usage()."\n";
$t[]="novy prvek";
if ($level<20)
rekurze($t,$level+1);
}
php test2.php
0 503536
1 573256
2 642944
3 712632
4 782320
5 852008
6 921696
7 991384
8 1061072
9 1130760
10 1200448
11 1270136
12 1339824
13 1409512
14 1479200
15 1548888
16 1618576
17 1688264
18 1757952
19 1827640
20 1897328
Zajimave ale je ze pokud vynechame radek $t[]="novy prvek"; tedy nemodifikujeme pole, pak se alokovana pamet nemeni.
php test2.php
0 503336
1 503368
2 503368
3 503368
4 503368
5 503368
6 503368
7 503368
8 503368
9 503368
10 503368
11 503368
12 503368
13 503368
14 503368
15 503368
16 503368
17 503368
18 503368
19 503368
20 503368
s referenci:
<?
$t=array();
for ($i=0;$i<2000;$i++)
$t[]="fucking ".$i;
rekurze($t,0);
function rekurze(&$t,$level)
{
echo $level." ".memory_get_usage()."\n";
$t[]="novy prvek";
if ($level<20)
rekurze($t,$level+1);
}
?>
php test2.php
0 503560
1 503592
2 503592
3 503592
4 503592
5 503592
6 503592
7 503592
8 503592
9 503592
10 503592
11 503592
12 503592
13 503592
14 503592
15 503592
16 503592
17 503592
18 503592
19 503592
20 503592
S referenci s unikatnim prvkem
<?
$t=array();
for ($i=0;$i<2000;$i++)
$t[]="fucking ".$i;
rekurze($t,0);
function rekurze(&$t,$level)
{
echo $level." ".memory_get_usage()."\n";
$t[]="novy prvek ".$level;
if ($level<20)
rekurze($t,$level+1);
}
?>
test2.php
0 503560
1 503632
2 503672
3 503712
4 503752
5 503792
6 503832
7 503872
8 503912
9 503952
10 503992
11 504032
12 504072
13 504112
14 504152
15 504192
16 504232
17 504272
18 504312
19 504352
20 504392
Chovani hashmapy v PHP, nebo jakze se to jmenuje :)
Porad lepsi jak bez reference. :)
@t
Nenapsal jsi která verze PHP. Každopádně u PHP 7 to funguje v podstatě stejně. Když pole modifikuješ, tak se vytvoří pro danou proměnou nové a to se modifikuje. Když to uděláš pro pole které je má referenční vztah a modifikuješ ho, tak se vytvoří nové, na něj ukazuje reference a to se mění, pouze ale proty, které mají tento referenční vztah.
@t
Jinými slovy můžeš sice předávat proměnou a ona se nerozkopíruje, nicméně jakmile změníš její hodnotu tak se zkopíruje do nové, navíc ještě se scope. S použitím ampresandu se mění pro všechny které na které ukazuje, takže by se dalo říct, že se zkopíruje méněkrát. Tedy pro php 7.1:
echo 'Start:'. memory_get_usage() . "\n";
$array = array_fill(0, 100000, 'x');
echo 'Allocked:'. memory_get_usage() . "\n";
function case1($array)
{
$array[0] = 1;
echo 'Changed:'. memory_get_usage() . "\n";
return $array;
}
$array = case1($array);
echo 'End:'. memory_get_usage() . "\n";
Start:358720
Allocked:4553120
Changed:8747488
End:4553120
Pokud bude proměná vrácena z funkce do nové, 'End' bude samozřejmě 8747488. Opět přijde na zkopírování. Ale pokud je použita PHP Reference:
echo 'Start:'. memory_get_usage() . "\n";
$array = array_fill(0, 100000, 'x');
echo 'Allocked:'. memory_get_usage() . "\n";
function case2( & $array)
{
$array[0] = 1;
echo 'Changed:'. memory_get_usage() . "\n";
}
case2($array);
echo 'End:'. memory_get_usage() . "\n";
Start:353328
Allocked:4547728
Changed:4547752
End:4547752
Jak je vidět, při předávání proměných a jejich změnách, byť nepatrných může usage vyletět na násobky ...
Což je přesně to, co jsem napsal. Pokud se pole nemění, můžete si jeho kopii předat klidně miliardkrát jako parametr funkce/metody, a žádná paměť se nealokuje. Stačilo umět číst, a nemusel jste mi odporovat, abyste zjistil, že mám pravdu, a následně se mnou souhlasil.
Pro mě jsou hlavně cennou zkušeností počty plusů a mínusů pod mým příspěvkem, kde jsem to napsal. Momentálně je tam vidět, že pouze 1 (plus) člověk něco umí, a 5 (mínusů) lidí umějí kulové a neví, která v programování bije.
Vy jste nakonec zjistil, že mám pravdu.
A já vám ještě prozradím sladkou novinu, že toto zdaleka není vlastnost jen PHP. Stačilo by o tom programování něco vědět.
Ale nenechte se pánové rušit. Dále nadávejte na mladé, jak nic neumějí. Je to v kurzu. Když ještě přidáte plačky, jak jsou ženy v IT diskriminovány, a do toho si zanadáváte na Linuse Torvaldse, jak hruše se chová - tak jste zcela moderní a progresivní kousci.
Je zvláštní, kolik keců naděláte. Přitom já jsem psal průzračně a jednoduše, a nezpochybnili jste ani čárku z toho co jsem napsal. Kolik slovní vaty a slovní mlhy se snažíš vypouštět, abys to nemusel přímo napsat.
Takže se nenech rušit v nadávání na to, jak je mládež špatná v programování.
@Miloslav Ponkrác
1. Nauč se číst, já se mládeže zastal s tím, že je to o lenosti a hlouposti, nikoliv o věku, rozumbrado
2. To co jsi napsal platí jenom pro php 7+ . Pro php 5 to tak úplně neplatí protože ta používá tabulky s odkazy ta uložené proměnné, takže jakákoliv alokace způsobila nárust paměti - ne přímo o samotnou proměnou, ale o zápisy do jednotlivých tabulek - byly 2, tedy : 2 * 8 B tuším per nová proměná ... nevysvětli jsi nic krom toho že dokud proměnou nezkopíruješ tak se nevytváří nová, ale o tom jak pracuje s interními referencemi - což se liší pro php 5 a 7 jsi neplácl ani to "liší se" ... takže výsledek je akorát tvoje polomoudro které ví 3/4 programátorů které to aspoň trochu zajímá a ještě napůl správně + samozřejmě hromada keců, urážek a šťopuchanců.
3. V souvislosti se spatlanými programy nebyla řeč jenom o alokaci proměných ale absenci správných návyků vůbec.
Miloslav Ponkrác
Zpochybnil. Vy jste v prvni vete psal ze na referencich nezalezi. At tak ci tak, ze se predava vzdy pointer. A ja proste jen ukazal ze zalezi a to jako dost. Takze pouziti referenci proste znacne zmensuje uziti RAM konkretne v techto pripadech a to u jakekoliv appky je vitana vlastnost. Psal jste i o COW, coz samozrerjme taky funguje, ale nevyvraci to fakt, ze na referencich proste ZALEZI a basta fidli. Ad slovni vata. no pokud vam vadi 4 ukazky kodu, mereni a vysvetleni predrecnika, poridte si ctecku psaneho textu, ta vam to precte a nemusite cist slovni vaty. :) A nebo to proste nectete a je klid.
Jj, denšní produkti VŠ ani netuší, že třída (rep. instance objektu) má nějaký overhead v podobě tabulky metod, VMT, volitelně tabulky se jmény metod/atributů,... Pak se používá třída místo struktury a najednou se swapuje, i když je tam jenom zlomek toho, co vezmou v paměti čistý data.
2Kentan z Montargi ...
"Záleží jak kde (jazyk) se s datovými strukturami zachází ..."
"Spíš mluvíš jako zapšklý pamětník, který moc neví o dnešním programován..."
Zalezi jenom na tom, ze ten debil co ti pise o tom nema ani paru. On vubec netusi ze to neco sezere pamet. A pricina je mimo jiny prave v tech jazycich, ktery vsechno delaji "samy", takze ten patlal vubec nevi, ze to nekde alokuje pamet. Jeste horsi sou pak vytvory, ktery ani neumoznujou s tim neco udelat, protoze prece GC a dalsi krutoprisny samoserozni veci. Pak to vypada tak, ze hello world ma 8MB ... a nedelam si prdel ani trochu vyzkousej si to, nahod si posledni visualko od M$, mozna se ani do tech 8MB nevejdes. To co ve skutecnosti ani zdaleka nepotrebuje ani 1kB.
@j
IMO nemůžeš debatu o výhodách a nevýhodách vyšších programovacích jazyků, byť jenom o alokaci paměti a GC, sploštit na velikost "Hello World". To je v praxi něco jako "pokusy platné ve vakuu".
Kdybys pak takovou velikostní soutěž chtěl vyhrát, tak to napiš v asembleru a máš vyhráno - dokud v tom nebudeš muset napsat třeba web Amazonu kde se každý den věci přidávají a mění s důrazem na uživatele a výdělek, nikoliv velikost v [kB] nebo [MB] když jenom denní pohyby dat mezi uzly mají v [TB].
Automatická správa paměti má své výhody a své nevýhody, záleží na tom na co a kde to potřebuješ.
A jsou lidi s pomýlenými názory, kteří si myslí, že objekt/třída = automaticky neefektivita a overhead. I takoví se vyskytují mezi námi.
Jsou lidí, kteří si pletou syntaktický cukr programovacího jazyka (třeba třídy) a myslí si, že to automaticky povede k neefektivní binárce a velké spotřebě paměti.
Objektové programování je především programátorské paradigma, nikoli nutně neefektivní program s enormní spotřebou paměti.
To budou asi ti nezkušení a neznalí mladí programátoři, co nic neumějí...
já si zrovna nevzpomínám že bi ucitel na hodině ukazoval použití struktur párkrát se o tom sice zmínil ale příkladů na to moc nebylo obvikle to bylo stylem :
class <nazev> {
<typ> pronenna {get;set;}
...
}
zajímavé taky je že u jednoho příkladu (pohyb autíček(libovolného počtu) po dráze) jsem od učitele slišel že to nejde udelat bez listů a tríd a přitom z vlastní skušenosti vím že hodně věcí jde udělat bez struktur/tříd a to stilem:
float []polevektoru_x;
float []polevektoru_y;
...
a ten libovolnej počet jde řešit tím že naklikat tam 10000 objektů to by si komise teda dala práce aby zjistili že to spadne
Petr M. >> "Jj, denšní produkti VŠ ani netuší, že třída (rep. instance objektu) má nějaký overhead v podobě tabulky metod, VMT, volitelně tabulky se jmény metod/atributů,... Pak se používá třída místo struktury a najednou se swapuje, i když je tam jenom zlomek toho, co vezmou v paměti čistý data."
Vy z toho programování také moc neumíte, že ne?
Ve velké řadě programovacích jazyků nemá třída oproti struktuře overhead naprosto žádný, pokud se budeme bavit o datových členech (atributech). Objektové programování není primárně o neefektivitě.
Z principu, třída má vždycky overhead. Obsahuje metody (= funkce a nějakou strukturu ukazatelů na ně) a atributy (tam se to neliší od struktury s daty až na to, že je tam pár ukazatelů navíc - metody atd.). Navíc funkce, která implementuje metodu, musí mít skrytý parametr s odkazem na datovou strukturu (this v C++, self v ObjectPascalu,...).
Pokud zavedeš polymorfismus a dědění, tak se zavedou ještě tabulky VMT, reference na třídu předka apod.
Hodně z toho sice dokáže vyházet kompilátor, ale v případě, že chceš několik instancí třídy, neobejdeš se bez předávání reference na data (tam je overhead minimální - v podstatě skrytý předání parametru funkce). Pokud máš jedu instanci, je to zbytečný overhead. A pokud chceš dědit, tak jinou možnost, než přidat VMT, v podstatě nemáš (a to už je často efektivnější DI nad prostými daty).
V případě dynamické alokace třídy máš navíc k instanci ještě nějaký header na heapu, který je použitý pro správu paměti (minimálně velikost bloku + odkaz na další použitý blok), předpokládejme 16B v 64b systému. Uděláš pole[16] a máš na heapu režii 16B. Zavoláš v metodě pro init pole objeků 16x konstruktor a jdi kde? Storage třída + 16x datová třída, to je 272B jenom v režii heapu... 17x víc, než by zabralo prostý pole dané velikosti, získaný přes malloc.
A čitelnost je diskutabilní. Bez použití tříd totiž nemusím dělat override indexace pole a podobný vopičárny, jde použít přímo nativní indexování v kompilátoru, inkrement pointeru,... Prostě je to pole, použiju data[5].size a je to.
2ted: "...logy na serverech bobtnají, místo dochází, stroj swapuje jak o život."
nj, to je easy, tak se prohlasi ze za to muze ddos a jede se dal. Priklad? Co te napadne ze se stane kdyz vydas novou hru? Nj, napadne i pomerne slusnyho blbce, ze bude naval ze? A PRESNE tady je moznost vyuzit ty cmoudy. Potrebujes vykon, ale potrebujes ho na 14 dnu, mozna mesic. Ale svist to ze to nefunguje na ddos je prece jednodussi, no ne?
A cim to je? Mno on je totiz nikdo neuci myslet, ne do hloubky, ale vubec. Ale na tom se tak nejak nic nezmenilo, to neni zadna novinka, jen dneska mnohem vic lidi ceka, ze je jako v ty skole nekdo neco nauci, kdyz prave tam to ucej ti nejvetsi pitomci. Kdyby byli jini, tak prece nedelaj za 30 ucitele, kdyz muzou za 300 programovat. (BTW: chces jit ucit ucne drzet v ruce pilnik? Mno tak na to musis mit VS ... kdo toto "vymyslel" tak musel mit mist drzky opravdu velkou PYCU)
Pred tema 30+ lety zadny skoly a it/programovani/... nebyly a tudiz se kazdej musel pekne vsechno naucit sam === sam si najit informace, sam si to vyzkouset. Dokonce i kdyz si chtel hrat hru, musel si hodne veci vedet a umet. Ne jako dneska ze si kliknes na ikonu a tim koncis.
2ted: Dnesni mladez uz neumi ano guuglit napisou svuj domaci ukol sem a cekaj ze tu dostanou vysledek.
Navic naprosto netusej co vlastne dela HW, netusej ani co dela SW ... nemaj vlastne vubec paru o programovani, protoze jim voe nekdo rek ze za to voe bude skvara. Klidne se ti muze stat, ze prijde "programator" a netusi co to je smycka. Zato je schopnej se stebou dokrve hadat o tom, kterej "frejmwork" je lepsi.
Kdyby jen netušili. Oni někdy i anti-tuší. To se pak dozvíte, že procházet všechny prvky ve smyčce by bylo pomalé, takže místo toho použili Linq s .Where a jako bonus přihodili .OrderBy.
Touhle "magií jak zpracovat pole hodnot v konstantním čase" jsou prolezlí zejména uchazeči, co mají v životopise několik funkcionálních jazyků. Někteří si za tím dokonce stojí a sypou z rukávu termity jako "lazy evaluation" nebo dnes populární "paralelně".
* Zaprvé je špatná škola, což je patrné už z obvyklé mantry "ve škole nás učili, že..."
* Zadruhé jak píšete - nikdy nezpracovávali takový objem dat, aby se to projevilo.
* Zatřetí jsem za to vlastně rád. Podstatná část mé pracovní náplně spočívá v ladění výkonu aplikací. Je to rok od roku snadnější. Ne že bych se nějak extra zlepšoval, ale profilery fungují rok od roku lépe a vývojáři tam sází čím dál tím větší boty. To pak stačí třebas vyměnit List za Dictionary, report rázem místo 20 minut běží 2 minuty a já mám splněno, protože report zase dobíhá dříve, než timeout uživatele odhlásí.
Autoři by to mohli udělat také, ale prostě je to nenapadne a na 100 záznamech to funguje bleskově. Já ladím až na datech zákazníka, kde je záznamů třebas 20 milionů a místo 89 milisekund to běží čtyři hodiny. Profiler obvykle píchne prstem přesně na ten řádek, kde je problém. Kupříkladu minulý týden to byl jeden legrační substring. A ano, autor si myslel, že substring je oprace fungující v konstantním čase.
@Karel
Dovedu pochopit že člověk který na to nemá školy (třeba nadšenec), nebo je snad škola kterou má špatná jak píšeš, že si na tomto prostě musí alespoň jednou vylámat zuby. Ale zlom podle mě přichází tehdy, když se s těmito tématy onen člověk setká, vykašle se na to, nejeví zájem a patlá dál ...