Knihovna pro stromy v C
Jan Kasprzak
kas na fi.muni.cz
Úterý Září 11 21:39:57 CEST 2007
Dalibor Straka wrote:
: > Uz nemam, ale neco jako
: >
: > for (i=0; i < (1<<24); i++) {
: > if (skore[i] > neco ...) {
: > printf("%d,%d...\n", i, skore[i],...);
: > }
: > }
: >
: > Dal jsem to pro jistotu do samostatne funkce, a ta i presto
: > ze v testovacim behu mela je nekolik malo desitek volani, tak sumarni cas
: > mela daleko nejvetsi z celeho programu.
: Aha, ja myslel, ze pomale je ukladani do pole.
To samozrejme ne.
: Tady evidentne zdrzuje
: hlavne printf() :-).
Nikoliv, to by se ukazalo v profileru (pri linkovani s profilovaci
libc). Navic printf() tam bude tak jako tak. Pomale je skutecne sekvencni
prochazeni 1<<24 radku.
: Porad tvrdohlave tvrdim, ze
:
: buf = calloc(2^24 * sizeof (int));
: zdroj = nejaky_blok_integeru //cist read() po jednom je moc volani
: while (zdroj_size--)
: (int *) (buf + *zdroj++)++;
Toto je ovsem zapis do pole (shromazdovani dat), ne vypis vysledku.
Zapis mam samozrejme takhle nejak a je to rychle. Je ale otazka, jestli
jinou vhodnou strukturou nejde zapis+vypis nejak zrychlit (nejspis tedy
za cenu castecneho zpomaleni zapisu vyrazne zrychlit vypis).
Jeste k jinym ideam z tohoto vlakna:
zkusil jsem to prepsat na jednosmerne linkovany seznam
a je to cca 5x pomalejsi. Problem je nejspis v tom, ze velikost usporadanych
podposloupnosti na vstupu je porad radove stejna, zatimco velikost dosud
objevenych ruznych klicu na vstupu roste, takze prochazeni seznamu je cim dal
mene uspesne.
-Y.
--
| Jan "Yenya" Kasprzak <kas at {fi.muni.cz - work | yenya.net - private}> |
| GPG: ID 1024/D3498839 Fingerprint 0D99A7FB206605D7 8B35FCDE05B18A5E |
| http://www.fi.muni.cz/~kas/ Journal: http://www.fi.muni.cz/~kas/blog/ |
** Those who fail to understand communication protocols, **
** are doomed to repeat them over port 80. -- from /. **
Další informace o konferenci Linux