Article View: pl.comp.lang.tcl
Article #533Re: Słaba wydajność TCLa ?
From: Artur
Date: Sun, 07 Oct 2007 18:10
Date: Sun, 07 Oct 2007 18:10
85 lines
4181 bytes
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
Technical Details
Message-ID:
<1191780618.467217.65970@o80g2000hse.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!o80g2000hse.googlegroups.com!not-for-mailReferences:
<1191702228.578214.230640@22g2000hsm.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.glorb.com!postnews.google.com!o80g2000hse.googlegroups.com!not-for-mail From: Artur <mail@xdobry.de> Newsgroups: pl.comp.lang.tcl Subject: Re: Słaba wydajność TCLa ? Date: Sun, 07 Oct 2007 11:10:18 -0700 Organization: http://groups.google.com Lines: 107 Message-ID: <1191780618.467217.65970@o80g2000hse.googlegroups.com> References: <1191702228.578214.230640@22g2000hsm.googlegroups.com> NNTP-Posting-Host: 80.132.127.249 Mime-Version: 1.0 X-Trace: posting.google.com 1191780618 5835 127.0.0.1 (7 Oct 2007 18:10:18 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Sun, 7 Oct 2007 18:10:18 +0000 (UTC) In-Reply-To: <1191702228.578214.230640@22g2000hsm.googlegroups.com> User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7,gzip(gfe),gzip(gfe) Complaints-To: groups-abuse@google.com Injection-Info: o80g2000hse.googlegroups.com; posting-host=80.132.127.249; posting-account=ps2QrAMAAAA6_jCuRt2JEIpn5Otqf_w0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit