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.

Tvůrce

Zobrazeno 50 zpráv z 129.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Do pekla. Nakoniec to nie je pravda, po viacerých testoch mi vyšlo to tvoje rýchlejšie.
Take jsem to zkousel, vyslo mi oboji stejne rychle, jeste bych se mohl podivat, jestli to kompilator nezkompiluje na stejny kod.
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;
}
Zkousel jsi to v release modu?
Je to čisté céčko a neviem čo je release mód. Som absolútny samouk.
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.
OK, používam Code:Blocks, dúfam, že to niekde nájdem.
v code::blocks je to hned vedle build and run "build target" je tam přímo
takovej list kde je buď release nebo debug
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ší.
Tak jsem to zkusil v C++ a dostal jsem se zatím na 10 ms u 1 000 000 čísel.
Mimochodem, mám asi hodně zvláštní algorytmus
mno, pokud je to vážně algorytmus, tak asi zvláštní
bude
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
Jazyk Symbolických Adres (Takže strojový kód - po zparsování.)
Tak to teda čumím. Vážne som zvedavý na algoritmus v C.
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 ). 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.
Už niekto odovzdal svoj výtvor?
Odevzdali jen Satik a Sc077y, brisingr na to zdá se zapomněl a nemůžu se
mu dopsat
U Sc077yho mám naměřeno kolem 200ms, u Satika kolem 4(!) ms.
Přemýšlím, jak je to vůbec možné
Oběma chválím práci s vlákny
Mrzí mě, že zapomněli odevzdat Matesax a brisingr002
Gratulujem Satikovi a som ohromený...
Heh, nemam tam nakou chybu?
To musíš vědět ty, ty jsi machr 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.
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čí.
V debugu mám naměřeno kolem 50ms, možná to opravdu přeskakuje.
Satik, koľko vlákien si použil?
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.
Je na stovce To je fakt
zajímavé, že se to takhle optimalizuje.
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
To je škoda Nechceš to pro
zajímavost poslat, jaký budeš mít čas?
Zjistí si počet procesorů a tolik spustí vláken.
Na stovce u kolika čísel? 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
Dělalo to, že jsi jen přiřadil do proměnné a pak ji nepoužil, ta
instrukce se přeskakovala
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í.
Já už jsem z toho úplně zblblý. Na stovce s 100M, takže je na desítce.
To je furt sakra málo!
290 ms, Satik má kolem stovky pro stejný počet čísel
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.
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.
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ší
Jinak 100 ms je pořád hodně málo, klobouk dolů, docela by mě zajímal
použitý algoritmus
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.
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
Zbytek zkusím zítra, dnes již se k tomu nedostanu. brisingrovo vypsalo 75, ale to bude také tou optimalizací.
Zobrazeno 50 zpráv z 129.