[請原諒我的困惑:原帖有「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;
}
是否有任何理由將其標記爲C++,甚至任何語言? – user1810087
這真的是一個編程問題嗎? –
這個問題似乎無關緊要,因爲它涉及硬件性能,似乎與編程無關。 –