Netwerk benchmarkje in Java, gaat te snel

Pagina: 1
Acties:

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoi


Ik ben bezig een benchmark tooltje te schrijven in java.
Ding vist een 10 megabyte file van mijn webserver af, en doet dit 100x.
Tijd meet ik voor het lusje, en na.

Echter kom ik eropuit dat mijn 100mbit netwerk dat in 25ms zou doen (en dus 40*10 megabyte per sec ....).


Ik heb hiervoor een inputstream object genomen waar een URL aan gevoerd wordt, en de code staat hieronder.
Ik weet dat mijn methode niet perfect is , want de lus zelf tel ik mee, de functie-aanroep en het opnieuw creeren van het object etc. Absoluut snelheid meten is namelijk ook niet mijn doel (ik wil weten of een point-to-point wireless link hetzelfde blijft presteren bij verschillende wisselende invloeden op langere termijn), maar dit gaat wel heel erg ver van de verwachting afwijken...

Normaal zou ik dit aan buffering wijten, maar het bestandje van 10 meg staat echt op mijn webserver en ik zie het ook in het access_log netjes voorbij komen.

De relevante code:

code:
1
2
3
4
5
6
7
8
9
URL url = new URL(args[0]);     
            InputStream in = url.openStream();
         
            startDate=new Date();
            for(int i=0; i< nrOfDownloads; i++)
            {
            downloadFile(in);
            in = url.openStream();
            }


en:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private static boolean downloadFile(InputStream in)
    {
    try
    {
        int data = in.read();
            if (data == -1)
            {
            return(true);
            }
            else
            {
            }
        
    }
    catch(Exception e)
    {
        return(false);
    }
    return(true);
    }


Ook met een packet-sniffer zie ik trouwens dat hij continue data blijft versturen.

Kan iemand me een bump de goede kant op geven?

Ik draai het btw met een Linux systeem, en de webserver is apache.
edit: de uitlijning is bij mij btw wel goed, maar copy-paste heeft het verneukt.

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 15-10 15:37

ripperke

w00t!

java api:
read()
Reads the next byte of data from the input stream.
Je leest dus aantal_keer*1byte van je file, en niet je volledige file.
met een while loopje je file volledig doorlopen en niet 1 byte lezen :)

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
ouch niet wakker 8)7

* Boudewijn gaat in een hoekje staan schamen

  • 0rbit
  • Registratie: Maart 2000
  • Laatst online: 18-03-2021
Als je dat gefixed heb lijkt het mij nog wel handig om even te kijken of er niet iets ergens lokaal gecached kan worden; anders klopt je meting alsnog niet.

Ik ben geheel voldaan, dank u wel!


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
hoe bedoel je dat?
ik wil juist niets lokaal cachen...

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
dit is momenteel trouwens de code:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
    URL url = new URL(args[0]);     
            InputStream in = url.openStream();
         
            long size=measureSize(in);
            
           
            for(int i=0; i< nrOfDownloads; i++)
            {
            timeElapsed+=downloadFile(in);
            in = url.openStream();
            }
            
            
            System.out.println("Created by Boudewijn, under GPL-v2 License");
            System.out.println("Total time elapsed (s): "+timeElapsed/1000 );
            System.out.println("Size of downloaded file (bytes): "+ size);
            System.out.println("Time per download (ms): "+(timeElapsed/nrOfDownloads));
            System.out.println("KiloBytes per second (average): "+(size/(timeElapsed/nrOfDownloads)));
        }
        catch (MalformedURLException mue)
        {
            System.err.println ("Invalid URL");
        }
        catch (IOException ioe)
        {
            System.err.println ("I/O Error - " + ioe);
        }
    }
    
    private static long downloadFile(InputStream in)
    {
    int data;
    try
    {
        Date start=new Date();
        do
        {
        data=in.read();
        }
        while(data != -1);   
        Date stop=new Date();
        return(stop.getTime()-start.getTime());                         
    }
    catch(Exception e)
    {
       System.out.println("Download failed somewhere during the process. Will quit now!");
       System.exit(1);
    }
    return(-1);//won't reach
    }
    
    private static long measureSize(InputStream in)
    {
    long counter=0;
    
    try
    {
        do
        {
        counter++;
        }
        while(in.read() != -1);     
        return(counter-1);                      
    }
    catch(Exception e)
    {
       return(-1);
    }
    }



Ik meet hier een stukje netter. Verder zit er een test met jumbo-pings (ICMP pings met vrij grote packet-size ) in, die gaan namelijk heel vaak fout bij 'slechte' wlan's.

Verder nog ideeen? Beide testjes liggen ondertussen al in een eigen class natuurlijk....


edit; shit dit had een edit moeten zijn 8)7

  • Salandur
  • Registratie: Mei 2003
  • Laatst online: 01-12 12:31

Salandur

Software Engineer

edit:
...verkeerd gelezen...

[ Voor 100% gewijzigd door Salandur op 16-04-2007 09:22 ]

Assumptions are the mother of all fuck ups | iRacing Profiel

Pagina: 1