🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.asm
Article #763

Re: szybkie czytanie z LPT

#763
From: p.h.
Date: Thu, 19 Oct 2006 08:35
59 lines
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-mail
References: <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