Pourquoi la vitesse de compilation de Delphi se dégrade-t-elle plus il est ouvert, et que puis-je faire à ce sujet?

depuis plus d'une décennie, mon entreprise réalise un grand projet sur Delphi. Notre base de codes s'est développée au fil des ans et compte aujourd'hui environ 4 millions de lignes de code. La vitesse de Compilation devient un problème. Nous avons passé du temps à trier les unités de référence circulaire (une cause connue de compilation lente) et examiné tous les aspects de la configuration. Il arrive à un point où nous ne pouvons pas l'améliorer davantage matériellement avec ce que nous pouvons contrôler.

en ce moment, sur un PC à la pointe de la technologie avec 4 cœurs tournant sous Windows XP SP3 et Delphi 2006, démarrer Delphi frais et faire une construction complète, il faut ~40 secondes. Ensuite, si nous faisons une autre compilation complète dans la même session Delphi immédiatement, cela prendra 1m 40s. Refaites une autre construction, ça va empirer. Ainsi de suite et ainsi de suite.

(nous sommes bien conscients que Windows cache des fichiers et que cela a un grand impact sur la vitesse de compilation. Les chiffres ci-dessus sont basés sur le fait que les fichiers sont mis en cache. Nous avons mis en place un tel scénario: Delphi compilera le projet une fois, le terminera et commencera une nouvelle session Delphi. Alors que 40 secondes ne voit pas d'être lent, c'est seulement parce que les fichiers sont mis en cache par Windows. Et nous le faisons afin d'avoir une comparaison de pomme à pomme.)

ce qui nous intrigue, c'est pourquoi la vitesse de compilation s'aggrave. (Nous avons observé dans le passé, le ralentissement a été pire si le projet avait beaucoup d'unité circulaire référencement.) Si nous terminons Delphi et commençons un nouveau session, le temps de compilation reviendra à 40 secondes. Une chose encore plus intéressante que nous avons observé est, nous pouvons atteindre la même vitesse "amélioration" en cliquant sur le bouton "Annuler" pour annuler la compilation et ensuite faire la compilation complète tout de suite. Le temps de Compilation reviendra également à 40secs.

il nous semble que la mémoire cache de la dépendance des unités de Delphi N'est pas aussi efficace que de la construire à partir de zéro et qu'elle empire avec le temps. Et il apparaît aussi le bouton Annuler d'une façon ou d'une autre efface cette cache. Ce que nous pensons, c'est que si nous pouvons puiser dans le sous-système Delphi IDE qui fait cette compensation, nous pouvons toujours maintenir la vitesse de compilation à sa performance maximale. Mais nous ne savons pas comment.

est-ce que quelqu'un sait ce qu'on peut faire?

nous utilisons toujours Delphi 2006 car nous n'avons pas encore trouvé un moyen réalisable de transférer notre grand projet à Unicode. J'ai lu sur les forums que le dernier Delphi XE montre un problème similaire de vitesse de compilation avec Unité de référence circulaire. Quelqu'un sait si Delphi XE a réglé le problème?

p. S. Nous sommes également conscients que diviser le projet en paquets runtime peut réduire le temps de compilation. Mais pour des raisons de déploiement et d'administration, Nous essayons d'éviter d'utiliser des paquets runtime.

36
demandé sur Rob Kennedy 2011-07-05 08:35:54

6 réponses

Si vous construisez votre application, voici quelques astuces pour accélérer le processus:

  • Effacer tout *.dcu avant de la construire ( del *.dcu /s );
  • Exécuter le défragmenteur de bon sur votre disque dur correspondant;
  • mettez la plupart de vos fichiers sources dans le même répertoire, et essayez de laisser les chemins de L'IDE et de la bibliothèque de projet aussi courts que possible, avec les entrées les plus utilisées en premier;
  • Install DelphiSpeedUp .

Delphi 2007 devrait compiler plus rapidement que Delphi 2006.

Delphi 2009/2010 / XE serait probablement plus lent: de l'expérience utilisateur, la mise en œuvre des génériques et de la nouvelle RTTI a rendu le processus de compilation plus complexe, et la mise en œuvre réelle a été jugée plus lente, par exemple qu'avec Delphi 2007.

mise à jour:

avez-vous essayé d'activer le Projectclearitcacheitem entrée de menu cachée?

Clear Unit Cache entry

j'ai cette entrée activée soit par le CnPack, soit par DDevExtension (Je ne sais pas qui fait cela, probablement plus tard). Cela pourrait être utilisé pour vider le cache interne de l'unité.

23
répondu Arnaud Bouchez 2011-07-05 09:14:18

la dégradation graduelle des performances pourrait être due à une fuite de mémoire ou à un autre bogue dans le compilateur. Dieu sait que D2005 et D2006 en ont eu assez! Si vous ne pouvez pas mettre à jour vers une version Unicode de Delphi, vous devriez au moins mettre à jour vers D2007 (qui je crois est toujours disponible à partir D'Amarcadero) pour une meilleure stabilité.

aussi, comme Robert Frank l'a mentionné dans un commentaire, découvrez les outils D'Andreas Hausladen. Il y a quelques jours, il a sorti un patch. cela améliore considérablement la vitesse de compilation. Malheureusement, cette fonctionnalité spécifique n'est apparemment que pour D2009 et plus tard, mais beaucoup de ses corrections aident à accélérer diverses choses, y compris le compilateur.

18
répondu Mason Wheeler 2011-07-05 05:50:59

cela vaut la peine D'essayer Delphispeeedup DE Andreas Hausladen, mais cela n'aidera que les performances IDE plutôt que la compilation telle que je la comprends.

l'autre idée que personne n'a encore suggérée est d'utiliser des disques à haute spécification.

je recommande L'utilisation de Windows 7 64 bits avec une grande quantité de RAM pour la meilleure performance de mise en cache de fichiers.

soyez simplement reconnaissants que votre projet ne soit pas écrit en C++!

7
répondu David Heffernan 2011-07-05 06:49:10

envisagez de construire des paquets runtime en interne, puis de construire des exécutables monolithiques lors de l'envoi de code à un département QA ou de la distribution de votre application.

cela nécessite un entretien supplémentaire, mais les augmentations spectaculaires des temps de construction en valent la peine IMO.

nous avons un projet de 2,4 MLOC avec environ 40-50 plus petites, les applications de soutien. Lorsqu'il est compilé par rapport à un groupe de paquets runtime, le projet construit en lignes D'environ 500K et construit environ 6 fois plus rapide (15 secondes contre 90 secondes). Beaucoup de petites applications compilent en une seconde ou moins parce qu'une grande partie du code packagé est partagée.

vous devez être sûr de tester l'exécutable monolithique, pas l'exécutable empaqueté. Mais généralement vous ne devriez pas voir trop beaucoup de différences de comportement si vous suivez de bonnes pratiques de codage.

1
répondu David Robb 2011-07-05 22:24:58

Ce question quelques conseils pour obtenir la meilleure vitesse de compilation. Éviter les références circulaires et détecter les unités inutilisées (avec des CnWizards) sont d'une plus grande efficacité.

0
répondu Fabricio Araujo 2017-05-23 12:01:17

avez-vous essayé de compiler le code en utilisant une ligne de commande script?

est-ce que la recompilation depuis la ligne de commande a rendu le processus stable sur 40 secondes?

exécuter à partir du cmd "dcc32.exe" pour voir l'usage.

mise à jour: Je ne peux pas vérifier maintenant, cependant, vous devriez essayer de compiler en ligne de commande et voir si vous essayez d'exécuter à partir de l'ide, l'ide doit pas recompiler, et vous permet d'exécuter avec debug.

0
répondu none 2011-07-06 10:15:44