Thread View: pl.comp.lang.tcl
8 messages
8 total messages
Started by Derek Kuliński / takeda
Tue, 31 May 2005 08:22
Optymalizacja
Author: Derek Kuliński / takeda
Date: Tue, 31 May 2005 08:22
Date: Tue, 31 May 2005 08:22
48 lines
2474 bytes
2474 bytes
Niech będzie - pierwszy post na temat ;)
Ma ktoś pomysł jak poniższą procedurę zoptymalizować? Działać działa, ale
nie jest to ładne rozwiązanie. Bardzo nie podoba mi się powtarzający się
kod.
| proc combine_modes {dchan add_r rm_r} {
| set maxlen ${::modes-per-line}
| set chan [chandname2name $dchan]
|
| set output [list]
|
| #removing invalid +R
| set modes ""
| set masks [list]
| foreach mask $rm_r {
| if {$modes == ""} {set modes "-"}
| append modes "R"; lappend masks $mask
| if {[llength $masks] >= $maxlen} {
| lappend output "MODE $chan $modes [join $masks]"
| set modes ""; set masks [list]
| }
| }
|
| #adding our own +R
| append modes "+"
| foreach mask $add_r {
| if {$modes == ""} {set modes "+"}
| append modes "R"; lappend masks $mask
| if {[llength $masks] >= $maxlen} {
| lappend output "MODE $chan $modes [join $masks]"
| set modes "" ; set masks [list]
| }
| }
|
| if {[llength $masks] > 0} {
| lappend output "MODE $chan $modes [join $masks]"
| }
|
| return $output
| }
Reszta skryptu znajduje się tutaj:
http://eggwiki.takeda.tk/index.php/Skrypt:r-protect
--
takeda@IRCnet.EFnet, ICQ# 15827691, TLEN: taked4, YahooIM: takeda64
http://eggwiki.takeda.tk - nowa ulepszona strona !!!
Re: Optymalizacja
Author: Googie
Date: Tue, 31 May 2005 09:44
Date: Tue, 31 May 2005 09:44
42 lines
2171 bytes
2171 bytes
Użytkownik "Derek Kuliński / takeda" <d.kulinski@gmail.com> napisał:
> Ma ktoś pomysł jak poniższą procedurę zoptymalizować? Działać działa, ale
> nie jest to ładne rozwiązanie. Bardzo nie podoba mi się powtarzający się
> kod.
Mnie się udało sprowadzić to do takiej postaci: (nie testowałem czy działa -
nie mam na stanie żadnych botów).
Generalnie "optymalizacja" sprowadza się do krótszego zapisu powtarzającego
się kodu (a więc to co Ci się nie podobało :) ). Oprócz tego wyrzuciłem z
pętli sprawdzanie 'if {$modes == ""} {.......}', bo i tak można ustawiać "+"
lub "-" na wstępie oraz przy "resetowaniu" wartości modes.
proc combine_modes {dchan add_r rm_r} {
set maxlen ${::modes-per-line}
set chan [chandname2name $dchan]
set output [list]
set masks [list]
#removing invalid +R
foreach {varName sig} {
rm_r "-"
add_r "+"
} {
set modes $sig
foreach mask [set $varName] {
append modes "R"; lappend masks $mask
if {[llength $masks] >= $maxlen} {
lappend output "MODE $chan $modes [join $masks]"
set modes $sig; set masks [list]
}
}
}
if {[llength $masks] > 0} {
lappend output "MODE $chan $modes [join $masks]"
}
return $output
}
Re: Optymalizacja
Author: Derek Kuliński / takeda
Date: Tue, 31 May 2005 17:53
Date: Tue, 31 May 2005 17:53
48 lines
2907 bytes
2907 bytes
On Tue, 31 May 2005 11:44:21 +0200, Googie wrote:
> Mnie się udało sprowadzić to do takiej postaci: (nie testowałem czy działa -
> nie mam na stanie żadnych botów).
> Generalnie "optymalizacja" sprowadza się do krótszego zapisu powtarzającego
> się kodu (a więc to co Ci się nie podobało :) ). Oprócz tego wyrzuciłem z
> pętli sprawdzanie 'if {$modes == ""} {.......}', bo i tak można ustawiać "+"
> lub "-" na wstępie oraz przy "resetowaniu" wartości modes.
>
> proc combine_modes {dchan add_r rm_r} {
> set maxlen ${::modes-per-line}
> set chan [chandname2name $dchan]
>
> set output [list]
> set masks [list]
>
> #removing invalid +R
>
> foreach {varName sig} {
> rm_r "-"
> add_r "+"
> } {
> set modes $sig
> foreach mask [set $varName] {
> append modes "R"; lappend masks $mask
> if {[llength $masks] >= $maxlen} {
> lappend output "MODE $chan $modes [join $masks]"
> set modes $sig; set masks [list]
> }
> }
> }
>
> if {[llength $masks] > 0} {
> lappend output "MODE $chan $modes [join $masks]"
> }
>
> return $output
> }
No nieźle, namieszałeś tak, że teraz nawet nie rozumiem jak to działa.
Rozumiem, że to wyższy stopień wtajemniczenia? ;) Jesteś pewien, że na
czystym Tcl będzie to działać? Ja sprawdzę ten kod przy pierwszej okazji,
ale nie przypuszczałem, że da się aż tak uprościć, widać pozostaje mi
jeszcze sporo do nauczenia się =)
--
takeda@IRCnet.EFnet, ICQ# 15827691, TLEN: taked4, YahooIM: takeda64
http://eggwiki.takeda.tk - nowa ulepszona strona !!!
Re: Optymalizacja
Author: Neas
Date: Tue, 31 May 2005 20:02
Date: Tue, 31 May 2005 20:02
15 lines
1504 bytes
1504 bytes
Googie pisze: > W ten sposób można skracać powtarzający się kod w wielu przypadkach (aż > sam się dziwię, w jak wielu... :) ), bo definiujesz sobie tylko dla > [foreach] listę zmieniających się "łańcuchów/słów" w kodzie, a sam kod > piszesz w ciele [foreach], wstawiając zmienne z [foreach] zamiast tych > słów. Mam nadzieję że nie zamotałem za bardzo. Daje to coś konkretnego jeśli chodzi o szybkość wykonywania tak napisanego programu? Bo sam kod można wizualnie upraszczać w nieskończoność, tylko po co... -- Neas, ?eas@?eas.pl, http://www.neas.pl Nie widzisz polskich znaków? Zajrzyj na http://strony.biz/h/utf-8
Re: Optymalizacja
Author: Googie
Date: Tue, 31 May 2005 20:31
Date: Tue, 31 May 2005 20:31
54 lines
2678 bytes
2678 bytes
Derek Kuliński / takeda wrote:
> Jesteś
> pewien, że na czystym Tcl będzie to działać?
Tak. Zgodność z Tcl została zachowana. Jedyne co może niedziałać to
jakiś błąd merytoryczny - tak jak wspomniałem - nie miałem gdzie tego
przetestować, więc może być jakiś błąd, ale myślę że sobie poradzisz.
> nie przypuszczałem, że da się aż tak uprościć,
> widać pozostaje mi jeszcze sporo do nauczenia się =)
To taki (dość znany już na clt) trick :)
Komendy [foreach] tutaj odegrała kluczową rolę.
Oto prostszy przykład obrazujący zastosowane rozwiązanie:
#-----------
set tablica(a) 0
set tablice(b) 1
set tablica(c) 3
set zmienna_1 10
set zmienna_2 11
set zmienna_3 12
set lista [list to jest lista]
foreach {idx nazwa_zmiennej poz} {
a zmienna_1 1
b zmienna_2 0
c zmienna_3 2
} {
puts "-> $tablica($idx), [set $nazwa_zmiennej], [lindex $lista $poz]"
}
#-----------
Przy czym samo [foreach] można za zapisać tak na prawdę tak jak poniżej
i będzie to zapis równoznaczny, ale mniej czytelny, choć może będzie
dla Ciebie bardziej znajomy:
#-----------
foreach {idx nazwa_zmiennej poz} {a zmienna_1 1 b zmienna_2 0 c
zmienna_3 2} {
puts "-> $tablica($idx), [set $nazwa_zmiennej], [lindex $lista $poz]"
}
#-----------
W ten sposób można skracać powtarzający się kod w wielu przypadkach (aż
sam się dziwię, w jak wielu... :) ), bo definiujesz sobie tylko dla
[foreach] listę zmieniających się "łańcuchów/słów" w kodzie, a sam kod
piszesz w ciele [foreach], wstawiając zmienne z [foreach] zamiast tych
słów. Mam nadzieję że nie zamotałem za bardzo.
--
Pozdrawiam (Greetings)!
Googie
Re: Optymalizacja
Author: Googie
Date: Tue, 31 May 2005 23:01
Date: Tue, 31 May 2005 23:01
18 lines
1400 bytes
1400 bytes
Neas wrote: > Daje to coś konkretnego jeśli chodzi o szybkość wykonywania tak > napisanego programu? Nie. > Bo sam kod można wizualnie upraszczać w > nieskończoność, tylko po co... No żeby był krótszy :) Co do prędkości to zoptymalizowałem tylko odwołania do zmiennej modes - było ich niepotrzebnie tak dużo - zwłaszcza że było to w pętli. -- Pozdrawiam (Greetings)! Googie
Re: Optymalizacja
Author: Derek Kuliński / takeda
Date: Thu, 02 Jun 2005 02:57
Date: Thu, 02 Jun 2005 02:57
22 lines
2264 bytes
2264 bytes
On Tue, 31 May 2005 22:02:57 +0200, Neas wrote:
> Daje to coś konkretnego jeśli chodzi o szybkość wykonywania tak napisanego
> programu?
W tym wypadku (jak Googie napisał), nie ma żadnej korzyści jeżeli chodzi o
prędkość, korzyścią jest raczej czytelność i mniejsza szansa na bugi (czym
kod krótszy tym mniej bugów można w nim zrobić =) Bugi też rzucają się
bardziej w oczy, jeden drobny bug, powoduje większe przekłamania, co wbrew
pozorom jest zaletą, bo prościej znaleźć sytuację gdzie taki bug wystąpi.
> Bo sam kod można wizualnie upraszczać w nieskończoność, tylko po co...
W nieskończoność? B. chciałbym jak by ten program można było uprościć do:
proc a {b c} {
}
=)
--
takeda@IRCnet.EFnet, ICQ# 15827691, TLEN: taked4, YahooIM: takeda64
http://eggwiki.takeda.tk - nowa ulepszona strona !!!
Re: Optymalizacja
Author: Derek Kuliński / takeda
Date: Thu, 02 Jun 2005 02:57
Date: Thu, 02 Jun 2005 02:57
66 lines
3758 bytes
3758 bytes
On Tue, 31 May 2005 11:44:21 +0200, Googie wrote:
> Użytkownik "Derek Kuliński / takeda" <d.kulinski@gmail.com> napisał:
>
>> Ma ktoś pomysł jak poniższą procedurę zoptymalizować? Działać działa, ale
>> nie jest to ładne rozwiązanie. Bardzo nie podoba mi się powtarzający się
>> kod.
>
> Mnie się udało sprowadzić to do takiej postaci: (nie testowałem czy działa -
> nie mam na stanie żadnych botów).
> Generalnie "optymalizacja" sprowadza się do krótszego zapisu powtarzającego
> się kodu (a więc to co Ci się nie podobało :) ). Oprócz tego wyrzuciłem z
> pętli sprawdzanie 'if {$modes == ""} {.......}', bo i tak można ustawiać "+"
> lub "-" na wstępie oraz przy "resetowaniu" wartości modes.
[ ... cut ... ]
Heh, zawsze jest jakiś bug jak się kodu nie sprawdzi: :P
| [18:33:25] <takeda> .tcl ::r_protect::combine_modes #z [list 1 2 3 4] [list 5 6 7 8]
| [18:33:25] <testbot> Tcl: {MODE #z -RRR 5 6 7} {MODE #z +RR 8 1 2} {MODE #z +RR 3 4}
| [18:33:32] <takeda> .tcl ::r_protect::old_combine_modes #z [list 1 2 3 4] [list 5 6 7 8]
| [18:33:32] <testbot> Tcl: {MODE #z -RRR 5 6 7} {MODE #z -R+RR 8 1 2} {MODE #z +RR 3 4}
Poprawiłem, kod jest trochę nmniej zgrabny niż Twój, ale na pewno lepszy
niż oryginalny.
| proc combine_modes {add_r rm_r} {
| set maxlen ${::modes-per-line}
|
| set output [list]
| set masks [list]
| set modes ""
| foreach {var sig} [list rm_r "-" add_r "+"] {
| if {![llength [set $var]]} {continue}
| append modes $sig
| foreach mask [set $var] {
| if {$modes == ""} {set modes $sig}
| append modes "R" ; lappend masks $mask
| if {[llength $masks] >= $maxlen} {
| lappend output "$modes [join $masks]"
| set modes "" ; set masks [list]
| }
| }
| }
|
| if {[llength $masks] > 0} {
| lappend output "$modes [join $masks]"
| }
|
| return $output
| }
To llength jest do sytuacji, kiedy któraś z list jest pusta (właściwie
częsty przypadek w tym skrypcie)
Z kolei set zamienione na append i if {$modes == ""} {set modes $sig} jest
po to aby wyeliminować problem który pokazałem powyżej.
BTW: Tego triku z foreach nie zajarzyłem, bo zapisałeś listę w trochę
dziwny (dla mnie) sposób =)
Ja staram się go unikać, bo to jest częsty powód problemów ze znakami
takimi jak {}[]\ itp.
--
takeda@IRCnet.EFnet, ICQ# 15827691, TLEN: taked4, YahooIM: takeda64
http://eggwiki.takeda.tk - nowa ulepszona strona !!!
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads