2013-12-18 62 views
3

[請原諒我的困惑:原帖有「SSD」,而不是「HDD」的稱號,但我想通了,我偶然進行的測試上的HDD,如我正在訪問錯誤的掛載點。在SSD上這種現象沒有發生。不過有趣的是,它發生的硬盤驅動器,雖然]快速閱讀 - 奇怪的現象

我使用下面的代碼從固定大小的文件中給定數量的循環讀取。所有要讀取的文件都存在並且讀取成功。

顯然,改變文件大小有效果的fMBPerSecond,因爲讀書比頁面尺寸文件時,還是整個頁面被讀取。但是,nNumberOfFiles也對fMBPerSecond有影響,這是我不明白的。顯然,它不是nNumberOfFiles本身有效,但它是產品nNumberOfFiles * nFileSize

但爲什麼它應有的作用?文件在循環中依次打開/讀取/關閉。

nFileSize = 65536測試。當選擇nNumberOfFiles = 10000(或更小)我得到了一些東西fMBPerSecond = 500 MB/s。與nNumberOfFiles = 20000我得到了一些東西fMBPerSecond = 100 MB/s,這是一個戲劇性的損失。

哦,我要指出,我通過執行讀之前清除磁盤高速緩存:

sudo sync 
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches' 

任何想法是在這裏發生在幕後將受到歡迎。

Pedram

void Read(int nFileSize, int nNumberOfFiles) 
{ 
    char szFilePath[4096]; 

    unsigned char *pBuffer = new unsigned char[nFileSize]; 

    Helpers::get_timer_value(true); 

    for (int i = 0; i < nNumberOfFiles; i++) 
    { 
     sprintf(szFilePath, "files/test_file_%.4i", i); 

     int f = open(szFilePath, O_RDONLY); 

     if (f) 
     { 
      if (read(f, pBuffer, (ssize_t) nFileSize) != (ssize_t) nFileSize) 
       printf("error: could not read file '%s'\n", szFilePath); 

      close(f); 
     } 
     else 
     { 
      printf("error: could not open file for reading '%s'\n", szFilePath); 
     } 
    } 

    const unsigned int t = Helpers::get_timer_value(); 

    const float fMiliseconds = float(t)/1000.0f; 
    const float fMilisecondsPerFile = fMiliseconds/float(nNumberOfFiles); 
    const float fBytesPerSecond = 1000.0f/fMilisecondsPerFile * float(nFileSize); 
    const float fMBPerSecond = fBytesPerSecond/1024.0f/1024.0f; 

    printf("t = %.8f ms/%.8i bytes - %.8f MB/s\n", fMilisecondsPerFile, 
     nFileSize, fMBPerSecond); 

    delete [] pBuffer; 
} 
+0

是否有任何理由將其標記爲C++,甚至任何語言? – user1810087

+0

這真的是一個編程問題嗎? –

+3

這個問題似乎無關緊要,因爲它涉及硬件性能,似乎與編程無關。 –

回答

1

有幾個SSD的機型,特別是更昂貴的數據中心模式,即與(慢)持續性非細胞結合內部DRAM高速緩存。只要您讀取的數據適合DRAM緩存,您將獲得更快的響應速度。