ich hab mir hier nen kleinen Hex-Editor gebastelt. Dieser Lädt Dateien in einen TMemorystream und daraus dann in ein Synedit. Das funktioniert auch alles wunderbar. Wenn ich nun eine 20MB Datei lade dauert das ganze erzeugen allerdings ca. 10-15 Sekunden, ursprünglich hatte es 1min gedauert, habe da also schon einiges "optimiert".
Die Frage nun sieht einer von Euch evtl. noch Stellen an denen ich etwas schneller werden kann ?
Code: Alles auswählen
Procedure TForm1.StreamToSynEdit(Const Stream: TMemoryStream;
Const SynEdit: TSynEdit);
Const
ToHex: Array[0..15] Of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
Var
s, s2: String;
j, i, k: integer;
b: Byte;
p: Integer;
Begin
// Das ist schon "Schnell" aber Noch schneller wäre Besser *g*.
SynEdit.Lines.BeginUpdate;
SynEdit.Lines.Clear;
stream.Position := 0;
setlength(s, 10 + 3 * 16); // Den Kompletten String im Vorraus Allokieren, spart Zeit
s[8] := '0'; // Ist immer 0
s[9] := ':';
For j := 10 To 10 + 3 * 16 Do // Alles zu "Null" machen
s[j] := ' ';
For i := 0 To stream.Size Div 16 Do Begin
p := stream.Position;
P := p Shr 4;
For j := 7 Downto 1 Do Begin
s[j] := ToHex[P And $F];
P := p Shr 4;
End;
For j := 0 To 15 Do Begin
If stream.read(b, sizeof(b)) <> 0 Then Begin
s[10 + j * 3 + 1] := ToHex[(B Shr 4) And $F];
s[10 + j * 3 + 2] := ToHex[B And $F];
End
Else Begin
// Den Rest des Strings wieder Löschen
For k := j To 15 Do Begin
s[10 + k * 3 + 1] := ' ';
s[10 + k * 3 + 2] := ' ';
End;
break;
End;
End;
SynEdit.Lines.Add(s);
End;
SynEdit.Lines.EndUpdate;
End;