NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze: Machr na C# .NET - Binární sčítačka

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Odpovídá na Kit
Libor Šimo (libcosenior):15.5.2013 18:00

Po tejto úprave je to trošinku rýchlejšie.

#include <stdio.h>

void main() {
    int i, j;
    int soucet = 0;
    for (i = 0; i < 10000000; i++) {
        for (j = i; j != 0; j >>= 1) {
            soucet += j & (unsigned int)1;
        }
    }
    printf("\n%8d\n", soucet);
}
Odpovědět
15.5.2013 18:00
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):15.5.2013 18:43

Do pekla. Nakoniec to nie je pravda, po viacerých testoch mi vyšlo to tvoje rýchlejšie.

Nahoru Odpovědět
15.5.2013 18:43
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek Satik:15.5.2013 19:14

Take jsem to zkousel, vyslo mi oboji stejne rychle, jeste bych se mohl podivat, jestli to kompilator nezkompiluje na stejny kod.

Nahoru Odpovědět
15.5.2013 19:14
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Libor Šimo (libcosenior):15.5.2013 19:35

Myslím, že to nebude rovnaké. Testni nasledujúci kód, sú tam obidve možnosti.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define POCET 100000000
#define MAX   32000

short spocitat_dva(unsigned int cislo);
void vypis(unsigned int cislo);

int main(void)
{
    unsigned int i, j, pom;
    int *cislo;
    short vysledok = 0;
    double cas1, cas2;
    clock_t t1, t2, t3, t4;

    srand(time(0));
    cislo = (int *) malloc(POCET * sizeof(int));

    for (i = 0; i < 100; i++) {
        pom = rand()%MAX - 10000;
        printf("%3d. %6d: ", i + 1, pom);
        vypis(pom);
        printf(" = %d\n", spocitat_dva(pom));
    }

    for (i = 0; i < POCET; i++) {
        cislo[i] = rand()%MAX - 10000;
    }
    t1 = clock();
    for (i = 0; i < POCET; i++) {
        for (j = cislo[i]; j != 0; j >>= 1) {
            vysledok += j & 1;
        }
    }
    t2 = clock();
    cas1 = (double) (t2 - t1);
    printf("\n\n1. sposob: Scitanie cifier u 10.000.000 cisiel trvalo %.0f ms.\n\n", cas1);

    vysledok = 0;
    t3 = clock();
    for (i = 0; i < POCET; i++) {
        for (j = cislo[i]; j != 0; j >>= 1) {
            vysledok += j % 2;
        }
    }
    t4 = clock();
    cas2 = (double) (t4 - t3);
    printf("\n\n2. sposob: Scitanie cifier u 10.000.000 cisiel trvalo %.0f ms.\n\n", cas2);

    return 0;
}

void vypis(unsigned int cislo)
{
    short i;
    for(i = 0; i < 32; i++, cislo >>= 1)
    //printf("%d", cislo & (unsigned int)1);
    printf("%d", cislo % 2);
}

short spocitat_dva(unsigned int cislo)
{
    short i, sucet = 0;
    for(i = 0; i < 32; i++, cislo >>= 1)
    sucet += cislo % 2;
    return sucet;
}
Editováno 15.5.2013 19:35
Nahoru Odpovědět
15.5.2013 19:35
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek Satik:15.5.2013 20:09

Zkousel jsi to v release modu?

Nahoru Odpovědět
15.5.2013 20:09
https://www.facebook.com/peasantsandcastles/
Avatar
Libor Šimo (libcosenior):15.5.2013 20:25

Je to čisté céčko a neviem čo je release mód. Som absolútny samouk.

Nahoru Odpovědět
15.5.2013 20:25
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Luboš Běhounek Satik:15.5.2013 20:46

Ve vetsine kompilatoru se da nastavit, jestli se ma pouzit debug nebo release mod, v release modu jsou obvykle zapnute optimalizace a jsou tam vypnute ladici informace, takze je to rychlejsi.

Obcas pak muze nastat, ze kdyz treba porovnavas dve verze kodu v debugu, tak ta co byla pomalejsi je v release modu rychlejsi, takze to chce testovat v release modu.

Nahoru Odpovědět
15.5.2013 20:46
https://www.facebook.com/peasantsandcastles/
Avatar
Libor Šimo (libcosenior):15.5.2013 21:37

OK, používam Code:Blocks, dúfam, že to niekde nájdem. :)

Nahoru Odpovědět
15.5.2013 21:37
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Зайчик
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
Зайчик:15.5.2013 21:39

v code::blocks je to hned vedle build and run ;) "build target" je tam přímo takovej list kde je buď release nebo debug :)

Editováno 15.5.2013 21:39
Nahoru Odpovědět
15.5.2013 21:39
Коммунизм для нашего будущего!
Avatar
Libor Šimo (libcosenior):15.5.2013 21:50

Díky, už som to našiel, ale nastaviť to môžem len na projekte, nie na samotnom programe.
Už som to aj otestoval a predsa len je ten Kit-ov spôsob trochu rýchlejší.

Nahoru Odpovědět
15.5.2013 21:50
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:16.5.2013 22:09

Tak jsem to zkusil v C++ a dostal jsem se zatím na 10 ms u 1 000 000 čísel.

 
Nahoru Odpovědět
16.5.2013 22:09
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:16.5.2013 22:20

Mimochodem, mám asi hodně zvláštní algorytmus :D

 
Nahoru Odpovědět
16.5.2013 22:20
Avatar
Odpovídá na Lukáš Hruda
Martin Bednář (xbedm01):16.5.2013 22:22

mno, pokud je to vážně algorytmus, tak asi zvláštní bude :D

Nahoru Odpovědět
16.5.2013 22:22
I bez motta se dá žít
Avatar
Nahoru Odpovědět
16.5.2013 22:45
I bez motta se dá žít
Avatar
Lukáš Hruda
Tvůrce
Avatar
Lukáš Hruda:17.5.2013 16:23

Tak jsem se dostal na 40 - 50 ms na 10 000 000 čísel. Víc už nevím jak to zrychlit, možná na to jdu úplně špatně, možná mám moc pomalý procesor :D

 
Nahoru Odpovědět
17.5.2013 16:23
Avatar
Nahoru Odpovědět
18.5.2013 2:20
https://www.facebook.com/peasantsandcastles/
Avatar
matesax
Tvůrce
Avatar
matesax:18.5.2013 13:46

JSA -> 2ms
C/C++ -> 8ms
D -> 8ms
C# -> 12ms

 
Nahoru Odpovědět
18.5.2013 13:46
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:18.5.2013 13:48

Co je JSA?

Nahoru Odpovědět
18.5.2013 13:48
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:18.5.2013 13:48

Jazyk Symbolických Adres (Takže strojový kód - po zparsování.)

Editováno 18.5.2013 13:49
 
Nahoru Odpovědět
18.5.2013 13:48
Avatar
Odpovídá na matesax
Libor Šimo (libcosenior):18.5.2013 18:17

Tak to teda čumím. Vážne som zvedavý na algoritmus v C. o_O

Nahoru Odpovědět
18.5.2013 18:17
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Michael Olšavský:18.5.2013 21:09

Ty mé první výsledky byly špatné(36ms, 48ms...). Zjistil jsem, že tam bylo pár chyb a nakonec mi to vycházelo pro 10M okolo 1000ms( dostal jsem se až k 3800ms :D). Ale nyní jsem algoritmus upravil a jsem na 30 ms(s použítím více vláken). :-) Už se těším, až uvidím Matesaxův a Satikův výtvor.

 
Nahoru Odpovědět
18.5.2013 21:09
Avatar
Libor Šimo (libcosenior):19.5.2013 15:26

Už niekto odovzdal svoj výtvor? 8|

Nahoru Odpovědět
19.5.2013 15:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Hartinger:19.5.2013 15:27

Odevzdali jen Satik a Sc077y, brisingr na to zdá se zapomněl a nemůžu se mu dopsat :(

Editováno 19.5.2013 15:28
Nahoru Odpovědět
19.5.2013 15:27
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:19.5.2013 15:36

U Sc077yho mám naměřeno kolem 200ms, u Satika kolem 4(!) ms. Přemýšlím, jak je to vůbec možné :O :D

  1. je tedy Luboš Běhounek Satik a získává placku Machr na C# .NET.
  2. je Sc077y

Oběma chválím práci s vlákny :)

Mrzí mě, že zapomněli odevzdat Matesax a brisingr002 :(

Nahoru Odpovědět
19.5.2013 15:36
New kid back on the block with a R.I.P
Avatar
Martin Bartoš:19.5.2013 15:43

Gratulujem Satikovi a som ohromený...

 
Nahoru Odpovědět
19.5.2013 15:43
Avatar
Luboš Běhounek Satik:19.5.2013 15:50

Heh, nemam tam nakou chybu? :D

Nahoru Odpovědět
19.5.2013 15:50
https://www.facebook.com/peasantsandcastles/
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:19.5.2013 15:53

To musíš vědět ty, ty jsi machr :D Sc077y to jen obyčejně sčítá, takže je to možné. Generuješ těch čísel 100 milionů, to mi tu vycházelo kolem 40ms.

Nahoru Odpovědět
19.5.2013 15:53
New kid back on the block with a R.I.P
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Hruda:19.5.2013 16:01

Já ten kód neviděl, ale přijde mi to nereálné, já to zkoušel v C++ algoritmem kde se v podstatě jen sečtou 2 čísla a u 100 milionů jsem měl cca 450 ms (i když v jednom vlákně), tvůj program to udělal cca za 130 ms. Napadlo mě, jestli třeba pak ten výsledek nikam neukládáš, nebo ten uložený výsledek nikde nepoužiješ, v tomto případě totiž kompilátor běžně ten výpočet v rámci optimalizací úplně přeskočí.

 
Nahoru Odpovědět
19.5.2013 16:01
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Hartinger:19.5.2013 16:06

Zkusím to v debugu.

Nahoru Odpovědět
19.5.2013 16:06
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Hartinger:19.5.2013 16:07

V debugu mám naměřeno kolem 50ms, možná to opravdu přeskakuje.

Nahoru Odpovědět
19.5.2013 16:07
New kid back on the block with a R.I.P
Avatar
Libor Šimo (libcosenior):19.5.2013 16:19

Satik, koľko vlákien si použil?

Nahoru Odpovědět
19.5.2013 16:19
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Hartinger
Lukáš Hruda:19.5.2013 16:41

Nejlépe to poznáš tak, že se podíváš na samotný výpočet a pokud se ta hodnota někam ukládá, tak jí pak mimo měřeny úsek pouze vypíšeš. Je jedno že tam bude uložen pouze součet poslední hodnoty, hned pak poznáš, jestli se ta doba v releasu zvedne nebo ne.

 
Nahoru Odpovědět
19.5.2013 16:41
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Hartinger:19.5.2013 16:46

Je na stovce :D To je fakt zajímavé, že se to takhle optimalizuje.

Nahoru Odpovědět
19.5.2013 16:46
New kid back on the block with a R.I.P
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:19.5.2013 16:49

Hmm, ja to zapoměl odevzdat, celý den jsem měl zato, že je tam deadline 19:00 ...
EDIT: Btw, ja mam v průměru 2,3ms na 107 čísel

Editováno 19.5.2013 16:50
 
Nahoru Odpovědět
19.5.2013 16:49
Avatar
Sc077y
Tvůrce
Avatar
Sc077y:19.5.2013 16:50

Taky gratuluji vítězi. No hold mi to snad vyjde příště. :D

 
Nahoru Odpovědět
19.5.2013 16:50
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jan Vargovský
David Hartinger:19.5.2013 16:50

To je škoda :( Nechceš to pro zajímavost poslat, jaký budeš mít čas?

Nahoru Odpovědět
19.5.2013 16:50
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Hartinger:19.5.2013 16:51

Zjistí si počet procesorů a tolik spustí vláken.

Nahoru Odpovědět
19.5.2013 16:51
New kid back on the block with a R.I.P
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Hartinger
Lukáš Hruda:19.5.2013 16:53

Na stovce u kolika čísel? :D Pokud vím tak VM C# je napsán v C++, takže by měl nejspíš provádět i stejné optimalizace. Mimochodem vyzkoušej prosím tohle, rád bych věděl čas na tvém procesoru.
http://leteckaposta.cz/494582630
Je to nastaveno na 100 milionů čísel, generování trvá dlouho, protože jsem chtěl aby to generovalo čísla na plných 32 bitů. Samotný výpočet začne, když se vypíšou tři tečky :)

 
Nahoru Odpovědět
19.5.2013 16:53
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Luboš Běhounek Satik
David Hartinger:19.5.2013 16:53

Dělalo to, že jsi jen přiřadil do proměnné a pak ji nepoužil, ta instrukce se přeskakovala :D Máš 100ms. BTW jak jsi to pole vláken pojmenoval pool, měl jsem za to, že pool vláken je trochu něco jiného, že se tam kvůli optimalizaci smíchá několik zablokovaných vláken do jednoho a poté zas rozdělí.

Nahoru Odpovědět
19.5.2013 16:53
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Hartinger:19.5.2013 16:54

Já už jsem z toho úplně zblblý. Na stovce s 100M, takže je na desítce. To je furt sakra málo! :D

Nahoru Odpovědět
19.5.2013 16:54
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Lukáš Hruda
David Hartinger:19.5.2013 16:58

290 ms, Satik má kolem stovky pro stejný počet čísel :D

Nahoru Odpovědět
19.5.2013 16:58
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Jan Vargovský
David Hartinger:19.5.2013 16:59

Ten tvůj se mi nějak nedaří zkompilovat :( Přeložený vypíše 5,8 , ale jak psal Luckin, chtělo by to vypsat obsah proměnné result na konci programu.

Nahoru Odpovědět
19.5.2013 16:59
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Michael Olšavský:19.5.2013 17:01

Velmi se omlouvám. Neměl jsem šanci dostat se k pc. :-/ Zdrojáky sem hodím i tak dnes večer nebo zítra. Zajímalo by mě, jak dopadnu u tebe. :-)

 
Nahoru Odpovědět
19.5.2013 17:01
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na David Hartinger
Lukáš Hruda:19.5.2013 17:07

Můžeš zkusit ještě tohle:
http://leteckaposta.cz/150035697
Předtím jsem ty součty zapisoval do pole, teď je tam pouze jedna proměnná pro celkový součet, je to asi o necelou třetinu rychlejší :D
Jinak 100 ms je pořád hodně málo, klobouk dolů, docela by mě zajímal použitý algoritmus :)

 
Nahoru Odpovědět
19.5.2013 17:07
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:19.5.2013 17:07

zkuste toto : http://leteckaposta.cz/992496810
Btw, ja to zkoušel s vlakny a spíše to bylo pomalejší, než rychlejší když jde relativně o tak málo hodnot.

 
Nahoru Odpovědět
19.5.2013 17:07
Avatar
Michael Olšavský:19.5.2013 17:14

Zde je program :-) https://www.dropbox.com/…0Counter.exe
(Generování je hrozně pomalé. To později nějak upravím.) --> počkejte chvíli
A tady zdroják: https://www.dropbox.com/…e/Program.cs

Editováno 19.5.2013 17:15
 
Nahoru Odpovědět
19.5.2013 17:14
Avatar
David Hartinger
Vlastník
Avatar
Nahoru Odpovědět
19.5.2013 17:40
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:19.5.2013 17:43

Zbytek zkusím zítra, dnes již se k tomu nedostanu. brisingrovo vypsalo 75, ale to bude také tou optimalizací.

Nahoru Odpovědět
19.5.2013 17:43
New kid back on the block with a R.I.P
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 129.