Zpomalování operací při vypisování dokončených % – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zpomalování operací při vypisování dokončených % – C / C++ – Fórum – Programujte.comZpomalování operací při vypisování dokončených % – C / C++ – Fórum – Programujte.com

 

Thomasso0
Newbie
4. 5. 2011   #1
-
0
-

Zdravím,

programuju editor wav souborů a když se provádí např. rozdělení souboru na 2, tak bych chtěl vypisovat něco ve stylu:

Probiha vytvareni prvni casti.
100% dokonceno.
Probiha vytvareni druhe casti.
25% dokonceno.

Problém je, že tohle vypisování drasticky zpomaluje proces. Když tam to vypisování není, tak je procesor s programem za pár sekund vypořádán, ale když je, tak to trvá minutu. Dotaz tedy zní, jde to udělat tak, aby to vypisovalo %, ale nezpomaloval se samotný proces?

Teď to vypadá takto:



// zapsani dat do fw1
fseek(fr, 4, SEEK_CUR);
printf("Probiha vytvareni prvni casti.\n");
for (i = 0; i < vzorky_fw1; i++) {
printf("%d%% dokonceno.\r", i * 100 / vzorky_fw1);
if (i == vzorky_fw1 - 1) {
printf("100%% dokonceno.\n");
}
if (fread(&buffer, 1, 1, fr) != 1) {
return CHYBA_READ;
}
if (fwrite(&buffer, 1, 1, fw1) != 1) {
return CHYBA_WRITE;
}
}

// zapsani dat do fw2
printf("Probiha vytvareni druhe casti.\n");
for (i = 0; i < vzorky_fw2; i++) {
printf("%d%% dokonceno.\r", i * 100 / vzorky_fw2);
if (i == vzorky_fw2 - 1) {
printf("100%% dokonceno.\n");
}
if (fread(&buffer, 1, 1, fr) != 1) {
return CHYBA_READ;
}
if (fwrite(&buffer, 1, 1, fw2) != 1) {
return CHYBA_WRITE;
}
}


Díky za odpovědi,
s pozdravem,
Tomáš.

P. S. - špatné odsazení je způsobeno zkopírováním, jinak je to v pořádku.

Nahlásit jako SPAM
IP: 80.188.117.–
m->29+6
Super člen
4. 5. 2011   #2
-
0
-

Tak v prvom rade by som vyhodil delenie 100 / vzorky_fw1 a 100 / vzorky_fw2 pred cykly, pretože to bude asi stále konštantné. Delenie je celkom drahá operácia.
Následne nemusíš stále v cykle testovať

if (i == vzorky_fw2 - 1) { 

printf("100%% dokonceno.\n");
}
Ale stačí ti za každý cyklus napísať
puts("100% dokonceno.");
A nakoniec neviem prečo čítaš po bytoch. Sprav si nejaký väčší buffer a čítaj a zapisuj po blokoch. Dokonca vieš aký veľký ten blok bude (vzorky_fw1, vzorky_fw2) tak čo ti bráni dynamicky alokovať taký buffer a prečítať/zapísať to na dva krát?

Nahlásit jako SPAM
IP: 83.240.51.–
Thomasso0
Newbie
4. 5. 2011   #3
-
0
-

Nevím, jak bych to s tím dělením měl udělat. Je to klasická trojčlenka a všechny hodnoty jsou int. Kdýž dám dělení před cyklus, tak si musím vytvořit pomocnou proměnnou, něco jako:



int procenta_pom;

procenta_pom = i / vzorky_fw1;


Jenže to vyjde samozřejmě 0, protože dělení integerů se zaokrouhluje dolů.

S tím testováním 100% máš pravdu, opravil jsem :-).

A na to třetí už bohužel nemám čas, je to maturitní projekt, který musím do konce týdne odevzdat :-). Jsem prakticky začátečník a dynamickou alokaci jsem nikdy nedělal.

Nahlásit jako SPAM
IP: 80.188.117.–
m->29+6
Super člen
4. 5. 2011   #4
-
0
-

Ja som nepísal aby si vyhodile pred cyklus i/vzorky_fw1 ale 100/vzorky_fw1, pretože to bude stále rovnaké. Aby ti to nezaokrúhlilo tak si vytvor premennú typu float:

float procent_na_vzorek = 100/vzorky_fw1;
Potom ti stačí v cykle písať
printf("%d%% dokonceno.\r", (int)(i*procent_na_vzorek));
. Hádam chápeš na čo je tam to pretypovanie.

A čo sa týka toho načítavania tak ak nevieš pracovať s dynamickou pamäťou tak ti stačí statický buffer[100]; a môžeš načítať po 100 bytoch, ale nie po jednom :smile17: potom tomu musíš samozrejme prispôsobiť aj inkrement v cykle ;-)

Nahlásit jako SPAM
IP: 83.240.51.–
Thomasso0
Newbie
4. 5. 2011   #5
-
0
-

Jo, to jsem se upsal :-) Samozřejmě tam mělo být 100/vzorky.

Už to funguje, zapomněl jsem na ono přetypování :-). Bohužel to ale vůbec nepomohlo rychlosti. Je to stejně rychlé jako při předchozím provedení :-(.

Když se nevypisuje nic, tak je to hotový cca za 5 vteřin a když vypisuje (třeba i bez počítání, jen třeba písmeno i), tak minutu. Nechápu.

Nahlásit jako SPAM
IP: 80.188.117.–
nervak0
Věrný člen
4. 5. 2011   #6
-
0
-

Co nechápeš? printf je pomalý a konzole super pomalá. Nevypisuj ten stav po každém bajtu.

Nahlásit jako SPAM
IP: 213.211.51.–
Thomasso0
Newbie
4. 5. 2011   #7
-
0
-

To mě napadlo, ale já vůl napsal

if (i % 10000) {

printf...;
}


a nedošlo mně, že to musí být
i % 10000 == 0

Taková školácká chyba no :-D. Už to je v pohodě, díky.

Nahlásit jako SPAM
IP: 80.188.117.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý