2012-02-16 46 views
0

我想基準測試將一個二進制文件從一個位置保存到另一個位置需要多快或多慢。輸出高波動的微基準標記

FileInputStream fis = new FileInputStream("/path/to/binary/file"); 
    BufferedInputStream in = new BufferedInputStream(fis); 

    FileOutputStream fos = new FileOutputStream("/path/to/save/new/binary/file"); 
    BufferedOutputStream out = new BufferedOutputStream(fos); 

    long before = System.currentTimeMillis(); 
    int data = 0; 

    while ((data = in.read()) != -1) { 
     out.write(data); 
    } 

    in.close(); 
    out.close(); 

    int seconds = (int) (System.currentTimeMillis() - before/1000) % 60; 

    System.out.println("Took " + seconds); 

緩衝或無緩衝,輸出範圍從3到64毫秒。我預計會有更接近的範圍,比如40-50或10-20或30-40。這種高波動的原因是什麼?

回答

2

通過只運行一個測試,您不能期望結果的一致性,尤其是涉及系統調用和文件I/O時。

通過採取以下步驟來提高測量的意義。

+0

使用nanoTime給了我與currentTimeMillis相同的結果。所以我將不得不運行多個測試並從那裏獲取平均值。 – 2012-02-16 19:03:25

0

文件I/O可以有很多參與「隨機性」的:

  • 這是一個系統調用,所以你基本上是等待,直到IO調度決定來處理您的請求
  • 這可能是硬盤驅動器,這需要時間從
  • 閱讀它可以在內存中,這就是快(ER)緩存
  • 一些其他進程可能會做重我對/ O
  • 一些其他過程可以獨佔CPU

cheeken的建議如何處理這個問題。

+2

可能是星期二,月亮可能會減少,冰淇淋卡車可能會在街上行駛。所有這些似乎都會影響微基準。永遠,永遠,在2月29日進行測試。他們只能每4年複製一次。對於試圖複製作品的其他人來說,這只是不利的。 – 2012-02-16 18:26:52

+0

約2月29日的事情只是一個老妻子的故事。有經驗的程序員知道,要獲得最佳性能,請將系統時鐘永久設置爲2月29日:) – emory 2012-02-16 19:30:35