🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.tcl
5 messages
5 total messages Started by TCLfriend Sat, 06 Oct 2007 20:23
Słaba wydajność TCLa ?
#532
Author: TCLfriend
Date: Sat, 06 Oct 2007 20:23
12 lines
1807 bytes
Witajcie!

Miałem ostatnio potrzebę przekodować prostą operacją XOR dość duży
plik (kilkaset MB). Przy okazji porównałem wydajność analogicznego
kodu napisanego w Tclu, perlu i javie i niestety musze stwierdzić, że
wydajność Tcl'a pozostawiła tu wiele do życzenia :-( Oczywiście test
ten nie może być uznany za obiektywny, jednak dotyczył realnego
zagadnienia przez co jego wynik uważam za szczególnie istotny. Nie
chcę zaśmiecać grupy, szczegóły tego 'testu' opisałem tutaj:
http://tclmentorpl.kocjan.org/2007/10/krtka-rozprawa-midzy-panem-wjtem-i.html
, natomiast chciałbym się spytać innych użytkowników Tcla, jak wy
znajdujecie wydajność tego języka w odniesieniu do innych?
Re: Słaba wydajność TCLa ?
#533
Author: Artur
Date: Sun, 07 Oct 2007 18:10
85 lines
4181 bytes
On 6 Okt., 22:23, TCLfri...@googlemail.com wrote:
> Witajcie!
>
> Miałem ostatnio potrzebę przekodować prostą operacją XOR dość duży
> plik (kilkaset MB). Przy okazji porównałem wydajność analogicznego
> kodu napisanego w Tclu, perlu i javie i niestety musze stwierdzić, że
> wydajność Tcl'a pozostawiła tu wiele do życzenia :-( Oczywiście test
> ten nie może być uznany za obiektywny, jednak dotyczył realnego
> zagadnienia przez co jego wynik uważam za szczególnie istotny. Nie
> chcę zaśmiecać grupy, szczegóły tego 'testu' opisałem tutaj:http://tclmentorpl.kocjan.org/2007/10/krtka-rozprawa-midzy-panem-wjte...
> , natomiast chciałbym się spytać innych użytkowników Tcla, jak wy
> znajdujecie wydajność tego języka w odniesieniu do innych?

Tak. To jest dobry przykład do czego nie powinno się używać Tcl
bezpośrednio.
Tcl został wymyślony jako tzw. jezyk klej. Klej dla kodu napisanego w
C.
Tcl to tak naprawdę duża biblioteka napisana w języku C.
W tym przypadku najbardziej racjonalne jest napisanie tej procedury w
C
jako biblioteki (extension) dla Tcl.
Tcl ma bardzo dobry API dla języka C jest on o niebo łatwiejszy od
Perl, PHP, Python i Java.
Dobrą obcją może być też critcl, który pozwala na pisanie w C
bezpośrednio w Tcl.
Tą drogę wybrał też Perl i dlatego wygrał. Jedyna różnice to to, że
akurat ta procedura nie
należy do standartowych funkcji w Tcl.

Oczywiście można by było trochę tę kod optymować ale wielkich
rezultatów nie można się spodziewać.
może zamiast lappend używać append. Jeśli wyobrażę sobie co Tcl robi w
tym czasie aby to wykonać i
co jest robione z pamięcią to to nie może być szybkie.

To podaję kod biblioteki w C dla Tcl.
Nie sprawdzałem z braku czasu chodzi tu tylko o ideę.
Według mnie pisanie bibliotek w C dla Tcl to także część Tcl.

static int stringxor(ClientData clientData, Tcl_Interp *interp, int
objc, Tcl_Obj *const objv[])
{
  if (objc!=2) {
      Tcl_WrongNumArgs(interp, 1, objv, "proceduro atendas du
argumentojn");
      return TCL_ERROR;
  }
  int stringlen,xorlen,t=0
  char *string = Tcl_GetStringFromObj(objv[0], &stringlen);
  char *xor = Tcl_GetStringFromObj(objv[1], &xorlen);

  for (int x=0;x<stringlen;x++) {
      string[x] ^= xor[t];
      t++;
      if (t>=xorlen) t = 0;
  }

  return TCL_OK;
}


#ifdef _WINDOWS
__declspec( dllexport )
#endif
int Stringxor_Init(interp)
    Tcl_Interp *interp;
{

  if (Tcl_InitStubs(interp, "8.1", 0) == NULL)
    return TCL_ERROR;
  if (Tcl_PkgRequire(interp, "Tcl", "8.1", 0) == NULL)
    return TCL_ERROR;
  if (Tcl_PkgProvide(interp, "stringxor" , "1.0") != TCL_OK)
    return TCL_ERROR;

   Tcl_CreateObjCommand(interp,"stringxor",stringxor,NULL, NULL);

   return TCL_OK;
}

Szybciej byłoby tylko może w assemblerze (operacje na całych wyrazach
32 bit)
możliwe że kompiler to zoptymuje.

Artur
Re: Słaba wydajność TCLa ?
#534
Author: Wojciech Kocjan
Date: Sun, 07 Oct 2007 18:29
46 lines
2896 bytes
Dnia 07-10-2007 o 20:10:18 Artur <mail@xdobry.de> napisał(a):
> On 6 Okt., 22:23, TCLfri...@googlemail.com wrote:
>> Miałem ostatnio potrzebę przekodować prostą operacją XOR dość duży
>> plik (kilkaset MB). Przy okazji porównałem wydajność analogicznego
>> kodu napisanego w Tclu, perlu i javie i niestety musze stwierdzić, że
>> wydajność Tcl'a pozostawiła tu wiele do życzenia :-( Oczywiście test
>> ten nie może być uznany za obiektywny, jednak dotyczył realnego
>> zagadnienia przez co jego wynik uważam za szczególnie istotny. Nie
>> chcę zaśmiecać grupy, szczegóły tego 'testu' opisałem  
>> tutaj:http://tclmentorpl.kocjan.org/2007/10/krtka-rozprawa-midzy-panem-wjte...
>> , natomiast chciałbym się spytać innych użytkowników Tcla, jak wy
>> znajdujecie wydajność tego języka w odniesieniu do innych?
> Tak. To jest dobry przykład do czego nie powinno się używać Tcl
> bezpośrednio.
> Tcl został wymyślony jako tzw. jezyk klej. Klej dla kodu napisanego w
> C.

Tu akurat się zgadzam.

> [ciach]
> static int stringxor(ClientData clientData, Tcl_Interp *interp, int
> objc, Tcl_Obj *const objv[])
> {
>   if (objc!=2) {
>       Tcl_WrongNumArgs(interp, 1, objv, "proceduro atendas du
> argumentojn");
>       return TCL_ERROR;
>   }
>   int stringlen,xorlen,t=0
>   char *string = Tcl_GetStringFromObj(objv[0], &stringlen);
>   char *xor = Tcl_GetStringFromObj(objv[1], &xorlen);

Zależnie od tego co autor miał na myśli (a raczej miał na myśli dane  
binarne) to pewnie chodziło o Tcl_GetByteArrayFromObj().

Zastanawiam się nad czymś innym - czy nie można tego problemu trochę  
uogólnić i np zaimplementować w oparciu o C i Tcl_ExprObj(). Na przykład:

manipulatedata byte data $datastr byte key $keystr {$data ^ $key} <-  
ostatnie to formuła matematyczna.

O ile takie coś pewnie nie znajdzie się w samym Tcl, to pewnie mogłoby  
znaleźć się w Tcllib wraz z wersją critcl (jak np md5 w tcllib).

-- 
Wojciech Kocjan
Re: Słaba wydajność TCLa ?
#536
Author: ZB
Date: Sun, 07 Oct 2007 18:45
12 lines
1307 bytes
Dnia 06.10.2007 TCLfriend@googlemail.com <TCLfriend@googlemail.com> napisał/a:

> , natomiast chciałbym się spytać innych użytkowników Tcla, jak wy
> znajdujecie wydajność tego języka w odniesieniu do innych?

Odnośnie szybszej Javy: to jeszcze zależy, której wersji Tcl użyto do testu;
ktoś na liście angielskiej niedawno "zapodał", że 8.5 jest ok. 2-krotnie
wolniejsza od 8.4 (sam nie sprawdzałem; i tak nic przecież na to nie
poradzę). Więc gdyby (ha, gdyby...) w wersji finalnej podregulowano
wydajność tak, żeby wrócić do stanu z 8.4, nie byłoby znowuż tak źle.
-- 
ZB
Re: Słaba wydajność TCLa ?
#535
Author: Artur
Date: Mon, 08 Oct 2007 07:11
40 lines
2923 bytes
> > [ciach]
> > static int stringxor(ClientData clientData, Tcl_Interp *interp, int
> > objc, Tcl_Obj *const objv[])
> > {
> >   if (objc!=2) {
> >       Tcl_WrongNumArgs(interp, 1, objv, "proceduro atendas du
> > argumentojn");
> >       return TCL_ERROR;
> >   }
> >   int stringlen,xorlen,t=0
> >   char *string = Tcl_GetStringFromObj(objv[0], &stringlen);
> >   char *xor = Tcl_GetStringFromObj(objv[1], &xorlen);
>
> Zależnie od tego co autor miał na myśli (a raczej miał na myśli dane
> binarne) to pewnie chodziło o Tcl_GetByteArrayFromObj().
>
> Zastanawiam się nad czymś innym - czy nie można tego problemu trochę
> uogólnić i np zaimplementować w oparciu o C i Tcl_ExprObj(). Na przykład:
>
Rzeczywiście to było zbyt szybko (niem. Schnellschuss) i niepoprawnie.
Tak naprawdę nie wolno modyfikować danych objektów w ten sposób
poniewąż Tcl użwywa Copy on Write. Tzn dane mogę być używane przez
wiele objektów (sharing).
Poprawnie by było zwracać wynik jako nowy objekt, ja chiałem
modyfikować parameter przez referencję.
Problemem jest też to, że Tcl używa wewnętrznie UTF-8 (z kilkoma
modyfikacjami) tzn.
Tcl_GetByteArrayFromObj() i Tcl_NewByteArrayObj są jedynie dobrym
rozwiązaniem.

Tak na marginesie. Przez UTF8 Tcl nadaję się bardzo dobrze do
tworzenia rozwiązań wielojęzycznych i do obróbki tekstów ale obróbka
czystych danych binarnych jest trochę trudniejsza, wolniejsza i
mozolna.

Tcl_ExprObj() ciekawę to może było by najbardziej eleganckie
rozwiązanie.

Artur
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