-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
21. Mär 2012
Hallo,
dann liegt es wohl an Freepascal und deren Speicherung dynamischer Felder.
Was mich wundert, dass Panthrax mit Win64 das kompiliert bekommt.
Freepascal 2.7.1. für Linux64 meckert über jede Zeile.
Die Pascalversionen sind dann aber für Int64 (etwas mehr) und Int32 ( ein wenig) schneller, weil dann viel mehr Register benutzt werden können, aber kein Vergelich zu den Assemblerversionen....
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
21. Mär 2012
Hallo,
Ach Herr je,
da will man clever sein und fällt wieder auf die Nase ;-)
Weil bei mir PrepareSamples wegen random in freepascal so ewig dauerte, kam ich auf die Idee, für eine neue Runde Left aus Right zu kopieren und anschliessend nur PrepareSamples(Right) aufzurufen.
Dämlicherweise habe ich dies nicht ans Ende der repetitions-Schleife getan sondern noch in der Schleife für die...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
20. Mär 2012
Hallo,
Da ich kein Unit diagnostics habe, ( Wo gibt es die für freepacal? ) habe ich ein workaround queryperformancecounter oder einfach time unter Linux genommen.
Der Aufruf der Assemblerversion sollte auch Intersect, hier Left, auf die richtige Länge setzen, damit Chancengleichheit herrscht und man den Fehler überhaupt erkennen kann.
procedure _Intersect59ASM(var Left: TSampleArray;...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
20. Mär 2012
Hallo,
Was soll ich sagen, aber es zählt immer noch einen zuwenig, wenn gleiche Felder vorliegen :-(.
// Ausgangsfeld erzeugen
setlength(TestFeld,MAXDATCOUNT);
FillArray(TestFeld);
writeln('Laenge Ausgangsfeld ',length(TestFeld):9);
writeln('Ausgabe GetINtersect5 bei gleichen Feldern ',GetIntersect_5(TestFeld,TestFeld,length(TestFeld)):9);
writeln();
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
19. Mär 2012
Hallo,
@Amateurprofi:
Ich habe nur die Version, die Panthrax eingebaut hat, verwendet, villeicht hat sich dort ein kleiner Fehler eingeschlichen.
Dort ist das Ergebnis, die Anzahl der gemeinsamen Elemente in EAX, zweier gleicher Felder eben ein Element zu wenig, wie es auch bei der Pascal Version #19 der Fall ist.
Die Felder die ich erstellt habe, haben keine doppelten, wie ich auch in...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
18. Mär 2012
Hallo,
@Amateruprofi,
kann es sein, dass die Assemblerversion in http://www.delphipraxis.net/1156992-post45.html bei gleichen Feldern ein Feld zu wenig zählt.
@panthrax
Ich habe habe Deine Version #45 zu #51 mit while-Schleifen umgebaut, die zählt scheinbar richtig.
Anbei ein Testprogramm.
Bei -1 wird Testfeld gegen Testfeld getestet und die Schnittmenge sollte die gleiche Länge...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
17. Mär 2012
Hallo,
ich hatte bei #45 übersehen, dass setlength garnicht genutzt wird, dann stimmt die assembler Version für 32 Bit Datentypen.
procedure _Intersect35ASM(var Left: TSampleArray; const Right: TSampleArray);
var
R: TSampleArray;
begin
R := Right;
setlength(Left,Intersect35ASM(Left, R, Length(Left)));
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
17. Mär 2012
Hallo,
ich habe mal das Programm geändert und einfach ein Testfeld mit Zahlen gleichen Abstandes gefüllt habe ( sehr großer Abstand) und anschließend in diesem diese Feld zufällige Werte um 1 oder mehr vergrößert habe.
Dies mehrfach hintereinander.
Versuch= verändertere(Versuch)
Es war mir nicht geheuer, immer nur die gleiche Datei mit sich selbst zu vergleichen, da werden keine Daten...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
13. Mär 2012
Hallo,
im Prinzip bleibt es bei Patti's Vorschlag aus PostNr 2
Aber in 500 ms aus 480 Mbyte die Schnittmenge zu bilden heißt nur, dass alle Dateien im Cache waren.
Gruß Horst
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
FreePascal
by Horst_,
12. Mär 2012
Hallo,
Darum wird fast kaum herum kommen, alle einzulesen, selbst bei Deinem Verfahren http://www.delphipraxis.net/1156016-post2.html
Hier etwas abgewandelt
- feststellen der Anzahl der Datensätze in den n Dateien
- Anzahl dieser Datensätze sortieren, ergibt Dateien n1... <... n12, n1 enthält wenigste Datensätze, n12 die meisten
- n1 -> tmp
- wiederhole für Datei = n2 bis n12
...