c'est mon premier post sur stackoverflow ... J'espère que quelqu'un peut me aiderproblème Java performance avec LinkedBlockingQueue
J'ai une grande régression de performances avec Java 6 LinkedBlockingQueue
. Dans le premier fil, je génère des objets que je pousse dans la file d'attente Dans le second fil je tire ces objets. La régression des performances se produit lorsque la méthode take()
du LinkedBlockingQueue
est appelée fréquemment. J'ai surveillé l'ensemble du programme et la méthode take()
a réclamé le plus de temps global. Et le débit passe de ~ 58MB/s à 0,9 Mo/s ...
la pop file d'attente et les méthodes prendre ar appelé avec une méthode statique de cette classe
public class C_myMessageQueue {
private static final LinkedBlockingQueue<C_myMessageObject> x_queue = new LinkedBlockingQueue<C_myMessageObject>(50000);
/**
* @param message
* @throws InterruptedException
* @throws NullPointerException
*/
public static void addMyMessage(C_myMessageObject message)
throws InterruptedException, NullPointerException {
x_queue.put(message);
}
/**
* @return Die erste message der MesseageQueue
* @throws InterruptedException
*/
public static C_myMessageObject getMyMessage() throws InterruptedException {
return x_queue.take();
}
}
comment puis-je régler la take()
méthode pour accomplir au moins 25Mb/s, ou est-il une autre classe que je peux utiliser qui bloquera lorsque la "file d'attente" est pleine ou vide.
Sincères salutations
Bart
P.S .: désolé pour mon mauvais anglais, je suis de l'Allemagne;)
Mo/s est sans signification. take() obtient une référence. Si la charge utile de ce (en dehors du mot de la référence lui-même) est de quelques octets, ou plusieurs mégaoctets, n'est pas pertinent pour la file d'attente. –
je sais ... mais j'ai essayé de forcer l'ampleur de la régression;) – lofthouses
Pouvez-vous d'abord essayer d'ajouter 5000 éléments à la file d'attente puis exécutez les prendre pour voir combien de temps chaque passe dépense? –