SVG vroeg mij waarom ik GetLogicalDriveStrings gebruikte in plaats van GetLogicalDrives. Het antwoord daarop wist ik eerlijk gezegd niet, dus hij gaf mij een aangepaste functie:
Code:
Procedure GetDrivesSVG( Const aList: TStrings );
Var
DrvInt,
I: Integer;
Const
DrvLetters: Array [0..25] of char =
( 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z' );
Begin
DrvInt := GetLogicalDrives();
If DrvInt = 0 then
Raise Exception.Create( SysErrorMessage( GetLastError ) );
For I := 0 to 25 do
Begin
If DrvInt And 1 > 0 then
aList.Add( DrvLetters[ I ] );
DrvInt := DrvInt shr 1;
End;
End;
De werking hiervan is exact hetzelfde, behalve dat er gebruik wordt gemaakt van bit-testjes, wat over het algemeen de voorkeur heeft boven string-manipulatie. Ook vermeldde SVG dat ie iets sneller is...
Eigenwijs als ik ben ging ik dit natuurlijk testen, en op 100.000x aanroepen bleek dit 0.1 seconde sneller te zijn. Dit kan sneller dacht ik, en jawel, met wat creatief coderen lukte dit. De originele code deed er 1.1582 seconden over, SVG's code 1.0652 en onderstaande code 0.2939... de moeite waard . Niet dat je ooit 100.000 keer zo'n lijst op wilt vragen, maar optimalisatie is per definitie goed .
De code:
Code:
procedure GetDrives2(const ADest: TStrings);
var
iDrives: Integer;
iDrive: Integer;
iBit: Integer;
begin
// GetLogicalDrives geeft een integer terug waarvan de 1e bit aangeeft of
// drive A beschikbaar is (0/1), het 2e bit drive B, enz...
iDrives := GetLogicalDrives();
if iDrives = 0 then
RaiseLastOSError(); // RaiseLastWin32Error met Delphi 5 en lager..
iBit := 1;
for iDrive := 0 to 25 do begin
if (iDrives and iBit) = iBit then
// 65 = ASCII code voor 'A'
ADest.Add(Chr(iDrive + 65));
iBit := iBit shl 1;
end;
end;
De laatste functie raadt ik dus aan, maar elk van deze functies doet z'n werk prima. Het is in ieder geval weer leuk geweest om aan te sleutelen .
[Edit]
De optimalisatie-drift is iets te ver gegaan denk ik, de code werktte niet eens meer . In ieder geval is dat nu opgelost... *schaam schaam*
Bookmarks