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.
Zobrazeno 50 zpráv z 129.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
