2009-05-22 4 views
24

Ich habe ein paar große (~ 600.000 Zeilen Code) Delphi-Projekte. Sie enthalten einige benutzerdefinierte Komponenten, die unser Team entwickelt hat.Delphi-Code-Abschlussleistung

Oft, wenn ich Code-Vervollständigung mit Strg + Leerzeichen oder nur durch Drücken von "." Aufrufen, blockiert die IDE und denkt sehr lange hart. Manchmal kann die Verzögerung eine volle Minute oder mehr betragen. Manchmal erscheint es sofort mit Vorschlägen.

Welche Faktoren beeinflussen die Leistung von Intellisense in Delphi? Kann ich diese Leistung irgendwie verbessern?

Meine bisher beste Lösung ist, die automatische Vervollständigung abzuschalten und Strg + Leerzeichen zu verwenden, wenn ich eine Minute oder so ruhig meditieren muss.

Ich kann nicht helfen, aber erwähnen, dass VS2005, VS2008 und XCode scheinen alle praktisch sofortiges Intellisense-Feedback zu geben (obwohl ich es noch nie bei einem so großen Projekt ausprobiert habe).

Als Alternative I've offered this suggestion.

+0

das interessiert mich sehr. Ich erinnere mich, dass die. oder Strg + Space hat vor einigen Jahren perfekt funktioniert. Ich denke, es war Delphi 7, sicherlich Delphi 5, in dem die Verzögerung kaum zu erkennen war. Ich liebte es. Aber dann kam die D2005 und da hatte ich schreckliche Probleme mit dieser Funktion. Was hat sich geändert? Warum haben sie es geändert? –

+2

Gute Frage.Für größere Projekte wurde es fast unbrauchbar - widerwillig habe ich es abgeschaltet und es ist eine Schande, weil die Online-Hilfe bittend und ablenkend und umständlich ist - es geht normalerweise schneller/direkter zu Google, um ehrlich zu helfen. Ich würde gerne wieder Strg-Space verwenden können, es war sehr nützlich. – robsoft

Antwort

7

Stellen Sie sicher, dass Sie alle Einheiten (*), die von Ihrem Projekt verwendet werden, explizit in dpr einfügen.
Verlassen Sie sich nicht auf den Suchpfad, um eine von einer anderen Einheit aufgerufene Einheit zu finden, fügen Sie sie zu dpr hinzu. Der dpr wird viel länger sein, aber alle kompilierungsbezogenen Dinge werden schneller sein, einschließlich Code-Einsicht.

(*) nicht die Einheiten der installierten Komponenten.

+0

Das scheint mir ziemlich zu helfen ... ctrl + f12 bringt eine unansehnliche Liste von Einheiten, die nicht projektspezifisch sind ... aber damit kann ich leben. – JosephStyons

+1

Neben Suchpfaden innerhalb des Projekts kommen die anderen schrecklichen Verzögerungen hinzu, wenn Sie einen riesigen Bibliothekspfad haben. –

+0

Was mir im ähnlichen Fall sehr geholfen hat - ** unbenutzte Einheiten ** aus "Verwendungen" zu entfernen und Einheiten, wo immer möglich von "Schnittstelle" zu "Implementierung" zu bewegen. Die Kompilierungszeit für das 346kLoc-Projekt sank von 70 Sekunden auf 8,8 Sekunden. Dies hat die Code Completion direkt beeinflusst. Jetzt ist es fast sofort. – Kromster

3

Dies ist ein langjähriges Problem mit Delphi, und ich musste auf automatische Abschaltung zurückgreifen. Nachdem ich eine Weile so gearbeitet hatte, war ich sehr glücklich damit. Selbst wenn es nur einen Bruchteil einer Sekunde dauert, war die IDE-Verzögerung meine Eingabe irritierend und unterbrach meinen Fluss. Viel schöner mit den Automaten, IMO.

+0

kann nicht damit einverstanden sein, 'die Automatik' nicht zu verwenden ... –

+1

MasterPeter: jeder für sich, fürchte ich. Wenn ich weiß, was ich will, tippe ich viel schneller, als eine Pause zu machen und dann zu picken. Wenn ich nicht weiß, was ich will, weiß ich es sicher und kann durchaus Strg + Leertaste drücken, um Hilfe zu bekommen. – dwc

+0

Bei kleinen Projekten habe ich festgestellt, dass es hervorragend ist; Wenn ich erst einmal gelernt habe, wie es funktioniert, kann ich die Codevorlagen und die automatische Vervollständigung sehr gut nutzen. Umso frustrierender ist die schlechte Leistung in einem großen Projekt. – JosephStyons

14

Delphi Code Insight ruft die Compiler-DLL auf, um eine benutzerdefinierte Kompilierung durchzuführen, wenn der Benutzer Code Insight anfordert (Strg + Leertaste, '.', Usw.). Diese benutzerdefinierte Kompilierung führt einen Build in der Einheit durch und überspringt Codegen, Verknüpfen usw., bis sie Ihren aktuellen Offset im Dateipuffer erreicht. In diesem Sinne wird die Einheitenliste, die der Compiler sieht, bevor er an Ihre aktuelle Position gelangt, einen großen Faktor bei der Bestimmung der Geschwindigkeit der Code-Einblick-Operation spielen. Es kann eine Einheit (oder mehrere Einheiten) geben, die eine starke Dateisystemabhängigkeit usw. verursachen. Es ist durchaus möglich, dass die uses-Klausel neu angeordnet wird, die uses-Klausel in mehreren Dateien umgestaltet wird oder Einheiten in der uses-Klausel entfernt werden. • Die für die Kompilierung der aktuellen Einheit erforderliche Komponente kann die Leistung verbessern. Darüber hinaus kann das Verwenden von Paketen oder das Verkürzen des Einheitensuchpfads die CI-Antwortzeit verbessern.

+1

Interessante Antwort, danke! Etwas zum Nachdenken da. :-) – robsoft

+1

Das ist in der Tat interessant ... aber ich sollte darauf hinweisen, dass ein FULL BUILD der Anwendung (mit unserem berühmten schnellen Compiler, yay) ungefähr 1 Minute dauert ... und ich habe Code-Vervollständigung länger dauern lassen . – JosephStyons

+0

Wenn Sie eine vollständige Neuerstellung durchführen (wodurch .dcus auf Festplatte erstellt wird), hilft das der CI-Leistung? Verwenden Sie auch Pakete oder ist es eine monolithische .exe? –

4

Ich weiß nicht, welche Version Sie verwenden, aber viel schneller Code-Vervollständigung ist eines der Dinge, die ich am meisten über Delphi wie 2009.

+0

Das ist gut zu wissen. Ich bin derzeit auf d2007 – JosephStyons

0

Beziehen Sie die Quellen-Verzeichnisse für Ihre Teams individuelle Komponenten in sein der Bibliothekspfad? Es wäre interessant, den Geschwindigkeitsunterschied zu sehen, wenn sich nur die DCU-Dateien der Komponenten im Bibliothekspfad befinden, im Gegensatz zu den Quelldateien.

+0

Ja, die Quellpfade für die benutzerdefinierten Komponenten sind da. Ich werde den DCU-Ansatz versuchen – JosephStyons

+0

Ich versuchte nur die DCU-Pfade, und es schien nicht die Leistung von Intellisense zu ändern. – JosephStyons

0

Ich bin gerade auf dieses Problem selbst gestoßen, ich habe es behoben, indem ich eine tote Netzwerkverbindung aus dem Pfad meiner Umgebungsbibliothek entfernt habe. Mein Problem wurde zu 100% gelöst.