web-dev-qa-db-fra.com

Quand dois-je utiliser l'option -pipe de GCC?

Le documentation GCC 4.1.2 a ceci à dire sur le -pipe option:

-tuyau

Utilisez des canaux plutôt que des fichiers temporaires pour la communication entre les différentes étapes de la compilation. Cela ne fonctionne pas sur certains systèmes où l'assembleur ne peut pas lire à partir d'un tuyau; mais l'assembleur GNU n'a aucun problème.

Je suppose que je serais en mesure de dire à partir d'un message d'erreur si les assembleurs de mes systèmes ne prennent pas en charge les tuyaux, donc à part ce problème, quand est-ce important d'utiliser cette option? Quels facteurs devraient être utilisés pour décider de l'utiliser?

55
Rob Kennedy

Cela ne fait généralement aucune différence

Il a + et - considérations. Historiquement, l'exécution simultanée du compilateur et de l'assembleur imposerait des ressources RAM.

Gcc est petit par rapport aux normes actuelles et -pipe ajoute un peu d'exécution parallèle accessible multicœur.

Mais du même coup, le CPU est si rapide qu'il peut créer ce fichier temporaire et le lire sans que vous vous en rendiez compte. Et depuis -pipe n'a jamais été le mode par défaut, il agit parfois un peu. Un seul développeur signalera généralement ne pas avoir remarqué le décalage horaire.

Maintenant, il existe de grands projets. Vous pouvez consulter une seule arborescence qui construira tout Firefox, ou NetBSD, ou quelque chose comme ça, quelque chose de vraiment grand. Quelque chose qui inclut tout X, par exemple, en tant que composant de sous-système mineur. Vous remarquerez peut-être une différence lorsque le travail implique des millions de lignes de code dans des milliers et des milliers de fichiers C. Comme je suis sûr que vous le savez, les gens ne travaillent normalement que sur une petite partie de quelque chose comme ça à la fois. Mais si vous êtes un ingénieur de publication ou que vous travaillez sur un serveur de build, ou que vous changez quelque chose dans stdio.h, , vous voudrez peut-être construire tout le système pour voir si vous avez cassé quelque chose. Et maintenant, chaque baisse de performance compte probablement ...

36
DigitalRoss

D'après notre expérience avec un projet de taille moyenne, l'ajout de -pipe n'a fait aucune différence perceptible dans les temps de construction. Nous avons rencontré quelques problèmes avec celui-ci (échouant parfois à supprimer les fichiers intermédiaires en cas d'erreur, IIRC), et comme il ne nous a rien apporté, nous avons cessé de l'utiliser plutôt que d'essayer de résoudre ces problèmes.

37
Josh Kelley

En essayant maintenant, il semble être plus rapide à construire lorsque les destinations source/build sont sur NFS (réseau Linux). Cependant, l'utilisation de la mémoire est élevée. Si vous ne remplissez jamais le RAM et que vous avez la source sur NFS, cela ressemble à une victoire avec -pipe.

27
peter karasev

Honnêtement, il y a très peu de raisons de ne pas l'utiliser. -pipe n'utilisera qu'un peu plus de RAM, ce qui si cette case est du code de construction, je suppose qu'il a une quantité décente. Cela peut considérablement améliorer le temps de construction si votre système utilise un système de fichiers plus conservateur qui écrit puis supprime tous les fichiers temporaires en cours de route (ext3, par exemple.)

10
Jeff Mc

Un avantage est qu'avec -pipe le compilateur interagira moins avec un système de fichiers. Même lorsqu'il s'agit d'un disque RAM, les données doivent toujours passer par les couches d'E/S de bloc et de système de fichiers lors de l'utilisation de fichiers temporaires, tandis qu'avec un canal, elles deviennent un peu plus directes.

Avec les fichiers, le compilateur doit d'abord terminer l'écriture avant d'appeler l'assembleur. Un autre avantage des tuyaux est que les deux, le compilateur et l'assembleur, peuvent fonctionner en même temps et ils utilisent un peu plus les architectures SMP. Surtout lorsque le compilateur doit attendre les données du fichier source (en raison du blocage des appels d'E/S), le système d'exploitation peut donner à l'assembleur le temps CPU complet et le laisser faire son travail plus rapidement.

3
Sven