|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
[Java] Come migliorare le prestazioni di una complessa Applet?
Salve. Da circa un mese a questa parte sto lavorando assiduamente alla creazione di una chat utilizzando applet dal lato client e uno script php dal lato server. Ho ancora parecchie cose da sistemare, ma la cosa principale sono le prestazioni. Se avvio l'applet da locale, il programma scorre una meraviglia, ma se l'avvio on-line noto dei rallentamenti. Sarà perchè il collegamento con i file (sì uso diversi file di testo per gestire conversazioni, registrazioni ecc...) nella rete è indubbiamente più lento del locale, ok. Ma io noto che il programma mi va a scatti anche solo se digito del testo in un JTextField, però non sempre. Ci sono delle volte in cui non ci sono rallentamenti, e certe volte in cui sì. In locale invece non ho mai avuto rallentamenti di alcun tipo... non mi metto di certo a postare l'intero sorgente, dato che sono più di 2900 righe di codice.
Vorrei sapere in linea generale gli elementi che più influiscono sulle prestazioni. Ad esempio, attualmente uso tre Timer, ognuno agisce in tempi separati. Se sostituissi i Timer con dei Thread sarebbe meglio? E cosa cambia tra Applet e JApplet? Insomma, vorrei dei consigli per migliorare le prestazioni della mia applet... Per provare la chat (ovviamente ancora incompleta), potete andare a questo indirizzo: http://www.lenostreidee.net/DFChat/DFChat.html Magari mi dite se anche voi notate dei rallentamenti o no... avendo un solo computer mi risulta difficile fare test on-line Ciao e grazie per l'attenzione |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
mi va senza problemi.. non noto rallentamenti
__________________
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Nessun rallentamento apprezzabile...
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
io ho notato solo che se mandi 4/5 messaggi velocemente tipo di una sola lettera appaiono tutti insieme, ma penso sia normale..
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Provata anch'io assieme un altro utente e sia io che l'altro abbiamo notato qualche lag (non si verificava sempre però) sia durante la digitazione del testo nel JTextField sia nell'invio del messaggio e la sua effettiva apparizione nella finestra di chat.
Puoi provare a spiegarci in che modo usi i Timer e per controllare cosa? Inoltre quante letture/scritture dai/sui file locali fa la chat? Magari si può elaborare una strategia per bufferizzare e scrivere sui file solo quando strettamete neccessario, o nei "tempi morti". Ciao P.S.: io avevo anche qualche problema di charset credo, perchè le vocali accentate spedite dall'altro utente non le vedevo visualizzate correttamente nella finestra di chat, mentre se ero io a spedirle alla chat, l'altro utente le vedeva correttamente.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Innanzitutto grazie per l'interessamento!
Ora spiego brevemente cosa fanno questi 3 Timer: Il primo agisce ogni secondo e legge i messaggi dal file di testo e li stampa nel JEditorPane principale. Serve quindi a leggere i messaggi. Il secondo agisce ogni 3 secondi e legge i nomi degli utenti on-line da un file di testo e quindi aggiorna la lista degli utenti on-line Il terzo infine, agisce ogni 5 secondi e legge da un file di testo i nomi degli utenti bannati e provvede quindi all'espulsione in caso che il nick in uso coincida con un nick trovato nel file di testo. Un'altra cosa strana è che ad un mio amico la la finestra di chat si è aperta dopo quasi 1 minuto o più... è possibile che possa succedere se si ha una vecchia versione di JRE installata? |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Per quanto riguarda il charset, mi pare molto strano... prima avevo questo problema ma poi ho corretto e ora non c'è più. Possibile che possa essere un problema tuo? Anche se mi sembra difficile o_O
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Dunque, visto il modo in cui usi i file di testo, non potresti sostituirli con qualche buffer in memoria?
Scrivere e leggere dal buffer sarebbe più rapido che da file. Per il discorso Timer/Thread: ho guardato velocemente la classe Timer: non è altro che una "facility" per i thread che devono eseguire dei task, in un certo momento e/o ogni certo intervallo di tempo, percui il problema non si pone visto che non stai assegnando task a mille mila thread ma solo a tre. Ciao @EDIT: Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#10 | |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Quote:
|
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
I file di testo che usi adesso, di preciso a cosa servono? Cioè quando vengono scritti e da chi, e quando vengono letti e da chi? @EDIT: scusa, hai la chat, aprila che la usiamo
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 28-08-2008 alle 14:47. |
|
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Quote:
1) Per usare i socket avrei bisogno di un server dedicato 2) Evito di usare i database in modo che questa chat sia utilizzabile ad una più vasta gamma di utenti e con più semplicità L'applet java fa da client per ogni utente che si collega alla chat. Siccome non ho idea di come fare per scrivere file di testo da applet java su uno spazio web, mi affido ad uno script php che svolge queste funzioni in modo molto semplice. Quando nella pagina iniziale si inserisce un nick per entrare, l'applet java legge il file di testo che contiene la lista di tutti i nick attualmente on-line, e se trova uno stesso nick già collegato, la lettura si interrompe e viene comunicato che quel nick è già in uso. Se invece non è in uso, la finestra di chat si apre e si è quindi collegati. Il JTextField che serve per inviare i messaggi, quando si preme invio o si preme il pulsante "Invia messaggio", invia il testo attualmente presente sul JTextField e lo invia ad uno script php attraverso una richiesta GET. Lo script php riceve questi dati e apre il file messageList.txt in modalità append e aggiunge il messaggio. Ogni secondo il timer readerTimer effettua una lettura a messageList, e quindi aggiorna il JEditorPane se ci sono nuovi messaggi PS: sono collegato :P |
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Riguardo ai blocchi, a volte che si verificano e a volte no, ecco parte del codice inerente all'invio dei messaggi:
Al JTextField ho impostato la classe per gli eventi SendMessageHandler. mainTextArea sarebbe il JEditorPane principale che visualizza i messaggi. Forse questi blocchi si verificano quando contemporaneamente il Timer che legge i messaggi e l'actionPerformed di SendMessageHandler vengono eseguiti? Codice:
private class SendMessageHandler implements ActionListener
{
public void actionPerformed (ActionEvent event)
{
if (!insertMessageField.getText().equals (""))
{
String message = insertMessageField.getText();
sendMessage ("all", username, message);
messageList += "\n" + username + " > " + insertMessageField.getText();
mainTextArea.setText (messageList);
insertMessageField.setText ("");
}
}
}
private void sendMessage (String to, String username, String message)
{
InputStream inputStream = null;
try
{
String address = "http://" + Host + "/DFChat/server/server.php?r=1&to="
+ to.replace (" ", "_") + "&user=" + username.replace (" ", "_") + "&message=" + message.replace (" ", "_");
URL url = new URL (address);
URLConnection connection = url.openConnection();
connection.setDoOutput (true);
inputStream = connection.getInputStream();
}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
try
{
inputStream.close();
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
}
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Codice:
private void sendMessage (String to, String username, String message)
{
InputStream inputStream = null;
try
{
String address = "http://" + Host + "/DFChat/server/server.php?r=1&to=" + to.replace (" ", "_") + "&user=" + username.replace (" ", "_") + "&message=" + message.replace (" ", "_");
URL url = new URL (address);
URLConnection connection = url.openConnection();
connection.setDoOutput (true);
inputStream = connection.getInputStream();
}
catch (Exception exception)
{
exception.printStackTrace();
}
finally
{
try
{
inputStream.close();
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
}
Nota(2): il metodo sendMessage() viene chiamato dal metodo actionPerformed() che rappresenta la risposta all'evento "action" del JTextField: siccome il thread esecutore di questo pezzo di codice è l'AWT Event Thread, la latenza ptrebbe essere eliminata facendo eseguire sendMessage() ad un thread apposito, e liberando così l'AWT event thread, con un migliore risultato nella percezione di reattività che l'utente ha del client della tua chat. Prova così: Codice:
private void sendMessage (String to, String username, String message)
{
try
{
Thread senderThread = new Thread()
{
@Override
public void run()
{
String address = "http://" + Host + "/DFChat/server/server.php?r=1&to=" + to.replace (" ", "_") + "&user=" + username.replace (" ", "_") + "&message=" + message.replace (" ", "_");
URL url = new URL (address);
URLConnection connection = url.openConnection();
}
};
senderThread.start();
}
catch (Exception exception)
{
exception.printStackTrace();
}
}
DISCLAIMER: sono un niubbo della programmazione, potrei quindi averti consigliato fesserie ma due cose giocano in mio favore: 1) la possibilità che altri utenti corregano eventuali errori; 2) il fatto che tentar non nuoce: fai un test. Ciao
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 28-08-2008 alle 15:55. |
|
|
|
|
|
|
#15 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Grazie potrei provare. Comunque l'InputStream mi serve. Se non eseguo getInputStream(), la chiamata allo script php non viene eseguita.
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Si sa il perchè?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
|
|
|
|
|
|
#18 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Forse ho capito perchè.
Leggendo qui si evince che: Quote:
Quote:
Quindi puoi rimuovere la chiamata e il blocco try{}catch(){}finally{} relativo all'oggetto InputStream e sostituire il tutto con una chiamata esplicita al metodo connect(). Javadoc rulez!
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
||
|
|
|
|
|
#19 | |
|
Member
Iscritto dal: Aug 2008
Messaggi: 210
|
Quote:
Ritornando a prima, non capisco perchè in locale non mi da blocchi e on-line sì... comunque ora provo a fare come mi hai detto |
|
|
|
|
|
|
#20 | ||
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Leggi il link che ti ho postato.
Quote:
Quote:
Con invokeLater accodi all'AWT Event Thread un oggetto Runnable (un Thread è un oggetto Runnable) perchè venga eseguito in maniera asincrona dall'AWT Event Thread. Quello che invece io ti ho postato, è un metodo per eseguire sendMessage() fuori dall'AWT Event Thread, in un altro Thread. Questo proprio allo scopo di non rallentare il processing dei messaggi e update dell'interfaccia grafica. E' chiara la differenza?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:18.




















