7
votes

Java Réduit l'utilisation du processeur

GRAST-

Nous avons eu quelques nutters de travail qui aiment utiliser xxx

dans leur code. Comme vous pouvez l'imaginer, cela maximum la CPU. Quelqu'un peut-il savoir façons de réduire l'utilisation de la CPU afin que d'autres personnes puissent également utiliser le serveur.

Le code lui-même consiste simplement à interroger en permanence Internet pour les mises à jour sur les sites. J'imagine donc qu'une petite méthode de sommeil réduirait considérablement la consommation de la CPU.

Aussi toutes les manipulations sont effectuées dans des objets à cordes (Java) Tout le monde sache à quel point Stringbuilders réduirait la tête sur la tête?

Merci pour tous les pointeurs


3 commentaires

tandis que (vrai) est simplement un idiome qui dit "faire cela pour toujours". En lui-même, cela ne fait rien; Le code à l'intérieur est ce qui consomme des cycles du processeur. Si le code à l'intérieur effectue des demandes de réseau, elle abandonnera sa période de temps lors du fait, de sorte que d'autres utilisateurs obtiennent leur part; Un Sleep () ne doit pas affecter de manière significative le débit global du serveur (bien que ce soit une bonne chose pour ces serveurs qui se font toucher par le programme). Et enfin, stringbuilder peut ou (plus probable) peut ne pas améliorer les performances. Mais c'est pourquoi les profileurs existent: ils peuvent vous dire ce qui prend le plus de temps dans le programme.


Comme toujours exécuter un profileur pour identifier où se passe la CPU. Utilisez ensuite ces données pour battre le développeur responsable sur la tête.


Pour votre 2e question, notez que le compilateur peut optimiser les concaténations de chaîne à l'aide d'un StringBuilder dans le bytecode. Pour plus de détails, voir ce message: Stackoverflow.com/Questtions/1532461/...


9 Réponses :


2
votes

Faites-la attendre un peu de temps avant de tirer à nouveau, comme celui-ci: XXX

Quant à la deuxième question, il réduirait également la mémoire et éventuellement l'utilisation du processeur, mais les gains dépendent vraiment de ce qui est se passe avec ces cordes.


0 commentaires

4
votes

À quelle fréquence ces sites sont-ils mis à jour? Vous êtes probablement vraiment énervant les hôtes. Il suffit de coller un thread.sleep (60 * 1000); à la fin de la boucle et vous pouvez éviter cela. Ça vous interroguera une fois une minute, c'est sûrement suffisant?


0 commentaires

2
votes

Un sommeil réduirait la consommation de la CPU. Quant aux Stringbuilders, ils pourraient réduire l'utilisation de la mémoire et améliorer les performances.


0 commentaires

0
votes

Vous pouvez également essayer xxx


3 commentaires

Méthode @Helper - "Rendement" ne provoque que l'exécution de l'objet de thread en cours d'exécution temporairement et permet à d'autres threads d'exécuter ... Cela ne réduira donc que l'utilisation de la CPU nettement s'il y a une autre application utilisateur en parallèle. "Dormir" sera plus adéquat à ce qu'il veut atteindre.


@Xprito Sry, tu as raison. N'a pas vraiment compris le point de l'OP. Peut-être que je ne devrais pas lire la poste avant mon 2e café ^^.


C'est la raison de 5% de la charge de la CPU, de donner d'autres applications sur «respirer» sur le même ordinateur, ce qui peut être obtenu en mettant un peu de thread.yield () dans des lieux de code critiques. Je fais cela et il est très utile du point d'utilisation normale d'utilisation du logiciel ..



6
votes

Je vais commencer par votre deuxième question, je voudrais être d'accord avec le reste que StringBuilder VS String dépend beaucoup des manipulations de chaîne particulières. J'avais "aspiré" une fois et d'une manière générale comme la quantité de nouvelles allocations de chaîne a augmenté (généralement sous forme de concaténations), le temps d'exécution global a augmenté. Je n'entrerai pas dans les détails et je viens de dire que StringBuilder s'est avéré être une des heures supplémentaires les plus efficaces, par rapport à la chaîne, Stringbuffer, String.Format (), MessageFormat ...

Ma règle echétique est que chaque fois que je souhaite concaténer plus de 3 chaînes ensemble, j'utilise toujours stringbuilder.

Quant à votre première question. Nous avons eu besoin d'apporter une utilisation de la CPU à 5%. Pas une tâche facile. Nous avons utilisé le mécanisme AOP du ressort pour ajouter un thread.sleep () avant toute exécution de méthode d'une méthode intensive de la CPU. Le thread.sleep () serait invoqué que si une limite avait été dépassée. Je suis désolé de dire que le calcul de cette limite n'est pas aussi simple. Et même Sorrier de dire que je n'ai toujours pas obtenu l'autorisation de la publier sur le net. Donc, c'est juste pour vous mettre sur une piste intéressante mais compliquée qui s'est avérée travailler avec le temps.


5 commentaires

Quel raisonnement possible pourrait conduire à une exigence de «pas plus de 5% de temps processeur»? Si vous avez une tâche intensive de la CPU, vous avez une tâche à forte intensité de la CPU. Il n'y a aucun moyen de ce faire, et ajouter des dormeurs à votre code fait simplement que cette tâche prend plus de temps. Si vous vous inquiétez d'un impact d'un programme particulier sur les ressources globales du système, il est beaucoup plus intelligent de réduire simplement la priorité de ce programme. Ou acheter un autre ordinateur.


Personnellement, je ne pouvais pas être d'accord avec toi plus! Pourtant, je ne suis qu'un simple programmeur et je n'ai pas "ingénieur" cette solution. Mon seul point était que ce type de chose puisse être fait, si besoin est :)


@Yaneeve .. trop tard pour demander cela. Comment avez-vous géré le compromis entre l'utilisation de la vitesse et de la CPU? Je suis sûr que le sommeil avait un impact sur la performance, car il augmentait l'heure d'exécution.


@blueluker ce n'était pas une grande partie d'un acte d'équilibre. Nous étions dirigés vers le contrôle de l'utilisation maximale de la CPU et non de la durée de traitement. Cela signifiait que tant que nous n'avions pas commencé à amasser un arriéré, nous étions claires. Nous avons exécuté des tests de charge et avons vu cela étant donné le matériel et la charge projetée, nous serions bien. Je pense que le fait que la majeure partie de notre travail de l'analyse et des transformations de données était un disque et que le réseau io a aidé beaucoup. Nous avons essayé d'insérer des dormeurs uniquement autour des parties intensives de la CPU et non io. Depuis que io est au moins un ordre de magnitude plus lentement que la CPU, jetant beaucoup de THEADS à IO dans l'Interm a probablement contribué à


@Yaneeve .. c'est intéressant.



8
votes

Beaucoup de la "sagesse folklorique" sur stringbuilder est incorrecte. Par exemple, changer ceci: xxx

à ceci: xxx

ne va probablement pas aller aller plus vite . En effet, le compilateur Java traduit en réalité la séquence de concaténation en une séquence équivalente d'ajoute à un StringBuilder temporaire. Sauf si vous êtes concaténant des chaînes dans une boucle, vous préférez simplement utiliser l'opérateur + . Votre code sera plus facile à lire.

L'autre point à effectuer est que vous devez utiliser un profileur pour identifier les lieux de votre code qui bénéficieraient du travail pour améliorer les performances. L'intuition de la plupart des développeurs sur ce qui vaut la peine d'optimiser n'est pas si fiable.


0 commentaires

0
votes

Si leur code est dans un JVM distinct et fonctionne sous Linux ou d'autres Unix, demandez-leur de gérer leur programme à Nice 20.

ou vous pouvez les faire courir dans une machine virtuelle comme VirtualBox et l'utiliser pour limiter l'utilisation du processeur.

ou vous pouvez les tirer si elles continuent de brûler des cycles comme celui-là au lieu d'utiliser un modèle ou thread.sleep . .


0 commentaires

0
votes

Ne présumez jamais quelque chose que vous voyez dans le code est mauvais (ou bon) pour la performance. Les problèmes de performance sont notoirement trompeurs.

voici Un moyen facile de voir à coup sûr ce qui prend le temps.


0 commentaires

0
votes
  1. Quels sites le code interrogatoire du code? Faire ils soutiennent une poussée RSS?
  2. s'ils le font, il n'y a pas besoin de interrogez les sites et branchez plutôt un Module d'attente des mises à jour. La méthode actuelle attend ensuite en utilisant attendre ();
  3. Le nouveau module notifie l'objet avec cette méthode à l'aide de notifier () .
  4. Certes, c'est un travail supplémentaire, mais cela permet d'économiser beaucoup de bande passante et de calcul.

0 commentaires