38 votes

Comment déterminer l'ordre de liaison le plus rapide?

J'ai environ 50 différentes bibliothèques statiques étant lié dans mon projet de c++ et de la liaison prend en moyenne de 70 ans.

J'ai trouvé que déplacer avec l'ordre de liaison de la bibliothèque de changements cette fois. C'est prévu je suppose que si l'éditeur de liens n'avez pas à garder à la recherche pour un ensemble de symboles tout au long de l'ensemble de la table des symboles, il a construit jusqu'à ce point.

Je suppose que je pourrais utiliser "nm" pour obtenir un graphe de dépendance entre les bibliothèques statiques. Toutefois, cela ne ferait que me donner un "corriger" l'ordre des liens. Quels seraient les facteurs impliqués dans l'obtention des le lien le plus rapide de l'ordre?

J'ai le sentiment qu'il aurait quelque chose à voir avec le mentionné ci-dessus graphe de dépendance par l'obtention d'une traversée qui serait tenter de minimiser une certaine quantité, mais je ne suis vraiment pas sûr.

Toute aide serait appréciée.

Je suis principalement à l'aide du compilateur intel et aussi le compilateur gcc chaque maintenant et puis. Deux d'entre eux semblent être à l'aide de l'éditeur de liens GNU ld lorsque je vérifie avec le haut. Espérons que cela aide...

Donc, juste pour clarifier un peu plus sur ce que je suis en train de demander, je sais déjà comment obtenir un 1-passer la commande à partir d'un ensemble de bibliothèques statiques. J'avais écrit ce script moi-même, mais aussi de l'Olaf réponse ci-dessous indique, il y a bien connu les outils pour ce faire.

Ma question est, j'ai déjà deux 1 passe-lien de rangements dont l'un tourne à ~85 ans et l'autre s'exécute dans ~70. Donc, clairement, il y a encore un peu plus d'optimisation que l'on peut faire dans un délai de 1-passer les commandes.

7voto

Neil Points 1235

Comme une alternative, pourquoi ne pas essayer de compiler vos bibliothèques bibliothèques partagées plutôt que statiques des bibliothèques?

Là où je travaille, un grand lien entre les projets de temps était d'environ 6 minutes, ce fut pour seulement 5 bibliothèques!

Ma solution a été (pour une version de débogage), créer .donc les fichiers par ordre alphabétique (libA.donc, libB.donc, etc) de sorte que chaque indivdual lien n'était pas trop long, et le dernier lien a été beaucoup plus courte, parce que tous les (partielle) de liaison avait été fait auparavant. La version a été construit dans l'ancienne parce qu'il y avait une perception de "danger" avec ma nouvelle méthode.

J'ai réussi à obtenir un 1 module de compilation/lien du cycle vers le bas à partir de 6 minutes 10 secondes à l'aide de cette méthode.

6voto

Olaf Dietsche Points 35264

Dans le passé, l'ordre des objets dans une bibliothèque statique était important. Vous pouvez trier les objets en conséquence avec:

$ lorder * .o | tsort

Vous pourriez peut-être faire la même chose avec vos principaux objets et bibliothèques, par exemple lorder main.o test.o libsome.a libthing.a | tsort . Regarde l' homme en ordre

3voto

MSN Points 30386

Basé sur les informations de comparer ld or, la vitesse de dl est affectée par la taille de la table des symboles est. Comme le symbole de la table se développe à partir d'objet de traitement des fichiers, le ralentissement de l'étape de liaison devient. Donc, si vous avez deux 1-reliant les ordres, celui qui met la librairie avec un plus grand nombre de symboles afin de corriger plus tard dans cet ordre devraient être en lien plus rapide. Vous devriez être en mesure de modifier un tri topologique d'inclure le symbole de compter dans l'ordre des critères.

3voto

Brian Vandenberg Points 1042

Vous parlez d'un passage de la commande basée sur l'ordre des objets et des bibliothèques, mais si il fait une recherche dans une bibliothèque statique, il ne peut pas garantir quoi que ce soit dans la bibliothèque statique sera dans un ordre particulier et en fait, vous ne pouvez contrôler que par commande de la bibliothèque statique d'une certaine manière lorsque vous ar il.

En outre, sans la compréhension de la façon dont l'éditeur de liens qui rend l'utilisation de la statique de la bibliothèque(s), les deux meilleures hypothèses qui pourrait en être faite est:

  1. Il crée une table de hachage de symboles qui référence l'objet(s) qui fournissent ou besoin d'eux; si c'est un précis de l'assomption, le meilleur de la limite inférieure, vous pouvez obtenir sur une bibliothèque statique est le temps qu'il faut pour remplir une telle table de hachage et en lire.
  2. Aveuglément lit à partir de l'archive en fonction de l'ordre donné dans les archives de l'index.

Comme une tentative de trouver une borne inférieure optimal de votre lien de temps, tentez de lier l'ensemble ou un sous-ensemble des objets dans l'archive(s) comme un objet relogeable; pour le sous-ensemble, si possible, d'identifier tous les objets liés dans.

La page de man pour lorder indique que vous pouvez obtenir les mêmes résultats avec des ar ts <archive> ... ce qui permet d'imprimer la liste ordonnée pour vous. La page de man pour ar , ce qui semble indiquer exécutant ar avec l' s drapeau de stocker automatiquement optimale de la commande dans les archives de l'index.

En outre, il pourrait être cyclique des dépendances, mais si vous avez déjà testé avec tsort vous devriez ai été mis au courant de cela déjà.

Enfin, je vous laisse avec un dernier morceau de l'information. Ce que vous voulez, c'est quelque chose qui peut résoudre un problème NP-complet de problème. Bonne chance.


J'ai été l'exécution de certaines calendrier des tests de la dernière peu de temps pour une construction, je travail sur; j'ai ajouter l' s drapeau pour ma ARFLAGS , pour voir ce que c'est.

Dans l'ensemble, il semble avoir augmenté mon temps de construction, mais je crois qu'il ya une explication logique pour expliquer pourquoi:

  • La plupart des fichiers exécutables, les objets partagés de ne pas utiliser la liaison statique
  • C'est la construction de PIC et de la non-PIC versions de chaque bibliothèque statique

Si nous avons été faire beaucoup plus lourd utilisation des bibliothèques statiques, nous aurions probablement voir un avantage en faisant cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X