home *** CD-ROM | disk | FTP | other *** search
-
- {
- To SWAG (group STRINGS.SWG)
-
- Jose Campione claimed that he had the fastest upperstring,
- I proved otherwise. Look at the difference in speed
- between TXLat5 of Jose Campione and mine.
-
- The following benchmarking was done in a 486/DX 60 MHz using
- Neil Rubenking's TimeTick unit while upcasing a full string
- (255 chars) 400,000 times (100 million characters):
-
- For-Do loop using TP7 UpCase() .......... 315.5 secs.
- UpperCase (Assembler classical approach) 53.9 secs. (1)
- My old TXlat3 ........................... 28.3 secs. (2)
- Translate ............................... 26.8 secs. (3)
- TXlat5 .................................. 21.2 secs.
-
- SUPERFASTUPSTRING ....................... 17.1 secs. (!)
-
- Oscar N. Verzaal (bkverzaa@sus.edu.eur.nl)
-
- }
-
- Program UpString;
-
- uses Crt, Dos;
-
- type
- ByteArray = array[0..255] of byte;
-
- var
- Source1,
- Source : string;
- Table : ByteArray;
- k, nr : longint;
- u, m, s, s100 : word;
- tm1, tm2, t1, t2 : real;
-
- Procedure TXlat5(var Source: string; var Table: ByteArray);assembler;
- asm
- mov dx, ds { save ds }
- lds bx,Table { load ds:bx with Table address }
- les di,Source { load es:di with Source address }
- seges { override ds segment}
- mov al,[di] { load al with length of source }
- xor ah, ah { set ah to zero, we need a word for cx }
- mov cx,ax { assign length of source to counter }
- jcxz @end { if cx = 0 exit}
- inc di { increment di & skip length byte on 1st pass }
- @filter:
- mov al,[di] { load byte in ax from es:di }
- xlat { tan-xlat-e... }
- mov [di],al { send byte to es:di }
- inc di { increment di }
- loop @filter { decrement cx and loop back if cx > 0 }
- @end: mov ds, dx { restore ds }
- end;
-
- Procedure SuperFastUpString(var Source, Table);
- inline($8C/$DA/ { mov dx, ds }
- $5B/ { pop bx | lds bx, Table }
- $1F/ { pop ds | }
- $5F/ { pop di | les di, Source }
- $07/ { pop es | }
- $8A/$0D/ { mov cl, [di] }
- $08/$C9/ { or cl, cl }
- $74/$0F/ { jz @end }
- $30/$ED/ { xor ch, ch }
- $47/ { inc di }
- { @loop: }
- $8A/$05/ { mov al, [di] }
- $D7/ { xlat }
- $88/$05/ { mov [di], al }
- $47/ { inc di }
- $49/ { dec cx }
- $75/$F7/ { jnz @loop }
- { @end: }
- $8E/$DA); { mov ds, dx }
-
- begin
- ClrScr;
- nr:=400000;
- writeln('Number of times ',nr:6);
- writeln('----------------------');
-
- for k:= 0 to 255 do
- if k in [$61..$7A] then Table[k]:= k - $20 else Table[k]:= k;
-
- Source1:= 'this string is to be upcased this string is to be upcased this string is to be upcased '+
- 'this string is to be upcased this string is to be upcased this string is to be upcased '+
- 'this string is to be upcased this string is to be upcased this string is to be u.';
-
- Source := Source1;
- GetTime(u, m, s, s100);
- t1 := (u*3600) + (m*60) + s + (s100/100);
- for k:=1 to nr do TXLat5(Source, Table);
- GetTime(u, m, s, s100);
- t2 := (u*3600) + (m*60) + s + (s100/100);
- tm1 := t2 - t1;
- writeln('TXLat5 took ',tm1:5:2,'sec');
-
- Source := Source1;
- GetTime(u, m, s, s100);
- t1 := (u*3600) + (m*60) + s + (s100/100);
- for k:=1 to nr do SuperFastUpString(Source, Table);
- GetTime(u, m, s, s100);
- t2 := (u*3600) + (m*60) + s + (s100/100);
- tm2 := t2 - t1;
- writeln('SuperFastUpString took ',tm2:5:2,'sec');
-
- writeln;
- writeln('Speed advantage of SuperFastUpString over TXlat5 is ',100*((tm1 - tm2) / tm1):6:2,'%');
-
- end.