2009-11-16 5 views
1

J'ai un script Perl qui s'exécute via une commande system() de C. Sur un site spécifique (SunOS 5.10), lorsque ce script est exécuté, il prend presque toujours 6 secondes ou plus. Sur d'autres sites, il fonctionne à peu près instantanément (0,1s). Si je lance le script manuellement, c'est-à-dire pas à partir du code C, il s'exécute également instantanément. J'ai finalement suivi la lenteur (en crachant le temps un tas entier dans beaucoup d'endroits différents), à une seule ligne require. Le fichier dont il a besoin est un autre script Perl que nous avons écrit. Le script se compose d'un seul require (ce fichier here), de 3 scalaires auxquels sont assignées des valeurs entières et d'une poignée de routines de conversion heure/date. Le fichier se termine par un 1 ;. Ce simple besoin semble prendre jusqu'à 6 secondes à l'occasion, mais comme je l'ai dit, pas toujours même sur la même machine. Je suis absolument perplexe ici. Ma seule dernière pensée est d'activer le profilage, mais le site n'a pas Devel :: Profiler et ma seule autre option (que je connaisse) serait de l'ajouter à la commande Perl qui me demanderait de modifier et recompiler le C code (faisable mais non trivial).Pourquoi cette ligne Perl nécessite-t-elle autant de temps?

Quelqu'un at-il une idée de ce qui pourrait se passer ici? Je ne pense pas que je puisse/je veux mettre toute la date.pl qui est requise, mais c'est à peu près exactement comme je l'ai décrit; Je pourrais répondre à toutes vos questions à ce sujet.

Merci d'avance.

+3

Les votes vers le bas sans commentaires me rendent triste. Si j'écris une mauvaise question, au moins, dites-moi ce qu'il y a de mal pour que je puisse mieux répondre aux questions de l'avenir. – Morinar

+0

Morinar: D'accord. J'ai voté +1 pour votre question, de sorte que le vote net est maintenant de retour à zéro. J'ai vu beaucoup de bonnes questions perl downvoted sans raison valable. On dirait que la balise SO Perl attire relativement plus de négativité par rapport aux autres balises que j'ai lues. Vraiment bizarre pour une si belle langue. – knorv

+3

Oui, il y a beaucoup d'ennemis ici. :( –

Répondre

5

Vous pourriez être intéressé par A Timely Start par Jean-Louis Leroy. Il avait un problème similaire et le suivait jusqu'à un chemin de recherche de module long et profond où perl trouvait généralement les modules dans les dernières entrées de @INC.

+0

C'est un bon article; Merci pour le lien. Mon @INC n'est nulle part aussi proche de ce qu'il avait, mais tout semble encore semi-faisable. – Morinar

3

Six secondes sont longues. Avez-vous vérifié ce que votre réseau fait pendant ce temps? Ma première pensée a été que générer le nouveau processus lors de l'utilisation de la commande system() pourrait être le problème, mais six secondes est trop long. Je ne connais pas beaucoup perl, mais je pourrais imaginer que pour une raison quelconque, l'accès du module time pourrait appeler un serveur de temps réseau. Juste pour se synchroniser. Peut-être que cela prend tellement de temps ou peut-être que ça prend du temps. Il se peut que cela ne se produise que pour un processus nouvellement engendré - donc seulement lorsque vous utilisez la commande system().

juste sauvage deviner ...

+0

Ce sont certainement de bonnes idées, mais le temps qui est craché avant le besoin correspond à l'heure qui est craché par l'application C, ce qui signifie que la commande system() elle-même ne prend pas longtemps, c'est juste en quelque configuration utilisée lorsque le script est exécuté. – Morinar

+0

Je vais vérifier les idées du réseau, mais je ne sais pas à quoi il pourrait accéder, mais cela semble raisonnable. – Morinar

+0

Cela semble raisonnable à vérifier: 'require' va chercher tout' @ INC', donc en fonction des répertoires précédant celui dans lequel votre fichier est finalement trouvé, cela peut prendre beaucoup de temps. – ephemient

1

Donc, cela ne répond pas à votre question directement, mais s'il vous plaît dites-moi que vous n'êtes pas réellement en cours d'exécution sur perl 4? En supposant que vous êtes sur perl 5, vous pouvez supprimer le fichier entier et remplacer le require par use POSIX qw(ctime) pour obtenir la version fournie avec Perl.

Si vous avez besoin de supporter perl4, je vais simplement râler quelque chose à propos de la version 5 étant quinze ans maintenant et partez. :)

+0

Nous n'utilisons pas * Perl4, mais la grande majorité de notre code Perl a littéralement plus de 15 ans. Alors que quelques-uns d'entre nous qui ont des compétences Perl modernes ont commencé à convertir les choses aux standards Perl5, la plupart des gens ici ne connaissent même pas la différence. C'est vraiment un bon conseil cependant; Je finirai probablement par le faire malgré tout. – Morinar

Questions connexes