2016-07-27 40 views
0

我編寫了使用NIO和IO讀取和寫入文件。然後我在相同的磁盤環境中執行了簡單的性能測試。我的測試是從一個目錄中讀取一個文件(~5MB),並將其寫入不同的目錄(相同的磁盤)。Centos 7中的NIO和IO性能問題(第一次和第二次讀取和寫入)

首先測試(檢驗.pdf):

  • NIO:Elasped時間:80.457224毫秒
  • IO:Elasped時間:4.51824毫秒

第二次測試,使用相同的文件(測試。 PDF):

  • NIO:Elasped時間:4.732797毫秒
  • IO:Elasped時間:4.059444毫秒

我的問題是,爲什麼在第一次測試中,NIO花了更長的時間比IO和第二測試爲什麼NIO花了差不多同一時間IO?我有點困惑。

這裏是代碼片段(非常基本的,公知的代碼):

int BUFFER_SIZE = 64 * 1024; 

NIO:

ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER_SIZE); 
try (SeekableByteChannel seekableChannelToRead = Files.newByteChannel(readFilePath,EnumSet.of(StandardOpenOption.READ)); 
    SeekableByteChannel seekableChannelToWrite = Files.newByteChannel(writeFilePath, EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.WRITE))) { 

    Long startTime = System.nanoTime(); 
    int byteCount = 0; 

    while ((byteCount = seekableChannelToRead.read(buffer)) > 0) { 
     buffer.flip(); 
     seekableChannelToWrite.write(buffer); 
     buffer.clear(); 
    } 

    Long elapsedTime = System.nanoTime() - startTime; 
    System.out.println("FileName: " + path.getFileName() + "; Elapsed Time is " + (elapsedTime/1000000.0) + " msec"); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

IO:

try (FileInputStream in = new FileInputStream(path.toFile()); 
    FileOutputStream out = new FileOutputStream(writeFilePath.toFile())) { 
    Long startTime = System.nanoTime(); 
    byte[] byteArray = new byte[BUFFER_SIZE]; // byte-array 
    int bytesCount; 
    while ((bytesCount = in.read(byteArray)) != -1) { 
     out.write(byteArray, 0, bytesCount); 
    } 
    Long elapsedTime = System.nanoTime() - startTime; 
    System.out.println("Elapsed Time is " + (elapsedTime/1000000.0) + " msec"); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 
+0

您正在使用SAN /慢速磁盤嗎?一種可能性是,您的第一次測試將文件從san加載到緩衝區中,並且所有連續的測試都從內存中運行。至少在java7'io'使用'nio'的情況下,無論提供哪種性能提升,4.7到4.1都會在我的預期之內。 – Jonathan

+0

感謝您的回覆。不,我沒有使用SAN /慢速磁盤。我正在測試我的工作站。它是奔騰5,硬盤7200轉。 – MFH

+0

您進行過多少次測試? – chrylis

回答

1

第一測試由於必須加載文件而運行緩慢從您的磁盤存儲第一次。

在80毫秒的7200rpm驅動器上加載文件不一定是不正常的。您的驅動器可能有大約8ms的查找時間,我們不知道文件是否被分割。

加載後文件存儲在緩衝區緩存中,後續請求(甚至不同進程)的加載速度要快得多。內核將文件存儲在緩衝區緩存中以加快常用文件的訪問時間。

做基準測試時,通常是一個好主意,完全在內存中執行測試...或預取文件內容,使其存在緩衝區緩存中。

相關問題