Contrôle d'un script perl d'utilisation du PROCESSEUR?
Je fais beaucoup de recherche de fichiers basé sur un critère dans de multiples itérations à partir de mon script Perl et il semble prendre 100% du temps CPU. Est-il un moyen de contrôler mon script de l'utilisation de l'UC? J'ai lu quelque part sur la mise vide cycles de sommeil dans mon script. Mais je ne suis pas sûr de la façon de le faire.
C'est dépendants de la plateforme. Quel système d'exploitation êtes-vous sur?
Si il n'y a pas d'autres procédés, qui ont besoin du CPU pourquoi devrait-il laisser, déchets de bons cycles où ils peuvent être mis à la bonne utilisation ??
Je suis en cours d'exécution mes scripts sous Windows. Oui il y a d'autres procédés qui sont également en cours d'exécution. J'étais pour être moins gênant avec mes scripts.
Si il n'y a pas d'autres procédés, qui ont besoin du CPU pourquoi devrait-il laisser, déchets de bons cycles où ils peuvent être mis à la bonne utilisation ??
Je suis en cours d'exécution mes scripts sous Windows. Oui il y a d'autres procédés qui sont également en cours d'exécution. J'étais pour être moins gênant avec mes scripts.
OriginalL'auteur Nilesh C | 2010-01-06
Vous devez vous connecter pour publier un commentaire.
vous pourrait faire baisser le processus (en Perl) de priorité, tel qu'assigné par le système d'exploitation: windows ou linux
exemple pour priorité la plus faible:
windows
linux
C'est une solution facile, mais exige que les utilisateurs de connaissances ou que vous créez un script de démarrage ou un alias. Cependant, si vous utilisez setpriority (), le code sera toujours changer la priorité/changer de priorité comme prévu. Le type d'application et d'utilisation doivent décider quelle solution choisir.
OriginalL'auteur Alon
Une excellente façon d'améliorer l'utilisation de l'UC est à utiliser de meilleurs algorithmes. N'essayez pas de deviner où votre code est de passer tout son temps: utiliser un profiler.
Devel::NYTProf
est un fantastique outil pour cela.Être sûr de garder La loi d'Amdahl à l'esprit. Par exemple, dire partie de votre programme utilise un algorithme quadratique et avec un peu d'effort, vous pouvez le remplacer avec un linéaire. Hourra! Mais si le code en question ne représente que 5% de la durée totale d'utilisation, votre plus héroïque effort peut apporter pas mieux qu'un petit de cinq pour cent d'amélioration. Utiliser un profiler pour déterminer si des opportunités pour une plus grande accélération sont disponibles ailleurs.
Vous ne nous dites pas ce que vous cherchez, et même les meilleurs algorithmes connus, peuvent être gourmands en ressources PROCESSEUR. Considérez que votre système d'exploitation planificateur a été écrit à la main, à l'écoute, testé, et réécrit pour utiliser efficacement les ressources système. Oui, certaines tâches exigent des planificateurs, mais de tels cas sont rares, encore moins probable étant donné que vous êtes à l'aide de Perl.
Ne le prenez pas comme un mauvais signe que votre code est de manger de la CPU. Vous pourriez être surpris d'apprendre que l'un des plus difficiles défis en temps réel, la performance des systèmes est essentielle, est de garder le CPU plutôt que la marche au ralenti.
Sonne comme un choix intelligent.
Merci pour l'astuce sur NYTProf! note à moi-même: la seule sorte de guide, avec les étapes que j'ai pu trouver jusqu'à présent est perlmonks: mod_perl application de profilage - Problème.. Cheers!
OriginalL'auteur Greg Bacon
Vous pouvez utiliser le sommeil ou usleep. Une autre chose que vous pouvez faire est de baisser la priorité du processus.
Mise à jour:
Voir setpriority()
setpriority
fonction est juste un wrapper autour de l'appel système du même nom. En tant que tel, c'est une erreur fatale de l'appeler sur les plates-formes qui ne sont pas de la mettre en œuvre (par exemple Windows).Je viens de confirmé ce.
setpriority()
n'est pas implémentée dans Windows.OriginalL'auteur Christian V
Juste dormir:
ou un peu plus de fantaisie, ne les N opérations par cycle de sommeil:
OriginalL'auteur slebetman
le sommeil + le temps + fois peut un peu faire.
(Non testé...) Saupoudrer assez
relax
appels tout au long de votre code et devraient de ce fait à une moyenne de près ou en dessous de 50% de temps PROCESSEUR.BSD::Ressources pouvez le faire moins invasive, et vous pourriez aussi bien saisir Time::HiRes pour une plus grande précision.
(Également non testé...) Sur un système qui prend en charge, ce qui devrait demander au système d'exploitation de signal vous tous
$interval
secondes de temps CPU, et à quel point vous remettre le compteur à zéro et le sommeil. Ce ne devrait pas nécessiter de changements pour le reste de votre code.OriginalL'auteur ephemient
Est votre script en train de faire des choses tout le temps? Par exemple, si vous calculez un ensemble de mandelbrot, vous aurez des boucles qui consomment du CPU, mais sont activement de traitement de données tout le temps.
Ou avez-vous des boucles où vous êtes en attente pour plus de données à traiter:
Dans le premier cas, la définition de la priorité est probablement la meilleure solution. Il va ralentir le calcul, mais seulement autant que nécessaire pour le service de tous les autres processus du système.
Dans le second cas, vous pouvez améliorer l'utilisation de l'UC de façon drastique par le sommeil pendant une fraction de seconde.
Si vous êtes de l'extraction de données à partir d'une source
select
peut fonctionner sur, tant mieux. La vous pouvez vous arranger pour que votre boucle de bloquer jusqu'à ce que les données sont prêtes.Sélectionnez fonctionne sur les prises et fichier-poignées sur les systèmes *NIX. Sur les systèmes Windows, vous pouvez sélectionner uniquement contre les sockets.
OriginalL'auteur daotoad