-
1. Data: 2009-09-01 15:31:41
Temat: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: gupi man'a'go <2...@i...sk>
int condition;
for( iterator_1 )
for( iterator_2 )
{ proc_1();
if( condition )
proc_2();
proc_3();
}
przed rozpoczęciem pętli, które nie są upraszczalne, znam wartość "condition", lecz
wartość ta może ulegać zmianie podczas wykonywania innych części programu.
tutaj program musiałby w każdym wykonaniu się pętli sprawdzać wartość "condition".
czy jedynym rozwiązaniem jest duplikacja z i bez wołania "proc_2"? czyli:
// 1:
int condition;
for( iterator_1 )
for( iterator_2 )
{ proc_1();
proc_3();
}
// 2:
int condition;
for( iterator_1 )
for( iterator_2 )
{ proc_1();
proc_2();
proc_3();
}
zamist pętli możemy umieścić dowolne bardzo zagłębione struktury wykonawcze, które
nie są upraszczalne z dowolnego względu.
--
-oh yea, i got it!
-oh, stupid!
D. Icke
-
2. Data: 2009-09-01 15:34:02
Temat: Re: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: gupi man'a'go <2...@i...sk>
jak zapisać następujacy program tak, by ładny zapis składniowy nie kosztował
nieoptymalnie długiego czasu wykonywania?
int condition;
for( iterator_1 )
for( iterator_2 )
{ proc_1();
if( condition )
proc_2();
proc_3();
}
przed rozpoczęciem pętli, które nie są upraszczalne, znam wartość "condition", lecz
wartość ta może ulegać zmianie podczas wykonywania innych części programu.
tutaj program musiałby w każdym wykonaniu się pętli sprawdzać wartość "condition".
czy jedynym rozwiązaniem jest duplikacja z i bez wołania "proc_2"? czyli:
// 1:
int condition;
for( iterator_1 )
for( iterator_2 )
{ proc_1();
proc_3();
}
// 2:
int condition;
for( iterator_1 )
for( iterator_2 )
{ proc_1();
proc_2();
proc_3();
}
zamist pętli możemy umieścić dowolne bardzo zagłębione struktury wykonawcze, które
nie są upraszczalne z dowolnego względu.
-
3. Data: 2009-09-01 16:30:33
Temat: Re: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: Daniel Janus <n...@k...pl>
Dnia 01.09.2009 gupi man'a'go <2...@i...sk> napisał/a:
> przed rozpoczęciem pętli, które nie są upraszczalne, znam wartość
> "condition", lecz wartość ta może ulegać zmianie podczas wykonywania
> innych części programu. tutaj program musiałby w każdym wykonaniu się
> pętli sprawdzać wartość "condition". czy jedynym rozwiązaniem jest
> duplikacja z i bez wołania "proc_2"?
Nie napisałeś, o jaki język chodzi; ale zakładam, że C albo C++.
Porządny kompilator powinien być w stanie wyoptymalizować wersję ze
sprawdzaniem warunku w środku do jednego z tych dwóch wariantów, które
podałeś; na przykład GCC 4.3.3 u mnie to robi uruchomiony z opcją -O3
(ale już nie -O2).
The First Rule of Program Optimization: Don't do it.
The Second Rule of Program Optimization (for experts only!):
Don't do it yet.
-- Michael A. Jackson
--
Daniel 'Nathell' Janus, m...@n...korpus.pl, http://danieljanus.pl
create_initial_thread(initial_function);
lose("CATS. CATS ARE NICE.\n");
-- Steel Bank Common Lisp, sbcl/runtime/runtime.c:425
-
4. Data: 2009-09-02 00:04:19
Temat: Re: jak optymalizowa� ze wzgl�du na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: "Mariusz Marsza�kowski" <b...@g...SKASUJ-TO.pl>
> zamist pÄtli moĹźemy umieĹciÄ dowolne bardzo zagĹÄbione struktury wykonawc
> ze, ktĂłre nie sÄ upraszczalne z dowolnego wzglÄdu.
Polecam nie zaprzatac sobie tym glowy, kod napisz prosto, zwiezle i czytelnie,
a skup sie na opracowaniu lepszego algorytmu.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
5. Data: 2009-09-03 14:56:14
Temat: Re: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: gupi man'a'go <2...@i...sk>
"Daniel Janus" zaprogramował/a:
>> przed rozpoczęciem pętli, które nie są upraszczalne, znam wartość
>> "condition", lecz wartość ta może ulegać zmianie podczas wykonywania
>> innych części programu. tutaj program musiałby w każdym wykonaniu się
>> pętli sprawdzać wartość "condition". czy jedynym rozwiązaniem jest
>> duplikacja z i bez wołania "proc_2"?
> Nie napisałeś, o jaki język chodzi; ale zakładam, że C albo C++.
> Porządny kompilator powinien być w stanie wyoptymalizować wersję ze
> sprawdzaniem warunku w środku do jednego z tych dwóch wariantów, które
> podałeś; na przykład GCC 4.3.3 u mnie to robi uruchomiony z opcją -O3
> (ale już nie -O2).
>
> The First Rule of Program Optimization: Don't do it. The Second Rule
> of Program Optimization (for experts only!):
> Don't do it yet.
>
> -- Michael A. Jackson
trochę żartem ;-) :
jeśli ten kompilator byłby ,porządny', to nie robiłby nic za plecami
programisty. :-)
tak, rzeczywiście język "C" --jak łatwo się domyślić. ale istotne
są raczej konstrukcje składniowe, które umożliwiają wyjście z takiego
problemu zagłębionego wykonywania. język "C" nie jest językiem funkcy-
jnym, zawiera instrukcje nieprzewidywalne, więc po co kompilator ma się
męczyć, gdy nie wiadomo co się otrzyma.
--
/ qo |) :@=N%_g=v=a=g_eD_e=c()=d=8! =%!gN@8'Re. w8in/ad
\ _x/ , ;h-%-a'hA'H4,X0'Xo~xo~xO,R`-%EXp01ITed: *-7/+eh
/ | ng `-%__%--'__%--'__%--~__%--^%B`/$qV3r[o; &GooMee
L_._o_O_*_^_"_'_`_ -> http://thereis.notlong.com <- `L"EnOF"
-
6. Data: 2009-09-03 20:33:38
Temat: Re: jak optymalizowa� ze wzgl�du na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: "Mariusz Marsza�kowski" <b...@g...SKASUJ-TO.pl>
gupi man'a'go <2...@i...sk> napisaďż˝(a):
> jnym, zawiera instrukcje nieprzewidywalne, wiÄc po co kompilator ma siÄ
> mÄczyÄ, gdy nie wiadomo co siÄ otrzyma.
Raz wiadomo, drugi raz nie wiadomo. Kompilator "mÄczy" siÄ tam, gdzie
wiadomo co siÄ otrzyma, albo tam gdzie wiadomo z pewnym prawdopodobieĹstwem.
Pozdrawiam
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
7. Data: 2009-09-07 09:13:55
Temat: Re: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: "Filip Sielimowicz" <s...@t...tez.wp.pl>
Użytkownik "gupi man'a'go" <2...@i...sk> napisał w wiadomości
news:h7jet7$1n93$2@news.ett.com.ua...
> jak zapisać następujacy program tak, by ładny zapis składniowy nie
> kosztował nieoptymalnie długiego czasu wykonywania?
A jakiego rzędu wielkości jest ta 'nieoptymalność' ? Walka o tego if'a z
warunkeim na prostej zmiennej
typu bool jest imho bez sensu, jeśli, jak mówisz, otacza on 'dowolne bardzo
zagłebione struktury wykonawcze'.
Ja bym się bardziej skupił na tym, by kod był przejrzysty i jak najmniej
redundancji.
A jeśli akurat zagłębiona pętla jest wyjątkowo 'ciasna' i walczymy o każy
takt
(znaczy się bardzo często wykonywana i prosta - proc_1 i proc_3 są bardzo
proste a iterator _2 bardzo liczny),
to rozważyłbym ewentualnie wyłączenie tego warunku 'pętlę wyżej', czyli:
Być może warto wtedy dodatkowo rozważyć zamiany iteratorów, jeśli iterator_1
jest liczniejszy niż iterator_2
(i zamiana jest możliwa)
int condition;
for( iterator_1 )
if( condition )
for( iterator_2 ) {
proc_1();
proc_2();
proc_3();
} else
for( iterator_2 ) {
proc_1();
proc_3();
}
Jest to jakiś kompromis między redundancją całości a nieoptymalnością.
Ale jeszcze raz: jeśli umieszczenie ifa wewnątrz ciasnej pętli powoduje
spadek wydajnosci rzędu 1-5% to IMHO rozważanie tej kwesti
nie ma uzasadnienia praktycznego. A z tego co piszesz o 'złożoności
struktur',
to będzie to jeszcze mniej.
No i jak ktoś wspomniał - kompilator i tak
sam często będzie potrafił 'wyprowadzić' zależną od lokalnej 'stałej'
(zmiennej
nie zmieniającej się) na zewnątrz pętli.
Prawdę mówiąc myślałem, że chodzi Ci o problem, gdzie condition nie jest
zmienną
ale funkcją, której wynik może sięzmienić albo zmienną współdzieloną przy
dostępie wielowątkowym. Ale widzę, że tu sprawa jest maksymalnie prosta.
Ty nie masz większych problemów programistycznych ? :)
-
8. Data: 2009-09-07 19:46:22
Temat: Re: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: gupi man'a'go <2...@i...sk>
"Filip Sielimowicz" zaprogramował/a:
>> jak zapisać następujacy program tak, by ładny zapis składniowy nie
>> kosztował nieoptymalnie długiego czasu wykonywania?
>
> A jakiego rzędu wielkości jest ta 'nieoptymalność' ? Walka o tego if'a z
> warunkeim na prostej zmiennej
> typu bool jest imho bez sensu, jeśli, jak mówisz, otacza on 'dowolne
> bardzo zagłebione struktury wykonawcze'.
> Ja bym się bardziej skupił na tym, by kod był przejrzysty i jak najmniej
> redundancji.
> A jeśli akurat zagłębiona pętla jest wyjątkowo 'ciasna' i walczymy o
> każy takt
> (znaczy się bardzo często wykonywana i prosta - proc_1 i proc_3 są
> bardzo proste a iterator _2 bardzo liczny),
> to rozważyłbym ewentualnie wyłączenie tego warunku 'pętlę wyżej', czyli:
> Być może warto wtedy dodatkowo rozważyć zamiany iteratorów, jeśli
> iterator_1 jest liczniejszy niż iterator_2
> (i zamiana jest możliwa)
>
> int condition;
> for( iterator_1 )
> if( condition )
> for( iterator_2 ) {
> proc_1();
> proc_2();
> proc_3();
> } else
> for( iterator_2 ) {
> proc_1();
> proc_3();
> }
>
> Jest to jakiś kompromis między redundancją całości a nieoptymalnością.
> Ale jeszcze raz: jeśli umieszczenie ifa wewnątrz ciasnej pętli powoduje
> spadek wydajnosci rzędu 1-5% to IMHO rozważanie tej kwesti nie ma
> uzasadnienia praktycznego. A z tego co piszesz o 'złożoności struktur',
> to będzie to jeszcze mniej.
> No i jak ktoś wspomniał - kompilator i tak sam często będzie potrafił
> 'wyprowadzić' zależną od lokalnej 'stałej' (zmiennej
> nie zmieniającej się) na zewnątrz pętli.
>
> Prawdę mówiąc myślałem, że chodzi Ci o problem, gdzie condition nie jest
> zmienną
> ale funkcją, której wynik może sięzmienić albo zmienną współdzieloną
> przy dostępie wielowątkowym. Ale widzę, że tu sprawa jest maksymalnie
> prosta. Ty nie masz większych problemów programistycznych ? :)
oczywiście. oczywiście.
rolą kompilatora jest optymalizowanie, gdy coś jest równoważne obli-
czeniowo. i tego nie mam zamiaru zastępować. jeśli patrzeć z tego
punktu widzenia, to raczej zastanawiałbym się, jak kompilator mógłby
to optymalizować. i patrząc z tego puntku widzenia, nad tym się właś-
nie zastanawiam się.
natomiast to w powyższym akapicie jest drugim spojrzeniem, a pier-
wsze to: jak zrobić te iteratory, a właściwie to nie iteratory,
lecz bloki pętlujące (bo mają np. w takim "C" wiele różnych słów kluczo-
wych).
a teraz kilka skojarzeń:
był taki list na tej grupie lub może "p.c.l.c", gdzie ktoś pytał
o to, jak zrobić instrukcję procesora, która optymalizowałaby nieurucha-
mianie procedur, które nic nie zawierają (tylko instrukcję powrotu).
jak widać w powyższych przykładach-- jeśli byłaby instrukcja procesora,
która zamiast najpierw usiłować wykonać, a później wywoływać wyjątek
błędnego dostępu do pamięci, jeśli byłaby instrukcja procesora przeska-
kująca praktycznie żadnym kosztem pustą (co ja rozumiem przez ,,pustą"?
nie wiem co rozumiem, na razie nic) w miejscu wywołania procedurę,
to nie potrzebaby żadnego "condition" wewnątrz pętli iteratorów, prawda?
:-) tylko na zewnątrz pętli bez powielania kodu jakieś zmiany bloku,
zmiennych, rekonfiguracja, cokolwiek.
albo następne: dlaczego w "C++" coś na zewnątrz (biblioteka stan-
dardowa przez swoje makropolecenia ukrywające treść kodu wstawianego
do programu podczas kompilacji) ma mi trzymać kolejność elementów itera-
tora? dlaczego? nie ma trzymać, bo to jest nieuzasadnione wymusze-
nie, które przy większych kolekcjach, po których się iteruje, zmusza
do alokowania zasobów dla algorytmu tylko z powodu składni.
koniec podanych skojarzeń.
więc bloki pętlujące, nie tylko iteratory. nie wiem, kiedy zmienia
się "condition", lecz dlaczego mam go sprawdzać przy każdym przebiegu
bloku pętlujacego, jeśli wiem jednak więcej niż to, że jakieś wątki się
przełączą. tzn. mogę wiedzieć więcej, ale jeszcze nie wiem co wiedzieć
i jak to wpisać w składnię. zresztą pojęcie składni jest płynne,
szczególnie na tej grupie.
--
/ qo |) :@=N%_g=v=a=g_eD_e=c()=d=8! =%!gN@8'Re. w8in/ad
\ _x/ , ;h-%-a'hA'H4,X0'Xo~xo~xO,R`-%EXp01ITed: *-7/+eh
/ | ng `-%__%--'__%--'__%--~__%--^%B`/$qV3r[o; &GooMee
L_._o_O_*_^_"_'_`_ -> http://thereis.notlong.com <- `L"EnOF"
-
9. Data: 2009-09-08 08:00:56
Temat: Re: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: "Filip Sielimowicz" <s...@t...tez.wp.pl>
Użytkownik "gupi man'a'go" <2...@i...sk> napisał w wiadomości
news:h83nu3$2kvj$1@news.ett.com.ua...
Obawiam się, że nie za bardzo da się z Tobą dyskutować, czy jakoś
odpowiedzieć
na Twoje pytania(?). Musiałbyś się wpierw mocno skupić.
Za dużo piszesz i za dużo tematów poruszasz jednocześnie.
Właściwie to nie wiadomo, o co Ci chodzi. Szanuj czas innych ludzi - a sam
też na tym zyskasz.
Proponuję na początek proste ćwiczenie: zadawaj jedno pytanie w jednym
poście
i nie pisz z czym Ci się to kojarzy. Twoje skojarzenia chyba nic tu nie
wnoszą
a tylko gmatwają. No chyba, że o to Ci chodzi - żeby pogadać sam ze sobą.
To mam Cię wrzucić do KF'u ? Jakbyś mi radził ? (jednym krótkim zdaniem
poproszę)
-
10. Data: 2009-09-08 09:02:59
Temat: Re: jak optymalizować ze względu na znany warunek w wielokrotnie powtarzanym bloku? [2]
Od: "Stachu 'Dozzie' K." <d...@d...im.pwr.wroc.pl.nospam>
On 08.09.2009, Filip Sielimowicz wrote:
>
> Użytkownik "gupi man'a'go" <2...@i...sk> napisał w wiadomości
> news:h83nu3$2kvj$1@news.ett.com.ua...
>
> Obawiam się, że nie za bardzo da się z Tobą dyskutować, czy jakoś
> odpowiedzieć
> na Twoje pytania(?). Musiałbyś się wpierw mocno skupić.
> Za dużo piszesz i za dużo tematów poruszasz jednocześnie.
> Właściwie to nie wiadomo, o co Ci chodzi. Szanuj czas innych ludzi - a sam
> też na tym zyskasz.
Szanuj swój czas i używaj killfile.
> Proponuję na początek proste ćwiczenie: zadawaj jedno pytanie w jednym
> poście
> i nie pisz z czym Ci się to kojarzy. Twoje skojarzenia chyba nic tu nie
> wnoszą
> a tylko gmatwają. No chyba, że o to Ci chodzi - żeby pogadać sam ze sobą.
> To mam Cię wrzucić do KF'u ? Jakbyś mi radził ? (jednym krótkim zdaniem
> poproszę)
>
--
Stanislaw Klekot