Dies ist wirklich komisch !Interessanterweise wird die Zeiger Methode aber erst so ab 10 000 Zeilen schneller als MemW.

Vielleicht optimiert die CPU noch etwas, es könnte sein, das dies auf einem original 8088er ganz anders aussieht.
Dies ist wirklich komisch !Interessanterweise wird die Zeiger Methode aber erst so ab 10 000 Zeilen schneller als MemW.
FAR sind "grosse" Pointer (seg+ofs), dem Gegensatz ist NEAR (typisch nur ofs, seg ist implizit, entweder global oder per unit)Mathias hat geschrieben: Ich weis zwar nicht, was du mit FAR data model meinst,
Aber wen ich es jetzt mitkompiliere, funktioniert es fehlerfrei.Code: Alles auswählen
c:\FPC\3.0.0\bin\i386-win32\ppcross8086.exe -WmLarge PACMAN.lpr
Wen ich das richtig verstehe, ist für kleine schnell Sachen das NEAR-Modell besser, das man nicht mit Seg hantieren muss ?FAR sind "grosse" Pointer (seg+ofs), dem Gegensatz ist NEAR (typisch nur ofs, seg ist implizit, entweder global oder per unit)
Die Aussage über die Put-Methode wollte ich korrigieren. Denn bei einer Routine ist sie langsamer als die Mem-Method und bei einer anderen schneller.Jole hat geschrieben:Interessanterweise wird die Zeiger Methode aber erst so ab 10 000 Zeilen schneller als MemW.
Ja (auf alten Eisen), UND gleich. Also Code NEAR, data NEAR, aber auch CODE=DATA, also Code model Tiny.Mathias hat geschrieben:Wen ich das richtig verstehe, ist für kleine schnell Sachen das NEAR-Modell besser, das man nicht mit Seg hantieren muss ?FAR sind "grosse" Pointer (seg+ofs), dem Gegensatz ist NEAR (typisch nur ofs, seg ist implizit, entweder global oder per unit)
Da hab ich mich wohl etwas unglücklich ausgedrückt, ich wollte eigentlich sagen das es erst da Optisch spürbar wird.Mathias hat geschrieben:Dies ist wirklich komisch !Interessanterweise wird die Zeiger Methode aber erst so ab 10 000 Zeilen schneller als MemW.![]()
Mir ist es schon wichtig das ich den Code verstehe.Jole hat geschrieben:@Nixsager: Wenn die MemW Methode schneller ist und du die Funktionsweise auch besser verstehst, würde ich diese Methode auch nutzen.
Genau deshalb ist die Methode eben nicht unschlagbarWill man nur einen Text damit ausgeben, ist diese Method am langsamsten, da die Daten vor dem ausgeben angepasst werden müssen.
Gewisse 32Bit-Befehle und Register funktionierten auch im Real-Modus.Im 32-bit Modus ist das auch so, aber mit 4GB als Grenze nicht so unbequem. Für reine Schnellheit >386 ist 32-bit Modus am besten.
Ich glaube der 386, weil schon 32-bit, ist schneller mit 16-bit, bin mir aber nicht ganz sicher.
Nun ja, Linux wird auch von Version zu Version hardwarehungriger.Mathias hat geschrieben: Das waren schon noch Zeiten, wo man alle aus der Kiste raus holte. Da könnte M$ noch einiges abgucken mit seinem aufgeblähten Windows.
Ich habe den Code gefunden, das CLS müssten noch das Zeichen und Attribut angepasst werden.Mathias hat geschrieben:Unter Win kann man auch jedes Zeichen ansprechen, aehnlich wie im Vram.
Ich kann es dir mal rausuchen, wen ich wieder vorm PC hocke.
Code: Alles auswählen
procedure OutCharXY(x, y: integer; ch: char; col: byte);
var
numChars: integer = 1;
c: coord;
p: longword = 0;
begin
c.X := x;
c.Y := y;
FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), col, numChars, c, p);
FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), ch, numChars, c, p);
end;
procedure Cls;
var
numChars: integer = 80 * 25;
c: coord;
x: longword = 0;
begin
c.X := 0;
c.Y := 0;
FillConsoleOutputAttribute(GetStdHandle(STD_OUTPUT_HANDLE), $13,
numChars, c, x);
FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), char(13),
numChars, c, x);
end;
Code: Alles auswählen
program project1;
uses
Windows,
Classes;
var
x, y: integer;
wHnd, rHnd: HANDLE;
const
Width = 80;
Height = 25;
bufferSize: COORD = (x: Width; y: Height);
characterBufferSize: COORD = (x: Width; y: Height);
characterPosition: COORD = (x: 0; y: 0);
consoleWriteArea: SMALL_RECT = (Left: 0; Top: 0; Right: Width - 1; Bottom: Height - 1);
var
consoleBuffer: array[0..Width * 2 * Height] of CHAR_INFO;
a: byte;
r: small_Rect;
begin
wHnd := GetStdHandle(STD_OUTPUT_HANDLE);
rHnd := GetStdHandle(STD_INPUT_HANDLE);
SetConsoleTitle('Mien Konsolen Programm');
r.Left := 0;
r.Top := 0;
r.Bottom := 54;
r.Right := 79;
SetConsoleWindowInfo(wHnd, True, r);
SetConsoleScreenBufferSize(wHnd, bufferSize);
for y := 0 to Height - 1 do begin
for x := 0 to Width - 1 do begin
consoleBuffer[x + (Width + 20) * y].AsciiChar := char(x);
a := y;
a := a or $f0;
consoleBuffer[x + (Width + 20) * y].Attributes := a;
end;
end;
characterBufferSize.X := Width + 20;
// characterBufferSize.Y:=5;
// characterPosition.X:=32;
// characterPosition.Y:=4;
consoleWriteArea.Left := 1;
consoleWriteArea.Top := 1;
consoleWriteArea.Right := 60;
consoleWriteArea.Bottom := 40;
WriteConsoleOutputA(wHnd, @consoleBuffer, characterBufferSize, characterPosition, consoleWriteArea);
readln;
end.