7
votes

Est-il possible d'écrire un script shell qui est plus rapide que le script équivalent de Perl?

J'ai écrit plusieurs scripts dans Perl et Shell et j'ai comparé le temps d'exécution réel. Dans tous les cas, le script Perl était supérieur à 10 fois plus rapide que le script shell.

Alors je me suis demandé s'il est possible d'écrire un script shell qui est plus rapide que le même script de Perl? Et pourquoi Perl est plus rapide que Shell, bien que j'utilise le System fonction dans le script Perl? < / p>


5 commentaires

Je ne sais pas. Mais cela dépend probablement du script. Poster un exemple de script est une bonne chose. En outre, sans être à 100% de la fonction système dans Perl fait probablement référence à la bibliothèque C.


Demandez-vous un exemple de script shell qui est plus rapide qu'un script perl correspondant? Ou, pour chaque script Perl (au moins, chaque script Perl d'une forme spécifique), s'il est possible d'écrire un script d'enregistrement équivalent et plus rapide?


Un exemple de script shell qui est plus rapide qu'un script perl correspondant :)


Je pense qu'il est également important de noter que certains obus sont plus rapides que d'autres. Bash et ZSH sont excellents lorsque vous tapez ... mais le tableau de bord est plus rapide pour exécuter des scripts.


Je pense que ces deux questions conviennent parfaitement elles-mêmes, même si aucune des réponses ne prétendent réellement à leur répondre.


6 Réponses :


1
votes

Non, je pense que c'est impossible:
La commande bash est une langue véritablement interprétée, mais les programmes PERL sont compilés à ByTecode avant l'exécution


4 commentaires

OK - Alors pourquoi les gens utilisent le script shell? Parce qu'ils ne savent pas Perl? :)


Parce qu'il est naturel d'utiliser la coquille de commande pour exécuter des commandes :)


@JohnJoHNGA: Parce que le temps de personne est plus précieux que le processeur. S'il faut même 5 minutes de plus pour écrire une version Perl qui économisera quelques secondes par exécution, alors bash est probablement le meilleur choix. Personnellement, je suis un énorme fan perl, mais lorsque je vais simplement automatiser une série de commandes sans avoir besoin de contrôle de flux, je le ferai toujours avec Bash.


Impossible est un mot fort. Je pourrais dire «improbable», mais je parie que quelqu'un peut trouver au moins sur le programme rapide à Bash. Perl peut souffrir d'un inconvénient de la compilation où il doit trouver, charger et compiler le code. J'utilise une coque assez un peu pour séquencer une série de lignes de commande. Je ne pense pas que Perl va faire cette tâche plus rapide ou me donner des résultats plus rapidement.



-2
votes

Oui. C Code va être plus rapide que le code Perl pour la même chose, donc un script qui utilise un exécutable compilé pour faire beaucoup de travail va être plus rapide qu'un programme PERL qui fait la même chose.

Bien sûr, le programme PERL pourrait être réécrit d'utiliser l'exécutable, auquel cas il serait probablement plus rapide.


1 commentaires

Cela pourrait être vrai dans certains cas, mais rappelez-vous que Perl est Code C. Selon le travail, vous ne pourrez peut-être pas battre l'infrastructure C hautement optimisée de PERL.



4
votes

Cela pourrait tomber dangereusement proche de l'optimisation des fauteuils ARM, mais voici quelques idées qui pourraient rationaliser vos résultats:

  • Fork / Exec: presque tout ce qui est utile par un script shell est effectué via une coquille de sortie, qui commence une nouvelle coquille et exécute la commande A comme SED , awk , chat etc. Souvent, pas plus souvent, un processus est exécuté, et les données sont déplacées via des tuyaux.

  • Structures de données: les structures de données de PERL sont plus sophistiquées que Bash ou CSH's. Cela oblige généralement le programmateur à créer avec stockage de données. Cela peut prendre les formes de:

    • Utilisez des structures de données non optimales (tableaux au lieu de hachages)
    • stockez des données sur la forme textuelle (par exemple les entiers comme chaînes) qui devaient être réinterprétés à chaque fois.
    • Enregistrer les données dans un fichier et re-l'analysez à nouveau et encore.
    • etc.
    • Mise en œuvre non optimisée: Certaines constructions de shell peuvent ne pas être conçues avec une optimisation à l'esprit, mais avec une commodité de l'utilisateur. Par exemple, j'ai des raisons de croire que la mise en œuvre de bash de l'expansion des paramètres en particulier {foo // recherche / remplacement} est sous-optimale par rapport à la même opération dans SED . Ce n'est généralement pas un problème pour les tâches quotidiennes.


0 commentaires

8
votes

Il y a peu de façons de rendre votre coquille (par exemple, Bash) exécuter plus rapidement.

  1. Essayez d'utiliser moins de commandes externes si les internaux de Bash peuvent faire la tâche pour vous. Par exemple, utilisation excessive de sed , grep , awk et pour chaîne / texte manipulation.
  2. Si vous manipulez des fichiers relativement gros, n'utilisez pas la boucle de lecture de bash. Utiliser awk. Si vous manipulez vraiment de gros fichiers, vous pouvez utiliser GREP pour rechercher les modèles que vous souhaitez, puis les transmettre à la norme de «Modifier». L'algorithme de recherche de Grep est très bon et rapide. Si vous souhaitez obtenir seulement l'avant ou la fin du fichier, utilisez la tête et la queue.
  3. Les outils de manipulation de fichiers tels que sed, couper, grep, wc, etc. Tout peut être fait avec un script awk ou utiliser des internes Bash si cela n'est pas compliqué. Par conséquent, vous pouvez essayer de réduire l'utilisation de ces outils qui se chevauchent dans leurs fonctions. Les tuyaux / chaînons unix sont excellents, mais en utilisant trop d'entre eux, par exemple Commande | Grep | Grep | Cut | SED rend votre code lent. Chaque tuyau est une surcharge. Pour cet exemple, juste un awk les fait tous. Commande | awk '{faire tout ici}' L'outil le plus proche que vous puissiez utiliser, qui peut correspondre à la vitesse de Perl pour certaines tâches, par exemple une manipulation de chaîne ou des mathématiques, est awk. Voici une référence amusante pour Cette solution . Il y a environ 9 millions de numéros dans le fichier

    sortie xxx

    pour chaque essai, awk est plus rapide que Perl.

    Enfin, essayez d'apprendre Awk au-delà de ce qu'ils peuvent faire comme une doublure.


1 commentaires

Merci! C'est exactement ce que je cherche!



1
votes

Certaines commandes Shell peuvent fonctionner plus rapidement que Perl, dans certaines situations. J'ai une fois comparé un script SED simple contre l'équivalent à Perl et SED gagné. Mais lorsque les exigences sont devenues plus complexes, la version PERL a commencé à battre la version SED. La réponse est donc, cela dépend. Mais pour d'autres raisons, (simplicité, maintenabilité, etc.) Je me pencherais pour faire des choses à Perl de toute façon, à moins que les exigences soient très simples, et je m'attends à ce qu'ils restent de cette façon.


0 commentaires

2
votes

D'accord, je sais que je le demande en ouvrant une canette de vers fermé il y a deux ans, mais je ne suis pas 100% heureux avec aucune des réponses.

La bonne réponse est oui. Mais la plupart des nouveaux codeurs iront toujours à Perl et à Python et à écriture du code qui luttent puissamment pour envelopper des appels aux exécutables externes, car ils ne disposent pas du mentorat ou de l'expérience requis pour savoir quand utiliser les outils.

La coquille Korn (KSH) a des mathématiques intégrées rapides et un moteur de regex pleinement capable et rapide qui, haleau, peut gérer la réégalité de type Perl. Il a aussi des tableaux associatifs. Il peut même charger des bibliothèques externes .so. Et c'était un produit fini et mature il y a 10 ans. Il est même déjà installé sur votre Mac.


0 commentaires