2016-10-26 1 views
0

Je lis à propos de l'analyse comparative avec JMH et envisage maintenant the example of asymmetric.Comprendre asymétrique dans jmh

Ils ont seulement dit ceci:

Jusqu'à présent, tous les tests sont symétriques: le même code a été exécuté dans tous les fils. Parfois, vous avez besoin du test asymétrique.

À quels "temps" exactement j'ai besoin d'un tel benchmarking symétrique. Je ne comprends aucun cas d'utilisation pratique de cette installation. Ils fournissent le suivant:

private AtomicInteger counter; 

@Setup 
public void up() { 
    counter = new AtomicInteger(); 
} 

@Benchmark 
@Group("g") 
@GroupThreads(3) 
public int inc() { 
    return counter.incrementAndGet(); 
} 

@Benchmark 
@Group("g") 
@GroupThreads(1) 
public int get() { 
    return counter.get(); 
} 

Mais pouvez-vous me donner un cas d'utilisation réel de cela? Je veux dire, quel genre de choses pourrais-je vouloir mesurer asymétriquement?

+3

Par ex scénarios typiques producteur-consommateur ou lecteur-scénariste. – apangin

+2

Vous en avez besoin lorsque le test n'est significatif que lorsqu'une autre action est exécutée comme dans la vraie vie, vous ne ferez pas une seule action à plusieurs reprises. par exemple. l'ajout à une file deviendra plus lent à mesure qu'il se remplit, mais en réalité, la file d'attente peut être généralement vide. –

+0

@PeterLawrey Je ne comprends pas très bien votre exemple avec les files d'attente. Donc, en fait, nous voulons que plusieurs threads mesurent l'impact du changement de contexte sur la performance, c'est ce que vous vouliez dire? Mais quant aux files d'attente de Java, elles ne sont pas bloquantes ... alors que voulons-nous atteindre par un tel benchmark? –

Répondre

1

cryptage est un Programmatic cas d'utilisation spécifique:

clés Symmetric signifie simplement que la clé qui cryptent les données est la même clé qui sera decypting les données. Les clés asymétriques signifient que l'algorthm utilise une clé différente pour chiffrer et décompacter les données.

Dans les cas où les performances sont une préoccupation légitime, vous pouvez aider à minimiser les problèmes de performance de WS-Security grâce à l'utilisation intelligente de vos options de sécurité. Certains frameworks de services Web ont tendance à générer «toutes les configurations de sécurité ci-dessus», avec des messages entièrement signés et cryptés à l'aide de WS-Security et envoyés via des connexions SSL. C'est bien si vous voulez vraiment une protection maximale et ne vous souciez pas des performances, mais dans la plupart des cas, il est plus logique d'utiliser SSL (si vous ne souhaitez protéger que les informations transitant entre le client et un serveur unique) ou Cryptage WS-Security (si vous avez besoin d'expédier des données sur plusieurs serveurs tout en préservant la confidentialité lorsque vous passez par les intermédiaires). Vous pouvez également utiliser WS-SecureConversation pour des échanges de messages de longue durée entre des clients et un serveur (même accédé par des intermédiaires), pour un gain de performances relativement modeste mais significatif par rapport à WS-Security utilisant des certificats. WS-SecureConversation fonctionne particulièrement bien dans les échanges de messages relativement petits où la surcharge ajoutée des certificats et le chiffrement asymétrique peuvent être importants par rapport au chiffrement réel (symétrique) du corps du message.

Concurrency automatisation des tests de bogue est un autre cas d'utilisation:

Plusieurs approches différentes ont été proposées récemment pour corriger automatiquement les bugs d'accès concurrentiel. Ces problèmes d'adresse résultent d'une synchronisation inadéquate, y compris des violations d'atomicité, des interblocages et des courses de données. Grosso modo, dans tous ces cas, le correctif revient à insérer une synchronisation supplémentaire pour empêcher les mauvais scénarios d'entrelacement.

et l'optimisation multi-core:

Afin d'optimiser les performances, la machine virtuelle Java utilise une « barrière de mémoire pseudo » dans le code pour agir comme une instruction de clôture lors de la synchronisation entre plusieurs processeurs. Il est possible de revenir à une "vraie" instruction de barrière de mémoire, mais cela peut avoir un effet perceptible (et mauvais) sur les performances.

Références