Newsgroup: it.comp.java
Titolo: R: IBM JDK 1.1.8

Vi do buone nuove (a chi interessano....)
Ho trovato il collo di bottiglia della JVM di IBM.
Era lo statement .length che restituisce la lunghezza di una array !!!!
Sembra incredibile ma esso richiede un tempo enorme di esecuzione,
tanto da rallentare un programma di 10 VOLTE !!!! (Solo nella JVM dell'IBM
pero', le altre forse sono piu' furbe)
Fatte le dovute modifiche le nuove prestazioni sono:
Messaggio originale 30 Mbyte:
 SUN JDK 1.3 beta:
227814ae53f9539c2bd0af18162564a0e340a116
Tempo impiegato: 18120 millisecondi. Performance: 1655 KByte/sec.
 Microsoft JVM (jview):
227814ae53f9539c2bd0af18162564a0e340a116
Tempo impiegato: 16430 millisecondi. Performance: 1825 KByte/sec.
 IBM JDK 1.1.8  (c:\jdk1.1.8\bin\java):
227814ae53f9539c2bd0af18162564a0e340a116
Tempo impiegato: 9620 millisecondi. Performance: 3118 KByte/sec. !!!!!!!!
Come volevasi dimostrare la JVM dell'IBM rimane la meglio !!!!!!!!
Io continuo a pensare che si tratti di un buggettino........e voi ??
Salute a tutti.



Scusa ma,... già che ti trovi, puoi spiegarmi perché le prestazioni del
seguente programmino sono pietose??
(se hai 5 minuti)
L'ho compilato ed eseguito col kit della IBM, ma non é cambiato un granché!
Grazie!
_________________________________________________________________________
 /* Questa classe riceve pacchetti datagram da un flusso multicast e li
redirige su un altro flusso
/  Usage: java MulticastRedirector InputIpAddress InputPort OutputIpAddress
OutputPort timeout
*/
import java.io.*;
import java.net.*;
public class MulticastRedirector {
 final static int MAX_PACKET_LENGTH = 65509; // massima lunghezza di un
datagram ip
 public static void main(String [] args) {
  InetAddress inputAddress; // indirizzo multicast del flusso in ingresso
  InetAddress outputAddress;// indirizzo multicast del flusso in uscita
  int inputPort, outputPort, timeout;
  byte[] block = new byte[MAX_PACKET_LENGTH];   // buffer x i dati da
ricevere e trasmettere
try
   // Ricava i valori dei due InetAddress e delle due porte
   try{
    inputAddress  = InetAddress.getByName(args[0]);
    outputAddress  = InetAddress.getByName(args[2]);
   }
   catch (UnknownHostException e) {
    inputAddress  = InetAddress.getByName(args[0]);
    outputAddress  = InetAddress.getByName(args[2]);
   }
   inputPort = Integer.parseInt(args[1]);
   outputPort = Integer.parseInt(args[3]);
   timeout = Integer.parseInt(args[4]);
   /* In base ai valori immessi crea due MulticastSocket collegati
   /  alle porte indicate e poi li aggancia ai due indirizzi ip multicast
   */
   MulticastSocket multicastInputSocket = new MulticastSocket(inputPort);
   MulticastSocket multicastOutputSocket = new MulticastSocket(outputPort);
   multicastInputSocket.joinGroup(inputAddress);
   multicastOutputSocket.joinGroup(outputAddress);
   /* fissa il timeout per il socket in ingresso (in millisecondi),
   /  dopo questo tempo verrà sollevata un'eccezione InterruptedIOException
   */
   multicastInputSocket.setSoTimeout(timeout*1000);
   System.out.println("Socket creati, inizio la redirezione...");
   /* crea due DatagramPacket che verranno usati per ricevere
   /  e per ri-tramettere. Ogni datagram ha un suo buffer
   / (si può provare ad usare lo stesso buffer, ma non cambia molto)
   */
   DatagramPacket inputDP = new DatagramPacket(block,MAX_PACKET_LENGTH);
   DatagramPacket outputDP = new DatagramPacket(block,MAX_PACKET_LENGTH,
outputAddress, outputPort);
   /* riceve i pacchetti datagram da un socket e li ri-trasmette sull'altro,
   /  finché il socket di ingresso non va in timeout.
   */
   int c=0;
   while (true) {
    multicastInputSocket.receive(inputDP);
    multicastOutputSocket.send(outputDP);
    // questa riga può servire a controllare il funzionamento del programma
    // System.out.println("Pacchetto "+(c++)+" ricevuto e trasmesso...");
   }
  }
  catch (NumberFormatException nfe) {
   System.err.println(nfe);
   System.err.println("Usage: java MulticastRedirector InputIpAddress
InputPort OutputIpAddress OutputPort timeout
");
   System.exit(1);
  }
  catch (InterruptedIOException ioe) {
   System.exit(1);
   System.err.println("Timeout!");
  }
  catch (Exception e) {
   System.err.println("Eccezione:"+e.toString());
   System.exit(1);
  }
 }
}