2012-03-26 9 views
1

Ich habe die Leistung des Leseserver Socket Input Stream getestet. Ich habe festgestellt, dass das Lesen selbst etwa 9000 Nanosekunden (9 us) Verzögerung hat. Wie kann ich die Leistung verbessern? Ich habe versucht, JAVA Standard-Puffergröße und etwas ein bisschen größer als das. Aber seine Leistung ist nicht viel verändert. In diesem Fall habe ich alle 1600 Proben vom Kunden gezählt.Wie verbessert man die Lesefähigkeit der Steckdose?

meisten Verzögerung wird in dieser Zeile gefunden:

inputLine = in.readLine(); 

Hier ist der Code des Lesens Threads:

PrintWriter out = new PrintWriter(door.getOutputStream(), true);    
BufferedReader in = new BufferedReader(new InputStreamReader(door.getInputStream()), 10240);   

File file = new File(this.storageDirectory); 
BufferedWriter save = new BufferedWriter(new FileWriter(file)); 

String inputLine = null; 

while(Switch) 
{ 
    inputLine = in.readLine(); //I found ~9000 ns delay in this line. 
    save.write(inputLine); 


    if(iCounter==0) 
     StartTime = System.nanoTime();     

    iCounter++;      


    if(iCounter>=1600) //need to store them. 
    { 
     EndTime = System.nanoTime(); 
     TimeTick = (EndTime - StartTime)/1600; 
     System.out.println("TimeTick is [ns]: " + TimeTick);      
     iCounter = 0; 
    } 
} 

Hier ist das Ergebnis:

TimeTick is [ns]: 9241 
TimeTick is [ns]: 9941 
TimeTick is [ns]: 6535 
..... 

Hier ist das Ergebnis ohne 'inputLine = in.readLine();'

TimeTick is [ns]: 0 
TimeTick is [ns]: 0 
TimeTick is [ns]: 1 
...... 

Wie kann ich die Leseleistung verbessern? Der Client sendet nur zufällige Doppelpunktwerte auf Anfrage.

Danke,

Antwort

1
String inputLine = null; 

while (...) { 
    ... 
    inputLine = in.readLine(); //I found ~9000 ns delay in this line. 
    save.write(inputLine); 
    ... 
} 

Wenn Sie die Lese Zeile aus kommentieren, werden Sie nichts zu schreiben haben, so in der Tat sind Sie beide Linien Kommentierung aus, nicht wahr?

Ihre Mikro-Benchmarks (die zu Beginn etwas fragwürdig erscheinen) würden wahrscheinlich bessere Informationen liefern, wenn Sie eine Standard-Zeichenkette hätten, die in jeder Iteration geschrieben hat.

gute und relevante Frage und Antwort:

+0

Der Zweck dieser macht der Server sehr reaktionsschnell. Ich muss vom Client lesen und schreiben, der 1600 Samples mit 1 kHz Trigger erzeugt. Dann muss jedes Mal, wenn die Probe tickt, 0,001/1600 = 0,000625 ms (0,625 us) sein. Also, 9000 ns (9 us) ist ein ziemlich großer Wert. – user1098761

+0

Ich verstehe. Viel Glück mit Ihren Optimierungen. – aioobe

+0

@ user1098761 Es ist 1,5% der Bandbreite. Ist das wirklich ein großer Wert? – EJP

Verwandte Themen