🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.tcl
13 messages
13 total messages Started by Derek Kuliński / takeda Tue, 27 Dec 2005 22:07
Optymalizacja skryptu
#235
Author: Derek Kuliński / takeda
Date: Tue, 27 Dec 2005 22:07
35 lines
2733 bytes
Jako, że znajdują się tutaj osoby znające się b. dobrze na Tcl, a brakuje
osób z pytaniami, wydaje mi się, że nikt nie wkurzy się na mnie jak
poproszę
o pomysły jak zoptymalizować skrypt. Ostatnim razem, uwagi były b.
pomocne... Dodatkowo dowiedziałem się, o możliwościach pętli foreach
których wtedy nie znałem :)

Jako, że skrypt jest odrobinę długi, zamiast wklejać go tutaj, lepiej
chyba jak podeślę link:
http://ircwiki.takeda.tk/index.php/Skrypt:new_year_counter
(składnia jest też pokolorowana więc pewnie będzie czytelniejszy).

Skrypt działa następująco:
- Raz na dzień (o północy) wysyła informacje ile zostało jeszcze godzin,
minut i sekund do Nowego Roku.
- gdy dojdzie do 20 godzin, zaczyna podawać te informacje co 30 minut.
- gdy dojdzie do 30 minut, podaje co 15 min
- 15 min; podaje co 5 min
- 5 min; podaje co 1 min
- 1 min; 30 sek
- 30 sek; 15 sek
- 15 sek; 5 sek
- 5 sek; co sekundę
- 0 sek, kończy działanie informując, że jest już Nowy Rok.

Najbardziej nie podoba mi się procedura calculate_timer_value, ale jeżeli
ktoś ma pomysły jak poprawić inne części to też będzie to mile widziane =)

Przy okazji chciałbym życzyć Wam wszystkiego najlepszego z okazji
zbliżającego się Nowego Roku :)

-- 
ダレック
takeda@IRCnet.EFnet, ICQ# 15827691, YahooIM: takeda64
http://ircwiki.takeda.tk - strona wiki poświęcona IRC
Re: Optymalizacja skryptu
#236
Author: Googie
Date: Wed, 28 Dec 2005 08:42
34 lines
1532 bytes
Derek Kuliński / takeda wrote:
> Najbardziej nie podoba mi się procedura calculate_timer_value, ale jeżeli
> ktoś ma pomysły jak poprawić inne części to też będzie to mile widziane =)

Może tak:

proc calculate_timer_value {time_left} {
	foreach {v1 v2} {
		86400 86400
		72000 14400
		1800 1800
		900 900
		300 300
		60 60
		30 30
		15 15
		5 5
		0 1
	} {
		if {$time_left > $v1} {
			return $v2
		}
	}
	return 0
}

> Przy okazji chciałbym życzyć Wam wszystkiego najlepszego z okazji
> zbliżającego się Nowego Roku :)

A dziękuję, dziękuję, wzajemnie :)

-- 
Pozdrawiam!
Googie
Re: Optymalizacja skryptu
#237
Author: Derek Kuliński / takeda
Date: Wed, 28 Dec 2005 21:05
34 lines
1801 bytes
On Wed, 28 Dec 2005 09:42:45 +0100, Googie wrote:

> proc calculate_timer_value {time_left} {
> 	foreach {v1 v2} {
> 		86400 86400
> 		72000 14400
> 		1800 1800
> 		900 900
> 		300 300
> 		60 60
> 		30 30
> 		15 15
> 		5 5
> 		0 1
> 	} {
> 		if {$time_left > $v1} {
> 			return $v2
> 		}
> 	}
> 	return 0
> }

No wygląda to duuużo lepiej (i znowu to foreach =)))
Niemniej musiałem zmienić to:
| 			return $v2
na:
|			return [adjust_timer $time_left $v2]

Inaczej nie przechodziło testów :)

-- 
ダレック
takeda@IRCnet.EFnet, ICQ# 15827691, YahooIM: takeda64
http://ircwiki.takeda.tk - strona wiki poświęcona IRC
Re: Optymalizacja skryptu
#238
Author: Googie
Date: Thu, 29 Dec 2005 08:22
20 lines
1424 bytes
Derek Kuliński / takeda wrote:
> No wygląda to duuużo lepiej (i znowu to foreach =)))

Sprawdź jeszcze ([time]) ile wykonuje się ta metoda, a ile ta 
poprzednia. Szkoda tracić prędkość kosztem ładnego wyglądu kodu. No 
chyba że tutaj to nie gra roli :)

> Niemniej musiałem zmienić to:
> | 			return $v2
> na:
> |			return [adjust_timer $time_left $v2]
> 
> Inaczej nie przechodziło testów :)
> 

Nie zagłębiałem się w działanie ;)

-- 
Pozdrawiam!
Googie
Re: Optymalizacja skryptu
#239
Author: Derek Kuliński / takeda
Date: Thu, 29 Dec 2005 20:16
26 lines
2310 bytes
On Thu, 29 Dec 2005 09:22:43 +0100, Googie wrote:

>> No wygląda to duuużo lepiej (i znowu to foreach =)))
> Sprawdź jeszcze ([time]) ile wykonuje się ta metoda, a ile ta 
> poprzednia. Szkoda tracić prędkość kosztem ładnego wyglądu kodu. No 
> chyba że tutaj to nie gra roli :)

Fakt to z pętlą foreach raczej będzie działało dłużej... Ale jeżeli wykona
się w mniej niż sekundę to powinno być ok... Z drugiej strony, poniższa
funkcja skoryguje czas (o ile działa poprawnie).

>> Niemniej musiałem zmienić to:
>>| 			return $v2
>> na:
>>|			return [adjust_timer $time_left $v2]
>> Inaczej nie przechodziło testów :)
> Nie zagłębiałem się w działanie ;)

Fajnie jak byś się zagłębił, bo ta część też mi się nie podoba =)

Ogólnie chodzi, żeby cały timer (after) mógł być wywołany w dowolnym
momencie, ale mimo tego ustawił właściwy czas aby poprawnie odliczał.
-- 
ダレック
takeda@IRCnet.EFnet, ICQ# 15827691, YahooIM: takeda64
http://ircwiki.takeda.tk - strona wiki poświęcona IRC
Re: Optymalizacja skryptu
#240
Author: Googie
Date: Fri, 30 Dec 2005 07:20
45 lines
2304 bytes
Derek Kuliński / takeda wrote:
> Fakt to z pętlą foreach raczej będzie działało dłużej... Ale jeżeli wykona
> się w mniej niż sekundę to powinno być ok... Z drugiej strony, poniższa
> funkcja skoryguje czas (o ile działa poprawnie).
> 

Hehe, ja tu mówiłem raczej o rzędach wielkości milisekund :)


> Fajnie jak byś się zagłębił, bo ta część też mi się nie podoba =)

Tzn. co? [adjust_timer]? Co Ci się tam nie podoba?

> Ogólnie chodzi, żeby cały timer (after) mógł być wywołany w dowolnym
> momencie, ale mimo tego ustawił właściwy czas aby poprawnie odliczał.

Na prawdę nie mam sił rozgryzać działania całego skryptu :)

Szybkim rzutem oka zauważyłem jeszcze jedną - na prawdę drobną - 
optymalizację:

proc adjust_timer {current increment} {
	set res [expr {$current % $increment}]
	if {$res == 0} {
		set res $increment
	}
	return $res
}

można zapisać tak:

proc adjust_timer {current increment} {
	set res [expr {$current % $increment}]
	if {$res == 0} {
		return $increment
	}
	return $res
}

i w przypadku $res == 0 oszczędzimy 1 wywołane komendy :) Wiem, to 
śmieszne żeby się bawić w takie pierdółki... tak tylko piszę.

-- 
Pozdrawiam!
Googie
Re: Optymalizacja skryptu
#241
Author: Mirosław Kosmala
Date: Fri, 30 Dec 2005 13:18
25 lines
1670 bytes
Googie wrote:
> 
> i w przypadku $res == 0 oszczędzimy 1 wywołane komendy :) Wiem, to
> śmieszne żeby się bawić w takie pierdółki... tak tylko piszę.
> 

   To ja jadąc tym torem (też bez zagłębiania się w całość ;-)

   Zapis:

      set now [clock seconds]
      set time_left [expr {$Config(time) - $now}]


   Powinien chyba też działać jako:

      set time_left [expr {$Config(time) - [clock seconds]}]

   
   Tu się oszczędzi komendę, tam zmienną i jakoś to wszystko razem... :-)

   zdrawiam
-- 
Mirosław Kosmala
miroslaw.kosmala(małpa)trilowcy.org
Re: Optymalizacja skryptu
#246
Author: Googie
Date: Fri, 30 Dec 2005 13:33
19 lines
1447 bytes
Derek Kuliński / takeda wrote:
[...]

No dobra, przeglądnąłem kod nieco dokładniej. Mam zastrzeżenie co do 
procedury [koncowka]. Mianowicie nie dziala ona poprawnie np dla liczb: 
22...24, 32...34, 42..44, itd. Będzie pisało "22 godzin", lub "34 
godzin", a powinno być "22 godziny" i "34 godziny", ale już "35 godzin" 
, oraz "30 godzin" i "31 godzin".

Nie jestem pewien (nie testowałem), ale chyba tak było by dobrze:

proc koncowka {liczba} {
	return [expr {$liczba == 1 ? "a" : \
		( ($liczba%10) < 5 && ($liczba%10) > 1 ? "y" : "")}]
}

-- 
Pozdrawiam!
Googie
Re: Optymalizacja skryptu
#242
Author: Derek Kuliński / takeda
Date: Sat, 31 Dec 2005 20:48
30 lines
2314 bytes
On Fri, 30 Dec 2005 14:18:01 +0100, Mirosław Kosmala wrote:

>> i w przypadku $res == 0 oszczędzimy 1 wywołane komendy :) Wiem, to
>> śmieszne żeby się bawić w takie pierdółki... tak tylko piszę.
>    To ja jadąc tym torem (też bez zagłębiania się w całość ;-)
> 
>    Zapis:
> 
>       set now [clock seconds]
>       set time_left [expr {$Config(time) - $now}]
> 
>    Powinien chyba też działać jako:
> 
>       set time_left [expr {$Config(time) - [clock seconds]}]
> 
>    
>    Tu się oszczędzi komendę, tam zmienną i jakoś to wszystko razem... :-)

Ten skrypt pasowało by napisać całkowicie od nowa... ale już czasu za
bardzo nie ma =) Może przy odliczaniu 2007 =)

Dziękuję wszystkim za pomoc =)

Nie rozumiem, dlaczego osoby, które odsyłałem na tą grupę coś nieza bardzo
chcą tutaj zadawać tcl'owych pytań...

-- 
ダレック
takeda@IRCnet.EFnet, ICQ# 15827691, YahooIM: takeda64
http://ircwiki.takeda.tk - strona wiki poświęcona IRC
Re: Optymalizacja skryptu
#245
Author: Derek Kuliński / takeda
Date: Sat, 31 Dec 2005 20:48
54 lines
3348 bytes
On Fri, 30 Dec 2005 08:20:11 +0100, Googie wrote:

> Derek Kuliński / takeda wrote:
>> Fakt to z pętlą foreach raczej będzie działało dłużej... Ale jeżeli wykona
>> się w mniej niż sekundę to powinno być ok... Z drugiej strony, poniższa
>> funkcja skoryguje czas (o ile działa poprawnie).
> Hehe, ja tu mówiłem raczej o rzędach wielkości milisekund :)

Milisekundy w sumie też mają wpływ, w sumie dlatego odejmuję 499 przy
poleceniu after, pewnie powinienem chyba zmierzyć czas wykonywania
polecenia timer i odjąć tyle ile mi wyjdzie.

W każdym razie jak nic nie odejmę to timer zawsze spóźnia się o sekundę...

>> Fajnie jak byś się zagłębił, bo ta część też mi się nie podoba =)
> Tzn. co? [adjust_timer]? Co Ci się tam nie podoba?

Wiesz, jak to pisałem to byłem pół przytomny (grypa czy coś mnie chwyciła)
przy tej funkcji bardziej zgadywałem co trzeba zrobić =)

>> Ogólnie chodzi, żeby cały timer (after) mógł być wywołany w dowolnym
>> momencie, ale mimo tego ustawił właściwy czas aby poprawnie odliczał.
> Na prawdę nie mam sił rozgryzać działania całego skryptu :)
> Szybkim rzutem oka zauważyłem jeszcze jedną - na prawdę drobną - 
> optymalizację:
> 
> proc adjust_timer {current increment} {
> 	set res [expr {$current % $increment}]
> 	if {$res == 0} {
> 		set res $increment
> 	}
> 	return $res
> }
> 
> można zapisać tak:
> 
> proc adjust_timer {current increment} {
> 	set res [expr {$current % $increment}]
> 	if {$res == 0} {
> 		return $increment
> 	}
> 	return $res
> }
> 
> i w przypadku $res == 0 oszczędzimy 1 wywołane komendy :) Wiem, to 
> śmieszne żeby się bawić w takie pierdółki... tak tylko piszę.

Czemu nie? Czym krócej wywoływane jest to całe timer, tym chyba mniej
trzeba skorygować czas (jak to napisałem na samym początku)...

-- 
ダレック
takeda@IRCnet.EFnet, ICQ# 15827691, YahooIM: takeda64
http://ircwiki.takeda.tk - strona wiki poświęcona IRC
Re: Optymalizacja skryptu
#247
Author: Derek Kuliński / takeda
Date: Sat, 31 Dec 2005 20:48
15 lines
1625 bytes
On Fri, 30 Dec 2005 14:33:50 +0100, Googie wrote:

> Nie jestem pewien (nie testowałem), ale chyba tak było by dobrze:
> 
> proc koncowka {liczba} {
> 	return [expr {$liczba == 1 ? "a" : \
> 		( ($liczba%10) < 5 && ($liczba%10) > 1 ? "y" : "")}]
> }

Dzięki, faktycznie zapomniałem o wyższych liczbach =)

-- 
ダレック
takeda@IRCnet.EFnet, ICQ# 15827691, YahooIM: takeda64
http://ircwiki.takeda.tk - strona wiki poświęcona IRC
Re: Optymalizacja skryptu
#243
Author: Googie
Date: Mon, 02 Jan 2006 07:40
12 lines
1526 bytes
Derek Kuliński / takeda wrote:
> Nie rozumiem, dlaczego osoby, które odsyłałem na tą grupę coś nieza bardzo
> chcą tutaj zadawać tcl'owych pytań...
> 

Też się zastanawiam skąd ta niechęć... Ja również wiele osób dręczących 
mnie o pomoc z Tcl odsyłałem tutaj, ale grzecznie dziękowały i na tym 
się kończyło :/ Co jest z tymi ludźmi?!

-- 
Pozdrawiam!
Googie
Re: Optymalizacja skryptu
#244
Author: Derek Kuliński / takeda
Date: Thu, 05 Jan 2006 07:30
14 lines
1970 bytes
On Mon, 02 Jan 2006 08:40:00 +0100, Googie wrote:

>> Nie rozumiem, dlaczego osoby, które odsyłałem na tą grupę coś nieza bardzo
>> chcą tutaj zadawać tcl'owych pytań...
> Też się zastanawiam skąd ta niechęć... Ja również wiele osób dręczących 
> mnie o pomoc z Tcl odsyłałem tutaj, ale grzecznie dziękowały i na tym 
> się kończyło :/ Co jest z tymi ludźmi?!

Najprawdopodobniej są za leniwi (na GG czy IRC jest b. prosto zapytać)...

-- 
ダレック
takeda@IRCnet.EFnet, ICQ# 15827691, YahooIM: takeda64
http://ircwiki.takeda.tk - strona wiki poświęcona IRC
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