Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   DoubleSource - Duplikate im Source finden v0.4.1 (https://www.delphipraxis.net/109641-doublesource-duplikate-im-source-finden-v0-4-1-a.html)

Motzi 5. Mär 2008 00:07


DoubleSource - Duplikate im Source finden v0.4.1
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

erstmal vorweg - ich weiß, dass es so ein Programm vor kurzem schonmal hier gab (DupeChecker). Tatsächlich hat mich dieses Programm sogar dazu inspiriert meine eigene Version zu schreiben, da ich in einigen Punkten nicht ganz glücklich damit war (siehe dazu mein Posting im Thread zu dem Programm).
Ich habe daher beschlossen mein eigenes Programm zu schreiben und versucht die von mir kritisierten Punkte zu verbessern.

Features:
  • Sehr schnelle Duplikatssuche
  • Kommentare werden vor dem Vergleichen entfernt -> unterschiedliche Kommentare in identischen Codeblöcken spielen keine Rolle mehr; auskommentierter Code wird nicht als Duplikat erkannt
  • "Überflüssige" Leerzeichen werden vor dem Vergleichen ebenfalls entfernt (aus "i : integer ;" wird "i:integer;") -> Unterschiede in der Formatierung werden ignoriert
  • Übersichtliche Aufbereitung der Ergebnisse in einem Treeview
Anmerkung: Treeview Einträge die kursiv sind sind "Subduplikate", sie sind also ein Teil eines größeren Duplikats. Diese werden nur dann angezeigt, wenn sie identisch mit anderen gefundenen Dupliakten sind, die selbst keine Subdupliakte sind.

v0.4.1
  • Speicherverbrauch wurde drastisch gesenkt
  • Geschwindigkeit wurde um das 4-5 fache gesteigert
  • Rekursive Suche in Unterordnern kann optional deaktiviert werden
  • Comboboxen wurden durch "erweiterte" Versionen ersetzt
  • Es wird nun überall der volle Pfad als Hint angezeigt

v0.3.1
  • Analyse findet nun in einem eigenen Thread statt und kann abgebrochen werden
  • Geschwindigkeit wurde nochmals gesteigert
  • Speicherverbrauch wurde deutlich reduziert
  • Splitter-Problem beseitigt
  • Die Schriftart des Treeview wurde auf Verdana umgestellt - damit gibt es keine Probleme mit den kursiven Zahlen mehr.

v0.2.2
  • Es gibt jetzt eine SettingsForm - die Einstellungen werden in einer ini-Datei und einer txt-Datei gespeichert (siehe weiter unten)
  • Alle Sources eines Duplikats können nun in einem eigenen Fenster direkt verglichen werden
  • Sowohl im "Compare-Fenster" als auch in der MainForm werden die Duplikate im Source durch eine eigene Hintergrundfarbe gekennzeichnet
  • Duplikate die nur aus Keywords bestehen können ignoriert werden
  • Geschwindigkeit wurde um das bis zu 4-fache beschleunigt
Folgende Einstellungen sind möglich:
  • Minimale Zeilenanzahl
  • Extensions der Files die beim Durchsuchen von Ordnern berücksichtigt werden sollen
  • Ignorieren von Duplikaten die nur aus Keywords bestehen
  • Es sollen nur Zeilen gezählt werden die nicht nur aus einem Keyword bestehen (betrifft minimale Zeilenanzahl)
  • Liste der Keywords die ignoriert werden sollen - betrifft die beiden obigen Einstellungen (diese List wird in keywords.txt gespeichert)

v0.1.2
  • Das Programm kann jetzt auch für ganze Ordner angewendet werden. Dabei werden alle pas und dpr Files aus dem gewählten Ordner und allen Unterordnern zur Duplikatssuche herangezogen.
  • Die Duplikatsanzeige wurde korrigiert, es sollten jetzt immer die korrekten Zeilen angezeigt werden
  • Das Ergebnis kann nach Files gefiltert werden, dabei werden nur jene Duplikate angezeigt die in dem ausgewählten File vorkommen. Wenn zusätzlich noch "strict" aktiviert ist werden alle Sources aus anderen Files ebenfalls ausgeblendet.
  • Optional kann nun das gesamte File im Edit angezeigt werden, das Duplikat wird dabei markiert.
  • Während der Duplikatssuche wird jetzt ein Dialog mit Progressbar angezeigt. Im Moment verwende ich noch Application.ProcessMessages damit das UI upgedatet wird was sich natürlich auf die Laufzeit auswirkt. In Zukunft wird das per Multithreading gelöst.

TODO:
  • Einstellungsmöglichkeiten - Kommentare beim Preprocessing entfernen, Compiler-Schalter als Kommentar behandeln, ...
  • Subduplikate mit "Eltern"-Duplikat verknüpfen
  • Eventuell noch bessere Anpassung während des preprocessing um unterschiedliche Formatierungen noch besser auszugleichen
  • ...

Gruß, Motzi

angos 5. Mär 2008 07:48

Re: DoubleSource - Duplikate im Source finden v0.1
 
Moin Motzi,

hab DoubleSource und Dupecheck angeschaut. Zu den Verbesserungen hab ich in Unions Thread was geschreiben, da dort die Diskussion am regsten ist.


Anonsten auch hier: Sehr schönes einfaches Tool :thumb:

Union 5. Mär 2008 07:49

Re: DoubleSource - Duplikate im Source finden v0.1
 
Hallo Motzi,

funktioniert schon ziemlich gut, trotz des frühen Stadiums. Folgendes ist mir aufgefallen:
  • Die Sourcecode-Anzeige der einzelnen Duplikate im Fenster "Original Code" fängt eine Zeile zu spät an, obwohl die Zeilennummern im Treeview stimmen und die Anzeige des "normalisierten" Source ebenfalls.
  • Das mit den Subduplikaten ist etwas verwirrend.
  • Die Zahlen der kursiven Schrift werden abgeschnitten im Treeview (Null sieht dann aus wie ein "C")
  • Das Fenster läßt sich zu klein einstellen, es sollten Sizeconstraints gesetzt sein
  • Der Startbutton ist etwas riesig, ich habe den fast übersehen ;)
Die Unterstützung von Ordnern sollte unbedingt rein, denn sonst ist es in der Praxis nicht zu gebrauchen (es sei denn man kopiert ein komplettes Projekt in eine riesige Datei).

RavenIV 5. Mär 2008 08:07

Re: DoubleSource - Duplikate im Source finden v0.1
 
Wollst Du Dich nicht mit Union (DupeChecker) zusammentun und Eure Energie bündeln?

Warum soll jeder für sich seinen Kuchen backen, wenn man gemeinsam vielleicht besser zum Ziel kommt?
Werft Eure Ideen in einnen Topf, beratet darüber und teilt Euch die Arbeit auf.

taaktaak 5. Mär 2008 08:21

Re: DoubleSource - Duplikate im Source finden v0.1
 
Moin, Moin Motzi.
Für den bisherigen Zeitaufwand schon recht passabel. Die Optik ist noch optimierbar; z.B. verschwindet der Splitter, wenn man ihn nach rechts bewegt.
Zwei Controls wecken mein besonderes Interesse: Der "Spinbutton" (oder wie nennt sich das Teil) mit der diagonalen Teilung und die interessante Verbindung von TreeView und Grid. Wo finde ich diese Komponenten - die würde ich zu gern auch verwenden!

SirThornberry 5. Mär 2008 08:30

Re: DoubleSource - Duplikate im Source finden v0.1
 
Zitat:

Zitat von RavenIV
Wollst Du Dich nicht mit Union (DupeChecker) zusammentun und Eure Energie bündeln?

Warum soll jeder für sich seinen Kuchen backen, wenn man gemeinsam vielleicht besser zum Ziel kommt?
Werft Eure Ideen in einnen Topf, beratet darüber und teilt Euch die Arbeit auf.

wäre eine Variante. Allerdings ist es auch so das Konkurenz das Geschäft belebt. Jeder will den anderen überbieten und dadurch kommen meinst auch schneller Updates auf den Markt etc.

RavenIV 5. Mär 2008 08:40

Re: DoubleSource - Duplikate im Source finden v0.1
 
Zitat:

Zitat von SirThornberry
Zitat:

Zitat von RavenIV
Wollst Du Dich nicht mit Union (DupeChecker) zusammentun und Eure Energie bündeln?

Warum soll jeder für sich seinen Kuchen backen, wenn man gemeinsam vielleicht besser zum Ziel kommt?
Werft Eure Ideen in einnen Topf, beratet darüber und teilt Euch die Arbeit auf.

wäre eine Variante. Allerdings ist es auch so das Konkurenz das Geschäft belebt. Jeder will den anderen überbieten und dadurch kommen meinst auch schneller Updates auf den Markt etc.

Aber jeder muss das Rad neu erfinden.
Das geht zu Lasten der Entwicklungsgeschwindigkeit.

taaktaak 5. Mär 2008 09:02

Re: DoubleSource - Duplikate im Source finden v0.1
 
Das sind alles nachvollziehbare Argumente, aber es gibt sicherlich auch eine ganze Reihe von Delphi-Interessierten, die das alles nur so zum Spaß machen und die es reizt, selbstformulierte Ziel zu erreichen. Da ist es dann m. E. nicht schädlich, das Rad neu zu erfinden. Gerade in diesem Forum wird ja immer wieder (mit Recht) angemerkt, dass man durch einfaches Übernehmen von fremden Code schlecht oder auch gar nicht lernt.
Ich persönlich mache das nur so nebenbei und nur zum Spaß; und erfinde meine Räder auch immer wieder neu. Häufig kommen dabei unprofessionelle und schlechte Lösungen heraus - aber es sind dann Lösungen, die man selbst erfunden hat und die dann mit wachsenden Fähigkeiten optimiert werden können.

Motzi 5. Mär 2008 10:05

Re: DoubleSource - Duplikate im Source finden v0.1
 
Erstmal danke für die vielen Kommentare! :)
Zitat:

Zitat von Union
Die Sourcecode-Anzeige der einzelnen Duplikate im Fenster "Original Code" fängt eine Zeile zu spät an, obwohl die Zeilennummern im Treeview stimmen und die Anzeige des "normalisierten" Source ebenfalls.

Ist mir gestern nach schreiben des Beitrags auch aufgefallen - ist inzwischen gefixt.
Zitat:

Zitat von Union
Das mit den Subduplikaten ist etwas verwirrend.

Ich weiß.. ich werd versuchen noch eine bessere Beschreibung dazu zu finden...
Zitat:

Zitat von Union
Die Zahlen der kursiven Schrift werden abgeschnitten im Treeview (Null sieht dann aus wie ein "C")

Ok, ich mach die Spalten ein bisschen breiter.. :)
Zitat:

Zitat von Union
Das Fenster läßt sich zu klein einstellen, es sollten Sizeconstraints gesetzt sein

Gute Idee...
Zitat:

Zitat von Union
Der Startbutton ist etwas riesig, ich habe den fast übersehen ;)

Ich weiß... irgendeine Idee wo man ihn besser hin platzieren könnte? ;)
Zitat:

Zitat von Union
Die Unterstützung von Ordnern sollte unbedingt rein, denn sonst ist es in der Praxis nicht zu gebrauchen (es sei denn man kopiert ein komplettes Projekt in eine riesige Datei).

Schon klar, das Konzept wurde auch von Anfang an dafür designed, dass beliebig viele Files unterstützt werden. Ich bin im Moment nur am Überlegen was sinnvoller ist - einen Ordner auswählen und alle Files aus diesem Ordner + Unterordner durchsuchen, oder aber eine dpr-Datei laden und alle Files aus der uses-Liste nehmen...

Ich hab das Programm vor allem deswegen geschrieben weil es mich einerseits interessiert hat sowas selbst zu machen und ich es andererseits auch gerade sehr gut brauchen kann. Wir können in Zukunft aber auch gern gemeinsam an einer Version arbeiten! :)

Zitat:

Zitat von taaktaak
Für den bisherigen Zeitaufwand schon recht passabel. Die Optik ist noch optimierbar; z.B. verschwindet der Splitter, wenn man ihn nach rechts bewegt.

Wird korrigiert! :)
Zitat:

Zitat von taaktaak
Zwei Controls wecken mein besonderes Interesse: Der "Spinbutton" (oder wie nennt sich das Teil) mit der diagonalen Teilung und die interessante Verbindung von TreeView und Grid. Wo finde ich diese Komponenten - die würde ich zu gern auch verwenden!

Die erste Komponente ist "TJvSpinEdit" aus der JVCL und bei dem Treeview handelt es sich um den absolut genialen VirtualTreeview von Mike Lischke. Ich bin ein großer Fan dieser Komponente und verwende sie eigentlich in jedem meiner Projekte. Seit Delphi 2005 wird sie auch in der IDE eingesetzt.

Gruß, Motzi

taaktaak 5. Mär 2008 10:36

Re: DoubleSource - Duplikate im Source finden v0.1
 
Vorschlag zur optischen "Umsortierung":

FileEdit incl. Button in der Breite wie das geniale Grid, ebenso den Start-Button, das Anzeigefenster in voller Fensterhöhe darstellen

sakura 5. Mär 2008 10:40

Re: DoubleSource - Duplikate im Source finden v0.1
 
Zitat:

Zitat von Motzi
Schon klar, das Konzept wurde auch von Anfang an dafür designed, dass beliebig viele Files unterstützt werden. Ich bin im Moment nur am Überlegen was sinnvoller ist - einen Ordner auswählen und alle Files aus diesem Ordner + Unterordner durchsuchen, oder aber eine dpr-Datei laden und alle Files aus der uses-Liste nehmen...

Auf jeden Fall das Ordner-Prinzip. Es gibt große Projekte, welche sich auf mehrere Projektgruppen aufteilen (Team-Arbeiten), da ist ein DPR-Ansatz völlig unbrauchbar.

...:cat:...

himitsu 5. Mär 2008 11:02

Re: DoubleSource - Duplikate im Source finden v0.1
 
hmmm, hab 'ne .DPR ausgewählt (mein aktuelles Projekt bestehteh fast nur aus der),
auf Start geklickt und
Zitat:

---------------------------
Doublesource
---------------------------
List index out of bounds (0)
---------------------------
OK
---------------------------
sonst passiert ein garnichts :shock:

Motzi 5. Mär 2008 14:06

Re: DoubleSource - Duplikate im Source finden v0.1
 
Bis jetzt ist das Programm nur zur Verwendung mit pas-Files gedacht, eine Exception sollte natürlich trotzdem nicht auftreten! Werd das fixen!

hoika 5. Mär 2008 14:21

Re: DoubleSource - Duplikate im Source finden v0.1
 
Hallo,

zu Ordnern.
Ich würde gern beides haben ;)
Am anderen Programm hat mich gestört, das er nur Ordner unterstützt.

Jetzt stürzt das Program aber in einer Datei ab.
OK, nicht schön, aber naja.

Wenn ich genau eine Datei prüfen will,
muss ich einen Ordner anlegen und die Datei dort reinkopieren.


Heiko

himitsu 5. Mär 2008 15:47

Re: DoubleSource - Duplikate im Source finden v0.1
 
wie gesagt, das Projekt wo ich testen wollte besteht halt fast nur aus der DPR :?

Fehler(?):
"Preprocessed code" enthält 2 Zeilen mehr, als "Original code".
(je eine Zeile drüber und drunter)

soll das so sein?



vielleicht wäre s nicht shlcht auch mal die Zeilenübrüche zu ignorieren,
bzw. diese der Syntax entsprechend neu zu setzen?
ich schreib manchmal mehrere Befehle in eine Zeile. :oops:

Motzi 5. Mär 2008 15:54

Re: DoubleSource - Duplikate im Source finden v0.1
 
Zitat:

Zitat von himitsu
wie gesagt, das Projekt wo ich testen wollte besteht halt fast nur aus der DPR :?

Wie gesagt.. wir korrigiert - oder besser gesagt, ist bereits korrigiert, neue Version kommt vermutlich noch heute! :)

Zitat:

Zitat von himitsu
Fehler(?):
"Preprocessed code" enthält 2 Zeilen mehr, als "Original code".
(je eine Zeile drüber und drunter)

Wurde weiter oben bereits angemerkt. Es ist mir gestern selbst noch aufgefallen, dass das nicht immer ganz stimmt, allerdings leider erst nachdem ich das Programm hier gepostet hab. Ist aber inzwischen schon korrigiert!

Zitat:

Zitat von himitsu
vielleicht wäre s nicht shlcht auch mal die Zeilenübrüche zu ignorieren, bzw. diese der Syntax entsprechend neu zu setzen? ich schreib manchmal mehrere Befehle in eine Zeile. :oops:

Naja, das könnte man natürlich schon während des Preprocessings machen. Ist nur die Frage wie "intelligent" muss der Preprocessor dafür dann sein. Ich hab mir eh auch schonmal sowas in der Richtung gedacht, mal schaun....

Gruß, Motzi

Motzi 6. Mär 2008 00:24

Re: DoubleSource - Duplikate im Source finden v0.1.2
 
Neue Version ist online, diverse Bugs sind gefixt (falsche Zeilen im Duplikat, "List index out of bounds" Exception).
Details siehe erstes Posting.

Gruß, Motzi

toms 6. Mär 2008 03:02

Re: DoubleSource - Duplikate im Source finden v0.1.2
 
Hallo Motzi

Funktionniert schonmal ordentlich.

Solche Konstrukte bestehend aus begin, end, else etc. werden als Duplikate erkannt.
Sollte ignoriert werden.

Delphi-Quellcode:
END;
END
ELSE
BEGIN
PS: Fenster startet nicht zentriert

Motzi 6. Mär 2008 08:44

Re: DoubleSource - Duplikate im Source finden v0.1.2
 
Ist bereits in Planung! :) Dürfte vermutlich auch nicht allzu kompliziert werden, wird also wohl in den nächsten Tagen kommen...

Motzi 8. Mär 2008 19:12

Re: DoubleSource - Duplikate im Source finden v0.2.2
 
Neue Version ist fertig (siehe erstes Posting)!

Hab gerade einen Hardcore-Test gemacht:
Files: 947
Original lines: 292.041
Preprocessed lines: 152.783
Comparisons: 665.512.367
Duplicates: 544
Duplicates sources: 1675
Time: 52.250ms

Gruß, Motzi

toms 8. Mär 2008 19:32

Re: DoubleSource - Duplikate im Source finden v0.2.2
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Motzi

Einige Anmerkungen:

1. Kursive Zahlen werden z.T abgeschnitten (Siehe Bild)

2. Der Focus sollte im Progress Fenster auf dem Button sein.
So kann das Fenster mit Enter resp. per Leertaste direkt geschlossen werden.
Es stellt sich die Frage, ob ein Progress Fenster überhaupt nötig ist.
Eine Progressbar würde es doch auch tun.

3. Verwendest du einen Splitter zwischen SynEdit und VST? Dieser funktioniert nicht
richtig.

4. Mögliche Erweiterung: Bei Rechtsklick auf eine Unit im VST ein Kontextmenü anzeigen
mit der Möglichkeit, die Unit (in Delphi, Editor) zu öffnen.


Ansonsten :thumb:

Union 9. Mär 2008 15:46

Re: DoubleSource - Duplikate im Source finden v0.2.2
 
Zitat:

Zitat von Motzi
Hab gerade einen Hardcore-Test gemacht:
Files: 947
Original lines: 292.041
Preprocessed lines: 152.783
Comparisons: 665.512.367
Duplicates: 544
Duplicates sources: 1675
Time: 52.250ms

Hallo Motzi,

die neue Version ist schick, auch der Optionendialog gefällt mir sehr. Allerdings habe ich einen "Extrem" Hardcore-Test gemacht, woraufhin ich den Rechner neu starten musste (per Hardware!).

Der Hauptspeicherbedarf ging auf fast 400 MB und dann kam Out of Memory. Vorher kam eine Meldung "Creating datastructures" für mehrere Minuten, dann fing er an zu analysieren, aber nur bis ca. 10% des Progressbars.

Dateien: 5.260
Zeilen: 4.956.663

Motzi 9. Mär 2008 16:13

Re: DoubleSource - Duplikate im Source finden v0.2.2
 
Wow.. ok, so einen Hardcore-Test hab ich noch nicht gemacht! Es wundert mich aber auch nicht wirklich, dass da dann irgendwann der Speicher ausgeht! Pro "preprocessed line" wird ein 48-Byte großes Objekt erzeugt, und außerdem noch eine sortierte Liste ohne Duplikate in die alle Zeilen eingefügt werden und über die verkettete Listen erstellt werden (die TPreprocessedLine Instanzen werden untereinander verknüpft).
Und pro gefundenes Duplikat werden dann noch mal 1-2 TDuplicateSource Instanzen erzeugt (ebenfalls 48 Bytes groß) und eventuell auch noch eine TDuplicate Instanz (24 Bytes groß). Noch nicht berücksichtigt sind dabei diverse Listen die die Instanz-Zeiger enthalten und natürlich auch nicht die Strings (sowohl Original code als auch preprocessed code)...

Schafft es dein Programm diese Datenmengen zu bewältigen?

Union 9. Mär 2008 17:12

Re: DoubleSource - Duplikate im Source finden v0.2.2
 
Zitat:

Pro "preprocessed line" wird ein 48-Byte großes Objekt erzeugt, und außerdem noch eine sortierte Liste ohne Duplikate in die alle Zeilen eingefügt werden und über die verkettete Listen erstellt werden
Bei mir sind das 38-58 Byte, ich habe das mit einem Pointer-Array gemacht (18 Byte) und einer sortierten Liste die das Pointer-Array indiziert (20 Byte). Dann kommt noch eine nicht näher definierbare sortierte Hashliste dazu, die wiederum die Startposition eines Hashblocks indiziert (auch 20 Byte, Anzahl der Einträge ist abhängig von der Anzahl der unterscheidlichen Hashes).
Zitat:

Und pro gefundenes Duplikat werden dann noch mal 1-2 TDuplicateSource Instanzen erzeugt (ebenfalls 48 Bytes groß) und eventuell auch noch eine TDuplicate Instanz (24 Bytes groß).
Ich lege die Duplikate in Paaren ab (2 x (24 byte + String(DateiName)).
Zitat:

Noch nicht berücksichtigt sind dabei diverse Listen die die Instanz-Zeiger enthalten und natürlich auch nicht die Strings (sowohl Original code als auch preprocessed code)...
Den Sourcecode und den preprocesseden Code werfe ich nach dem Einlesen der Files weg. Wenn ich den anzeigen muss, mache ich das durch erneuten Zugriff auf die Dateien.
Zitat:

Schafft es dein Programm diese Datenmengen zu bewältigen?
In der Version die ich jetzt gerade am Testen bin, ja. Vorher gab es auch EOutOfMemory. Dieser Test ist aber auch wirklich schon hart an der Grenze: Er umfasst die komplette Program files\Borland Struktur, mit D7, D2006 und allen möglichen Fremdkomponenten drin. Aber es dauert dann auch ziemlich lange (47 Mrd. Vergleiche):
Code:
Files    Zeilen Duplikate Vergleiche     Dauer sek. Minuten Vergleiche/Sek.
5.260   4.956.663   39167   47.218.981.168  6803,02   113,38   6.940.885,25
Wie berechnest Du eigentlich die Laufzeit? Ich habe den Eindruck, es ist nur die Analyse Zeit. Bei mir fängt die Zählung an, sobald der User "Start" gedrückt hat.

Motzi 9. Mär 2008 18:00

Re: DoubleSource - Duplikate im Source finden v0.2.2
 
Zitat:

Zitat von Union
Zitat:

Pro "preprocessed line" wird ein 48-Byte großes Objekt erzeugt, und außerdem noch eine sortierte Liste ohne Duplikate in die alle Zeilen eingefügt werden und über die verkettete Listen erstellt werden
Bei mir sind das 38-58 Byte, ich habe das mit einem Pointer-Array gemacht (18 Byte) und einer sortierten Liste die das Pointer-Array indiziert (20 Byte). Dann kommt noch eine nicht näher definierbare sortierte Hashliste dazu, die wiederum die Startposition eines Hashblocks indiziert (auch 20 Byte, Anzahl der Einträge ist abhängig von der Anzahl der unterscheidlichen Hashes).
Zitat:

Und pro gefundenes Duplikat werden dann noch mal 1-2 TDuplicateSource Instanzen erzeugt (ebenfalls 48 Bytes groß) und eventuell auch noch eine TDuplicate Instanz (24 Bytes groß).
Ich lege die Duplikate in Paaren ab (2 x (24 byte + String(DateiName)).

Ja, wir haben unterschiedliche Systeme mit Duplikaten umzugehen. Ich hab zwei verschiedene Klassen: TDuplicate und TDuplicateSource, wobei ein Duplikat mehrere Sources haben kann. Wenn ein Duplikat gefunden wurde, dann wird geschaut ob es bereits eine TDuplicate-Instanz mit demselben preprocessed code gibt, ansonsten wird eine neue Instanz erzeugt.
Zitat:

Zitat:

Noch nicht berücksichtigt sind dabei diverse Listen die die Instanz-Zeiger enthalten und natürlich auch nicht die Strings (sowohl Original code als auch preprocessed code)...
Den Sourcecode und den preprocesseden Code werfe ich nach dem Einlesen der Files weg. Wenn ich den anzeigen muss, mache ich das durch erneuten Zugriff auf die Dateien.
Das wollte ich eigentlich vermeiden, wäre aber natürlich eine Möglichkeit..
Zitat:

Zitat:

Schafft es dein Programm diese Datenmengen zu bewältigen?
In der Version die ich jetzt gerade am Testen bin, ja. Vorher gab es auch EOutOfMemory. Dieser Test ist aber auch wirklich schon hart an der Grenze: Er umfasst die komplette Program files\Borland Struktur, mit D7, D2006 und allen möglichen Fremdkomponenten drin. Aber es dauert dann auch ziemlich lange (47 Mrd. Vergleiche):
Code:
Files    Zeilen Duplikate Vergleiche     Dauer sek. Minuten Vergleiche/Sek.
5.260   4.956.663   39167   47.218.981.168  6803,02   113,38   6.940.885,25

Nicht schlecht! Mal schaun ob ich eine Möglichkeit finde den Speicherbedarf ein wenig zu senken..
Zitat:

Wie berechnest Du eigentlich die Laufzeit? Ich habe den Eindruck, es ist nur die Analyse Zeit. Bei mir fängt die Zählung an, sobald der User "Start" gedrückt hat.
Die ProgressBar wird im Moment aber nur für Analyse benutzt, es wird aber die gesamte Zeit genommen - Startzeit = vor dem Einlesen der Dateien, Endzeit = nach dem finalisieren der Ergebnisse (es ist nur eine ganz simple Messung per GetTickCount).

Gruß, Motzi

Motzi 11. Mär 2008 00:14

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Eine neue Version mit einigen kleinen Änderungen ist online - siehe erstes Posting!

Union 11. Mär 2008 03:35

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Super, das ist ja jetzt 3 Mal so schnell wie vorher. Allerdings ist die Anzahl der Duplikate knapp 3 Mal so groß wie bei der vorherigen Version, bei den gleichen Testfiles.

Was mir noch fehlt ist eine Pfadanzeige der Dateien. Da Du ja standardmäßig alle Unterverzeichnisse durchsuchst, findet man die Dateien sonst schwer.

Bei der Anzeige der Sourcen nebeneinander wird beim Öffnen des Fensters nichst angezeigt (Comboboxen sind nicht vorbelegt). Dort sollten dann vielleicht die ersten beiden Duplikate voreingestellt sein. Oder Du läßt in dem VST eine Mehrfachauswahl der Duplikate zu und zeigst dann die selektierten an.

Motzi 11. Mär 2008 09:18

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Zitat:

Zitat von Union
Super, das ist ja jetzt 3 Mal so schnell wie vorher.

Danke, deine letzte Version ist aber auch echt nicht schlecht! :) Einen nicht zu verachtenden Teil dieser Geschwindigkeitssteigerung macht der Thread, da jetzt keine ständigen Application.ProcessMessages Aufrufe mehr notwendig sind! Auf diese Weise könntest du sicher auch noch einiges rausholen.
Zitat:

Allerdings ist die Anzahl der Duplikate knapp 3 Mal so groß wie bei der vorherigen Version, bei den gleichen Testfiles.
Wie meinst du das? Bei meinen Tests haben die neue und die alte Version die komplett gleichen Ergebnisse geliefert (außer bei den Comparisons - die fallen bei der neuen Version durch ein paar Optimierungen niedriger aus).

Zitat:

Was mir noch fehlt ist eine Pfadanzeige der Dateien. Da Du ja standardmäßig alle Unterverzeichnisse durchsuchst, findet man die Dateien sonst schwer.
Ja, nur weiß ich noch nicht wie bzw. wo, da die Pfade ja auch recht lang ausfallen können...

Zitat:

Bei der Anzeige der Sourcen nebeneinander wird beim Öffnen des Fensters nichst angezeigt (Comboboxen sind nicht vorbelegt). Dort sollten dann vielleicht die ersten beiden Duplikate voreingestellt sein. Oder Du läßt in dem VST eine Mehrfachauswahl der Duplikate zu und zeigst dann die selektierten an.
Ja, sowas in der Richtung hab ich mir auch schon gedacht und werd ich wohl in einer der nächsten Versionen einbauen.

Gruß, Motzi

Union 11. Mär 2008 13:20

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Ich habe heute Nacht nochmal den Monstertest gefahren. Diesmal wurde er zwar fertig, hat aber mit 1,7 GB Hauptspeicherverbrauch meinen Virenscanner Service zum Absturz gebracht. Die "Fertig" Meldung mit Anzahl und Dauer kam noch, aber dann auch Out of Memory.
Code:
Dateien Zeilen   Duplikate Vergleiche    Dauer   Minuten Vergleiche/Sek.
5.260   4.952.663 N/A      20.142.551.061 3.084,94 51,42   6.529.316,96
Du solltest Dir mal anschauen, wie Du den Speicher anforderst. Teilweise merkt man das richtig, dass er in Intervallen realloziert und anhält.

Wegen des Threads hatte ich mir auch schon überlegt. Man kann ja auch Update statt Prozessmessages einsetzen. Und ob das so viel bringt, weil man ja ständig synchronize für die VCL-Zugriffe aufrufen muss? Aber ich hatte eine andere Idee, nämlich die Analyse selber in mehreren Threads parallel laufen zu lassen, die sich die Arbeit teilen (z.B. 5 Threads, jeder nimmt sich 25% der Dateien nach der Vorbereitung).

Motzi 11. Mär 2008 13:38

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Zitat:

Zitat von Union
Du solltest Dir mal anschauen, wie Du den Speicher anforderst. Teilweise merkt man das richtig, dass er in Intervallen realloziert und anhält.

Ich alloziere den Speicher nicht direkt, sondern erzeuge einfach nur Instanzen von Objekten - den Rest überlass ich dem Delphi MemoryManager. Ich könnte mir aber überlegen ob es sinnvoll wäre gleich ganze Objekt-Pools anzulegen...
Zitat:

Wegen des Threads hatte ich mir auch schon überlegt. Man kann ja auch Update statt Prozessmessages einsetzen. Und ob das so viel bringt, weil man ja ständig synchronize für die VCL-Zugriffe aufrufen muss? Aber ich hatte eine andere Idee, nämlich die Analyse selber in mehreren Threads parallel laufen zu lassen, die sich die Arbeit teilen (z.B. 5 Threads, jeder nimmt sich 25% der Dateien nach der Vorbereitung).
Nein, nur "Update" funktioniert auch nicht, da dann zB der Cancel-Button nicht mehr gedrückt werden kann. Und ich verwende kein Synchronize! ;) Ich schicke stattdessen per PostMessage Nachrichten an das Fenster - so wird der Thread nicht unnötig lange blockiert.
Mehrere Threads zu Erzeugen die sich die Arbeit teilen wäre natürlich eine Idee, fragt sich nur ob das wirklich viel bringt und den ganzen Aufwand rechtfertigt.

Gruß, Motzi

hoika 11. Mär 2008 13:42

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Hallo,

wie gross ist denn ein Objekt bei dir ?
Schon mal FastMM4 ausprobiert ?


Heiko

toms 11. Mär 2008 13:47

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Zitat:

Zitat von Union
Ich habe heute Nacht nochmal den Monstertest gefahren. Diesmal wurde er zwar fertig, hat aber mit 1,7 GB Hauptspeicherverbrauch meinen Virenscanner Service zum Absturz gebracht. Die "Fertig" Meldung mit Anzahl und Dauer kam noch, aber dann auch Out of Memory.
Code:
Dateien Zeilen   Duplikate Vergleiche    Dauer   Minuten Vergleiche/Sek.
5.260   4.952.663 N/A      20.142.551.061 3.084,94 51,42   6.529.316,96
Du solltest Dir mal anschauen, wie Du den Speicher anforderst. Teilweise merkt man das richtig, dass er in Intervallen realloziert und anhält.

Macht es überhaupt Sinn, soviele Dateien aufs Mal zu analysieren?

Motzi 11. Mär 2008 13:56

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Zitat:

Zitat von hoika
wie gross ist denn ein Objekt bei dir ?
Schon mal FastMM4 ausprobiert ?

Hab ich weiter ob irgendwo geschrieben, hat sich inzwischen aber ein bisschen reduziert. Ich verwende Delphi 2006, ich glaub seit Delphi 2005 hat Borland den eigenen MemoryManager durch den von Fast4MM ersetzt. Ich verwende ihn also bereits. ;)
Zitat:

Zitat von toms
Macht es überhaupt Sinn, soviele Dateien aufs Mal zu analysieren?

Das ist natürlich fraglich, aber es ist trotzdem ganz interessant zu wissen wie das Programm mit solch großen Datenmengen umgeht! Denn ausgehend davon kann man sich natürlich weitere Maßnahmen überlegen die sich auch bei kleineren Analysen positiv auswirken können. :)

Motzi 12. Mär 2008 12:09

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Ich hab gestern ein paar Tests mit Objekt-Pools gemacht -> bringt eigentlich nichts!

Konkret hab ich die NewInstance-Methode von TObject so überschrieben, dass der Speicherbereich für zB 10.000 Instanzen reserviert wird. Wenn nun ein Objekt erzeugt wird und noch Platz in diesem Block frei ist wird dem Objekt dieser Platz zugeordnet. Ist kein Platz mehr frei wird ein neuer Block/Pool angelegt. Dadurch wird die Anzahl der Speicherreservierungen drastisch reduziert.
Ich hab dann in einer Schleife 10.000.000 Instanzen erzeugt, einmal normale Objekte, einmal von meiner Pool-Klasse. Ergebnis: es ist eigentlich kein Unterschied messbar! Möglicherweise ist die Pool-Variante geringfügig schneller, aber wenn die Gesamtlaufzeit ~2 Sekunden dauert machen ein paar ms auch keinen Unterschied mehr.

Ich hatte gestern aber eine andere Idee mit der ich den Speicherverbrauch geringfügig senken und die Laufzeit um das bis zu 6-fache beschleunigen konnte.

Gruß, Motzi

hoika 12. Mär 2008 12:35

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Hallo,

jo ist fix;)
ein paar Anmerkungen / Bitten.

1. Folder ohne Unterverzeichnisse, also nur die Dateien
des ausgewählten Folders

2. Pfadangaben der Dateien
Vielleicht sollte man die in eine zusätzlich Status-Anzeige packen ?
Also den kompletten Pfad der gerade ausgewählten Datei anzeigen.

3. Klicke ich auf den RootNode (Length ...),
zeigt er rechts den (welchen ?) Quellcode in Grossbuchstaben an,
ist das gewollt ?

4. Schutzverletzung bei folgendem

- 1 Verzeichnis komplett analysieren
- Length anklicken -> das Compare (Toolbar ganz rechts ist aktiviert)
- 1 Verzeichnis analysieren, vorher abbrechen
- Toolbar-Button ist immer noch aktiv
Klicken -> Plautz ;)

5. Compare
wenn es nur 2 Dateien sind, könnte man die in je
einen der ComboBoxen eintragen


Ansonsten nettes kleines Tool


Heiko

Union 12. Mär 2008 13:09

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Zitat:

Zitat von toms
Zitat:

Zitat von Union
Ich habe heute Nacht nochmal den Monstertest gefahren. Diesmal wurde er zwar fertig, hat aber mit 1,7 GB Hauptspeicherverbrauch meinen Virenscanner Service zum Absturz gebracht. Die "Fertig" Meldung mit Anzahl und Dauer kam noch, aber dann auch Out of Memory.
Code:
Dateien Zeilen   Duplikate Vergleiche    Dauer   Minuten Vergleiche/Sek.
5.260   4.952.663 N/A      20.142.551.061 3.084,94 51,42   6.529.316,96
Du solltest Dir mal anschauen, wie Du den Speicher anforderst. Teilweise merkt man das richtig, dass er in Intervallen realloziert und anhält.

Macht es überhaupt Sinn, soviele Dateien aufs Mal zu analysieren?

Ja, duchaus, sonst würde ich es nicht machen. Ausserdem kann man ja auch mehrere Teilprojekte zusammen analysieren, um dann bestimmte Dinge in gemeinsame Module zu verlagern, was dann den Wartungsaufwand reduziert.

Motzi 12. Mär 2008 16:30

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Zitat:

Zitat von hoika
jo ist fix;)
ein paar Anmerkungen / Bitten.

Danke, aber die neue Version ist wie gesagt nochmal um einiges schneller..! ;)

Zitat:

1. Folder ohne Unterverzeichnisse, also nur die Dateien des ausgewählten Folders
Ist vorgemerkt!

Zitat:

2. Pfadangaben der Dateien
Vielleicht sollte man die in eine zusätzlich Status-Anzeige packen ? Also den kompletten Pfad der gerade ausgewählten Datei anzeigen.
War ohnehin geplant, muss mir nur noch überlegen wie/wo, da komplette Pfade doch recht lang werden können.

Zitat:

3. Klicke ich auf den RootNode (Length ...), zeigt er rechts den (welchen ?) Quellcode in Grossbuchstaben an, ist das gewollt ?
Das ist gewollt. Das ist der preprocessed code - alle Vorkommen dieses Duplikats (die Kindknoten) haben denselben preprocessed code, auch wenn der Original code (den du siehst wenn du auf einen der Kindknoten klickst) ein bisschen anders ausschaut.

Zitat:

4. Schutzverletzung bei folgendem
- 1 Verzeichnis komplett analysieren
- Length anklicken -> das Compare (Toolbar ganz rechts ist aktiviert)
- 1 Verzeichnis analysieren, vorher abbrechen
- Toolbar-Button ist immer noch aktiv
Klicken -> Plautz ;)
Danke, wird gefixt!

Zitat:

5. Compare
wenn es nur 2 Dateien sind, könnte man die in je einen der ComboBoxen eintragen
Jap, so was in der Richtung ist bereits geplant! :)

Gruß, Motzi

Motzi 15. Mär 2008 18:18

Re: DoubleSource - Duplikate im Source finden v0.3.1
 
Neue Version ist online - siehe erstes Posting.

Hardcore-Test-Ergebnisse folgen noch...

Gruß, Motzi


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz