2012-03-26 85 views
1

我一直在測試讀取服務器套接字輸入流的性能。我發現閱讀本身有大約9000納秒(9 us)的延遲。我怎樣才能提高其表現? 我已經嘗試過JAVA的默認緩衝區大小和比這大一點的東西。但其表現並沒有太大變化。在這種情況下,我計算了來自客戶端的每1600個樣本。如何提高插座讀取性能?

多數延遲在此行中找到:

inputLine = in.readLine(); 

這裏是讀線程的代碼:

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; 
    } 
} 

下面是結果:

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

下面是結果沒有'inputLine = in.readLine();'

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

如何提高閱讀效果?客戶只需根據請求發送隨機雙點值。

感謝,

回答

1
String inputLine = null; 

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

如果您註釋掉讀取行,你就什麼都沒有寫,所以實際上你註釋掉兩行,不是嗎?

如果您有一些save.write在每次迭代中寫入的默認字符串,您的微基準(可能會顯得有點不妥)。

好的相關問題的答案:

+0

這樣做的目的是使服務器非常敏感。我需要從客戶端讀取和寫入1千個觸發器產生1600個採樣。然後每次採樣點必須爲0.001/1600 = 0.000625 ms(0.625 us)。所以,9000 ns(9 us)是一個相當大的值。 – user1098761 2012-03-26 20:17:41

+0

我明白了。祝你好運,你的優化。 – aioobe 2012-03-26 20:24:45

+0

@ user1098761它是帶寬的1.5%。這真的是一個很大的價值嗎? – EJP 2012-03-26 21:59:32