[ Príspevkov: 14 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 06.11.12
Prihlásený: 29.04.14
Príspevky: 22
Témy: 6 | 6
NapísalOffline : 22.12.2013 19:42 | Efektívne čítanie príkazov - C

Nazdar,

v rámci spoznávania a učenia sa jazyka C by som chcel urobiť obdobu Windowsáckeho 'cmd.exe'. Cez tento program by som mohol testovať rôzne svoje podprogramy, ktoré by som externe naprogramoval a tu vložil čisto vo forme funkcií, ktoré by užívateľ volal príkazom v CLI, teda napríklad zadaním "root 345 8" by vypočítalo a vypísalo ôsmu odmocninu čísla 345.

Program bude fungovať v nasledujúcich krokoch:
1. Cez funkciu 'fgets()' vloží do reťazca vstup užívateľa
2. Vstup následne spracuje, vymaže z neho nepotrebné znaky a rozdelí ho na niekoľko ďalších reťazcov - prikaz[]; arg1[]; arg2[];...
3. Teraz program cez 'switch case' zistí, či príkaz naozaj existuje. Ak áno, povolá danú funkciu, ak nie, vypíše chybovú hlášku a vráti program na začiatok.

Toto všetko by malo fungovať, resp. neočakávam žiadne väčšie ťažkosti, avšak problém vidím v bode 3. Každý jeden príkaz si totižto vyžaduje vlastný 'case', čo by pri väčšom počte funkcií mohlo byť nepriehľadné, ťažko editovateľné a neskôr aj pomalé a neefektívne.

Keď som si robil menší prehľad o programovacích jazykoch, zaujala ma funkcia Pythona 'exec'. Tá dokázala vykonať reťazec kódu uloženého v premennej. Niečo také by sa presne hodilo do môjho programu, avšak pokiaľ som dobre hľadal, tak v C, ani v C++ nič takéto nie je. Preto sa obraciam na skúsenejších programátorov - ako zefektívniť 3. bod tohto programu? Ide to vôbec?

Za vaše odpovede dopredu vďaka.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 22.12.2013 20:20 | Efektívne čítanie príkazov - C

MatusMak píše:
Ak áno, povolá danú funkciu, ak nie, vypíše chybovú hlášku a vráti program na začiatok.

Čo presne sa ti tu zdá pomalé a neefektívne?

Samozrejme, podobná funkcia ako exec je v kompilovaných jazykoch nezmysel. Takže nie, nedá sa to. A ak by to aj niekto implementoval, tak až to by bolo neefektívne (real-time interpeter C-čka? no fuj)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 06.11.12
Prihlásený: 29.04.14
Príspevky: 22
Témy: 6 | 6
Napísal autor témyOffline : 22.12.2013 20:43 | Efektívne čítanie príkazov - C

S tou efektívnosťou mi ide o to, že program bude musieť prechádzať každým casom, kým nenarazí na zhodu alebo kým nedôjde na default. Čiže ak bude hľadať pokyny pre príkaz, ktorého case je úplne na konci, tak bude musieť kontrolovať všetky nad ním. Ak ich tam bude 200, tak 200 porovnaní.

Ako nehovorím, C je rýchly jazyk, čo dnešné CPU len znásobujú, ale aj tak, tlačiť systémovú záťaž dole nie je na škodu ;).


Offline

Užívateľ
Užívateľ
Efektívne čítanie príkazov - C

Registrovaný: 05.04.11
Príspevky: 1693
Témy: 50 | 50
Bydlisko: Žilina, Pop...
NapísalOffline : 22.12.2013 20:46 | Efektívne čítanie príkazov - C

Ak dobre chápem čo chceš, tak v Cčku ich zopár je : http://en.wikipedia.org/wiki/Exec_(computing)#C_language_prototypes
Hodím ti aj príklad, čo sme mali na operačných systémoch :

Kód:
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

int main (int argc, char * argv[]) {
 
  printf("Zaciname...\n");

  if (execlp("date", "date",NULL) < 0) {
    perror("Nastala chyba");
  }

  printf("Toto sa vypise len pri chybe!\n");

  exit(0);
}
/*
POZOR!!!! argumenty volania execlp su:
execlp(const char * path, const char * arg0, const char * arg1,....);
a TEDA pre spustanie programov musi byt arg0 nastaveny na nazov programu ktory spustame!!!
napr.:
execlp("ls", "ls", "-la",  NULL);
*/


Dodávam že príkaz je pre Unix jadro ...


_________________
rMBP 13 2015
iPhone 7
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 22.12.2013 21:09 | Efektívne čítanie príkazov - C

No keď už ťa trápia takéto veci, tak dobre: Môžeš napríklad v príkazoch vyhľadávať rýchlejšie, než lineárne. Nepoužiješ podmienky, ale normálne vyhľadávanie a pri zoradených príkazoch môžeš vyhľadávať logaritmicky.
Tam môžeš namietnuť neefektivitu porovnávania stringov, tak teda ďalej.
Porovnávanie stringov sa dá vyriešiť všeliakými stromovými štruktúrami. Pár z použivaných pre takéto účely je napr. tzv. prefixový strom (trie), radix trie (tieto dva sú používané napríklad napr. v jadre unixu), B-stromy (veľmi používané napr. v súborových systémoch a databázach) a veľa ďalších.
Tam sa ale treba rozhodnúť, čo je dôležitejšie - či časová, alebo pamäťová zložitosť štruktúry. Pri tých tvojich chabých sto príkazoch by bola takáto štruktúra dosť overkill. Bola by síce asymptoticky rýchla, ale zbytočne veľká a zložitá a tie podmienky by nakoniec vyšli možno aj rýchlejšie (pri tých milisekundách je to naozaj ťažko poznať)

Ďalej máš možnosť prejsť to klasickým rekurzívnym zostupom. To by ale viedlo na ťažkú diskusiu, pretože som vymenoval veľmi silné dátové štruktúry, ktoré by sa na to určite nejako dali napasovať a boli asi aj rýchlejšie. Toto veľmi závisí na tom, ako veľmi zložité by si to chcel mať.

Zachádzam ale do totálneho extrému, pretože na takto jednoduchú vec, akú robíš, by som určite nič nevymýšľal a podmienkoval to.

Takže záver: Keď robíš jednoduchú vec, urob ju jednoducho. v tvojom prípade by som sa skôr zamýšľal nad optimalizáciou jednotlivých programov, než na ich spôsob výberu.

PS: To, čo sem hodil XOLOO je niečo úplne iné.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 06.11.12
Prihlásený: 29.04.14
Príspevky: 22
Témy: 6 | 6
Napísal autor témyOffline : 22.12.2013 22:26 | Efektívne čítanie príkazov - C

Chápem teda, nerobiť z jednoduchej veci zložitú :). Takže ostanem u pôvodnej myšlienky. Ešte ma snáď napadlo, že by som niektoré príkazy s vyššou prioritou napísal do prvých casoch, aby sa vyhodnotili ako prvé, ale to už bude iba drobná vychytávka. Každopádne, vďaka za tvoj čas a za rozšírenie obzorov ;).


Offline

Prevádzkovateľ fóra
Prevádzkovateľ fóra
Efektívne čítanie príkazov - C

Registrovaný: 01.05.05
Príspevky: 13416
Témy: 1494 | 1494
Bydlisko: Bratislava
NapísalOffline : 22.12.2013 22:31 | Efektívne čítanie príkazov - C

Preco nerozdelis tych svojich 200 prikazov na rozne podmnoziny ktore by si volal dalsim argumentom a takto zmensil dany vyber, teda ak spravne chapem tomu co sa snazis spravit. Takto si svojich 200 roznych prikazov rozdelis na 10 podmnozin a teda ak mas dany prikaz posledny tak nemusi zbehnut navyse cez tych 199 porovnavani nad nim, ale zbehne len poslednu mnozinu zlozenu z 20 porovnavani, ci blba myslienka?


_________________
Streacom DA2 | SilverStone Titanium SX800-LTI 800W | ASRock X299E-ITX/ac | Intel Core i9-9980XE & be quiet! Dark Rock TF | Kingston HyperX Impact 64 GB DDR4 2666 MHz | NVIDIA Titan RTX 24 GB | Intel SSD Optane 905P 480 GB NVMe U.2 & Intel SSD 750 1,2 TB NVMe U.2 & Intel SSD 660p 2 TB NVMe M.2 & Seagate BackUp Plus Portable 56 TB USB | 55" 4K OLED Dell Alienware AW5520QF | Ergotron LX Wall Mount Keyboard Arm | Logitech Craft | Logitech G603 | Logitech F710 | Harman Kardon Sabre SB 35 & Sennheiser RS 175 | Microsoft Windows 11 Enterprise | APC Back-UPS BE-850 VA | Lenovo ThinkPad X250 & Microsoft Windows 11 Professional | iPhone 15 Pro 256 GB & Pitaka Aramid | SilverStone ML05B Milo | Corsair SF600 SFX 600W | ASRock X99E-ITX/ac | Intel Xeon E5-2683 v4 & NOCTUA NH-L12S | Kingston HyperX Savage 32 GB DDR4 2400 MHz | NVIDIA GeForce GT 710 1 GB | Intel SSD Optane Memory 32 GB NVMe M.2 & Intel SSD 730 240 GB SATA | Ubuntu 24.04.1 LTS
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 22.12.2013 22:40 | Efektívne čítanie príkazov - C

Ak sa teda zamyslíme nad tými 200 príkazmi, čo dal autor ako príklad pre "veľa podmienok", tak by bolo optimálne (podľa mňa) skôr nejaké hashovanie. Trebalo by vymyslieť hashovaciu funkciu, ktorá urobí z reťazca číslo a ideálne ešte všetky výsledky znormalizované (tzn. výjdu všetky čísla od 0 do 199 a vždy jednoznačne) Tak by stačilo zavolať raz rýchlu hashovaciu funkciu a adresovať sa priamo do pola (konštatná zložitosť aj jedna aj druhá) A v poli by mohli byť ukazatele na funkcie, alebo niečo podobné.
Ak by sa nepodarilo vymyslieť hashovaciu funkciu, ktorá dá pekné čísla, tak by som to zase riešil binárnym vyhľadávaním. Tak zavolám raz funkciu a v logaritmickom čase nájdem v (zoradenom) poli odpovedajúci príkaz.
Ďalšia možnosť je hashovanie reťazením, čo vedie v podstate na podobné riešenie, ako od JanoF.

Pri hlbšom zamyslení by sa dalo nájsť veľa ďalších a určite aj lepších riešení.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 23.12.2013 0:16 | Efektívne čítanie príkazov - C

MatusMak píše:
Ako nehovorím, C je rýchly jazyk, čo dnešné CPU len znásobujú, ale aj tak, tlačiť systémovú záťaž dole nie je na škodu ;).

Ešte ma napadlo, že by som mohol reagovať na túto vetu. To, čo som tu písal doteraz, je optimalizácia algoritmu ako takého (optimalizácia časovej/pamäťovej zložitosti)
Potom ešte existuje optimalizácia zameraná na hardware - tj. optimalizácia využitia skrytých pamätí(cache), optimalizácia kódu ako takého (transformácia cyklov, znižovanie počtu skokov atď), paralelizácia a tak ďalej.
Tieto optimalizácie sa ale robia pre náročné výpočty. Na takéto účely sú viac-menej zbytočné.
Ale napadlo ma, že ti ich spomeniem, keď si taký zvedavý :)
Pravdou je, že nech je C akokoľvek rýchly, akýkoľvek program, ktorý teraz napíšeš, často nevyužije CPU ani na 5%. Optimalizáciou kódu (práve takou, akú popisujem teraz) vieš efektivitu extrémne zvýšiť. Na ukážku si môžeš porovnať nejaký zložitejší výpočet napísať, skompilovať, spustiť a potom to isté skompilovať so zapnutými optimalizáciami (v GCC je to prepínač -O3 pre najvyšší stupeň)


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Efektívne čítanie príkazov - C

Registrovaný: 02.12.06
Prihlásený: 30.12.24
Príspevky: 690
Témy: 35 | 35
Bydlisko: Rimavská So...
NapísalOffline : 24.12.2013 21:55 | Efektívne čítanie príkazov - C

viem, že je to OT, ale je vôbec technicky možné resp. môže existovať problém na ktorý existuje implementácia algoritmu, ktorá je v nejakom jazyku (C) súčasne najmenej pamäťovo aj časovo aj počtom krokov a ešte aj kód má najmenej riadkov? samozrejme pre každý vstup?
intuícia mi vraví, že asi taký problém (úloha) nemôže existovať, ale nie som informatik


_________________
Math is the best!
Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 24.12.2013 22:54 | Efektívne čítanie príkazov - C

jarrro, ak by si bol informatik, vedel by si, že na jazyku vôbec nezáleží. Ani trochu. Jazyk ti len umožňuje spúšťať kód na danom procesore a neupísať sa k smrti vyťukávaním núl a jedničiek. Celá implementácia je len o tom, ako program správne namapovať na činnosť procesora.

jarrro píše:
súčasne najmenej pamäťovo aj časovo aj počtom krokov...

Čo sa algoritmov týka, v informatike existuje dosť rozsiahla teória zložitosti a tá rieši presne tieto veci. Táto teória často pracuje so zjednodušeným modelom počítača, tzv. turingovým strojom (aj z toho vidno, že na implementácií naozaj nezáleží)
Môžeš si o tom niečo prečítať napr. tu http://www.algoritmy.net/article/5774/Tridy-slozitosti
Je to už ale také celkom magické čítanie :) Na tvoju otázku sa preto ťažko hľadá odpoveď. Zjednodušene by sa dalo povedať, že áno - existujú optimálne algoritmy, ktoré riešia nejaký problém. Často ale aj teoreticky horší algoritmus môže riešiť daný problém lepšie, než ten optimálny - tj. všeliaké heuristiky, hľadanie probližných výsledkov, randomizované algoritmy atď. Ak do úvahy zoberieme aj paralelné výpočty, odpoveď sa ešte viac skomplikuje.

Btw. tvoja otázka z laického hľadiska vyznie divne. Existuje problém, na ktorý existuje optimálna implementácia? No áno, napríklad pričítanie jedničky k nejakému číslu. To dokážem urobiť na jedinú inštrukciu v snáď každom procesore. Podobne každá operácia, ktorá má vlastnú inštrukciu (typicky sčítanie, odčítanie, logické operácie a podobné veci, ktoré sa na úrovni fyzického hardware realizujú vždy rovnako)


Naposledy upravil BX dňa 25.12.2013 0:31, celkovo upravené 1

_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Efektívne čítanie príkazov - C

Registrovaný: 02.12.06
Prihlásený: 30.12.24
Príspevky: 690
Témy: 35 | 35
Bydlisko: Rimavská So...
NapísalOffline : 25.12.2013 0:20 | Efektívne čítanie príkazov - C

aha hanbím sa aritmetika prirodzených čísel ma nenapadla


_________________
Math is the best!
Offline

Čestný člen
Čestný člen
Efektívne čítanie príkazov - C

Registrovaný: 11.08.07
Príspevky: 4088
Témy: 34 | 34
Bydlisko: Brno
NapísalOffline : 28.12.2013 13:35 | Efektívne čítanie príkazov - C

BX píše:
Btw. tvoja otázka z laického hľadiska vyznie divne. Existuje problém, na ktorý existuje optimálna implementácia? No áno, napríklad pričítanie jedničky k nejakému číslu. To dokážem urobiť na jedinú inštrukciu v snáď každom procesore. Podobne každá operácia, ktorá má vlastnú inštrukciu (typicky sčítanie, odčítanie, logické operácie a podobné veci, ktoré sa na úrovni fyzického hardware realizujú vždy rovnako)

Uz sme velmi OT (neskor asi presuniem do Ostatnych), ale neda mi to - chapat jednu instrukciu ako atomicku operaciu, ktora stoji konstantny cas a pamat, je dost zavadzajuce. Je to samozrejme prakticke, ale inde ako na akademickej pode to moc nevyuzijes a realne nema zmysel pracovat s takymto vypocetnym modelom. 2+3 nestoji rovnako ako 2^300+3^200 -> treba premyslat nad logaritmickou cenou, nie jednotkovou.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3 | 3
NapísalOffline : 28.12.2013 16:06 | Efektívne čítanie príkazov - C

On sa pýtal na "optimálnu implementáciu". O tom, že záleží prípad od prípadu som napísal viac než dosť -> v tvojom príklade je to tiež prípad od prípadu.
A ak si všimneš, naschvál som nedal ako prvý príklad sčítanie dvoch čísel, ale inkrementáciu o jedničku, ktorá naozaj vždy stojí rovnako ;) Uviedol som to ako príklad a naozaj optimálnejšiu implementáciu než jednu inštrukciu (na procesore) nenájdeš. Len toľko som tým chcel povedať.

To, čo píšeš ty, je samozrejme pravda.


_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
 [ Príspevkov: 14 ] 


Efektívne čítanie príkazov - C



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

Zoznam príkazov pre Linux

v Operačné systémy Unix a Linux

2

2876

24.06.2013 14:32

phodinux

V tomto fóre nie sú ďalšie neprečítané témy.

Ako poslat viacero prikazov vmysql_query

v PHP, ASP

2

621

20.10.2007 22:33

m@-nX

V tomto fóre nie sú ďalšie neprečítané témy.

po zadani prikazov CMD pomaly internet

v Sieťové a internetové programy

4

520

20.07.2017 9:10

tairikuokami

V tomto fóre nie sú ďalšie neprečítané témy.

efektivne riesenie chladenia

v PC skrinky, zdroje a všetky druhy chladenia

15

1405

21.02.2008 13:12

.:M@Rt!nKo:.

V tomto fóre nie sú ďalšie neprečítané témy.

Efektívne využitie objemu

v Assembler, C, C++, Pascal, Java

3

476

21.09.2016 8:02

BX

V tomto fóre nie sú ďalšie neprečítané témy.

Efektivne vypnutie obrazovky u NB

v Mobilné zariadenia

8

2872

09.10.2010 12:27

stopa27

V tomto fóre nie sú ďalšie neprečítané témy.

Využijem HDD efektívne na 100%?

v Pevné disky a radiče

6

421

12.11.2013 16:41

shiro

V tomto fóre nie sú ďalšie neprečítané témy.

Ubisoft zavadza efektivne riesenie piratskeho problemu

[ Choď na stránku:Choď na stránku: 1, 2, 3 ]

v Novinky

89

5890

25.06.2010 18:28

Fry

V tomto fóre nie sú ďalšie neprečítané témy.

Ako spustiť neefektívny program efektívne? - FreeRTOS

v Články

0

799

06.08.2022 21:56

martinius96

V tomto fóre nie sú ďalšie neprečítané témy.

Ako efektívne využiť 24GB SSD v notebooku?

v SSD disky

4

556

05.10.2015 8:48

shiro

V tomto fóre nie sú ďalšie neprečítané témy.

efektivne nacitanie suboru do pamati v c

v Assembler, C, C++, Pascal, Java

4

2398

05.07.2011 14:53

v.tkac

V tomto fóre nie sú ďalšie neprečítané témy.

citanie kodu

v PHP, ASP

2

476

14.01.2011 20:42

slebo

V tomto fóre nie sú ďalšie neprečítané témy.

Periferne citanie

v Voľný čas a hobby

7

787

10.09.2012 10:19

dixi

V tomto fóre nie sú ďalšie neprečítané témy.

citanie textu odzadu

v PHP, ASP

2

855

14.06.2009 23:13

pa3ck

V tomto fóre nie sú ďalšie neprečítané témy.

C++ Čítanie ŠPZ

v Assembler, C, C++, Pascal, Java

4

634

28.03.2017 19:08

void

V tomto fóre nie sú ďalšie neprečítané témy.

Čítanie textu stránok

v Ostatné

1

545

09.04.2012 1:18

shaggy



© 2005 - 2024 PCforum, edited by JanoF