Article View: pl.comp.lang.asm
Article #763Re: szybkie czytanie z LPT
From: p.h.
Date: Thu, 19 Oct 2006 08:35
Date: Thu, 19 Oct 2006 08:35
59 lines
3484 bytes
3484 bytes
Witam! Bogdan (bogdro) napisał: > Jeśli program nie musi być 32-bitowy, to napisz program 16-bitowy i > spróbuj tradycyjną 16-bitową metodą > > mov dx, 378h > in al, dx > > przed czytaniem sprawdzając dostępność danych. > Ponadto, jeśli program ma krótką a często wykonywaną pętlę (jak np. > czytanie z portu), zminimalizuj w tej pętli ilość skoków wszelkiego > rodzaju (JMP, Jcc, CALL). Jeśli masz cos wyrzucić na ekran, to rób to > tylko raz na jakiś czas, nie po każdym przeczytanym bajcie. Tzn. niech > jedynym zadaniem pętli będzie czytanie danych z portu i zapisywanie > ich do pamięci. > > Ja osobiście nie znam przepustowości portu LPT (tzn. te 750 może > wynikać z buforowania na przykład). Upewnij się, że port działa w > trybie EPP lub ECP. Program w wersji ASM ma postać pojedynczej pętli, w której wczytywana jest zadana ilość znaków z portu w sposób, który podałeś. W owym programie testowym nie są one nawet zapamiętywane. Nie ma też żadnych innych operacji które wykonywałaby ta pętla poza samym czytaniem z portu, zmniejszaniem licznika, porównywaniem go z zerem i skokiem do początku. Nie sprawdzam też dostępności danych, więc to także powinno dać przyspieszenie. Port ustawiałem w trybach EPP i ECP. Pod WinXP musiał korzystać ze sterownika AllowIO, ale testowałem go też pod Win98 - prędkość jest ta sama. Prędkość sprawdzana jest poprzez sprawdzenie czasu wykonania pętli, która czyta 1'000'000 znaków (funkcja timeGetTime() z API WIndowsa). Matuzalem napisał: > Na twoim miejscu napisałbym "czysty" kod w asm bez żadnych > wspomagaczy typu dll, vxd, itd.. Sprawdzałem kod ASM z bezpośrednimi odwołaniami do portu pod Win98; prędkość jego wykonania była ta sama co pod WinXP z użyciem pośredniczących DLLi. > Druga sprawa, to że w HLL-u jest wolniej nie oznacza, że jest to ich > wina. Może masz niezbyt optymalny kod - chaotyczny (choć napewno > nigdy nie uzyskasz większej szybkości jak w asm). W ogólności tak, ale w tym przypadku najwyraźniej coś jeszcze można zrobić bo wspomniany przeze mnie program Digitrace, który używa DLLa AllowIO uzyskuje większą prędkość niż mój elementarnie prosty i pozbawiony wszelkich elementów nadmiarowych kod testowy w ASM. Kiedyś port LPT był zależny od wait states'ów na magistrali ISA. Choć ISA odeszła do lamusa, to owa zależność mogła pozostać. Może jest możliwe zmniejszenie wait states'ów? -- serdecznie pozdrawiam, p.h.
Technical Details
Message-ID:
<eh7dcn$7iq$1@news.task.gda.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.task.gda.pl!not-for-mailReferences:
<eh1v9c$act$1@news.task.gda.pl> <eh2tt6$ogj$1@nemesis.news.tpi.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!newsfeed.pionier.net.pl!news.task.gda.pl!not-for-mail From: "p.h." <przemhb@wp.pl> Newsgroups: pl.comp.lang.asm Subject: Re: szybkie czytanie z LPT Date: Thu, 19 Oct 2006 10:35:32 +0200 Organization: CI TASK http://www.task.gda.pl/ Lines: 60 Message-ID: <eh7dcn$7iq$1@news.task.gda.pl> References: <eh1v9c$act$1@news.task.gda.pl> <eh2tt6$ogj$1@nemesis.news.tpi.pl> NNTP-Posting-Host: ck170.internetdsl.tpnet.pl Mime-Version: 1.0 X-Trace: news.task.gda.pl 1161246936 7770 80.53.220.170 (19 Oct 2006 08:35:36 GMT) X-Complaints-To: abuse@news.task.gda.pl NNTP-Posting-Date: Thu, 19 Oct 2006 08:35:36 +0000 (UTC) User-Agent: Thunderbird 1.5.0.7 (Windows/20060909) In-Reply-To: <eh2tt6$ogj$1@nemesis.news.tpi.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit