[혼란스러운 점 : 원래 게시물에는 제목에 "HDD"대신 "SSD"가 있지만 사고로 HDD에서 테스트를 수행 한 것으로 알았습니다. 잘못된 장착 지점에 접근하고있었습니다. SSD에서이 현상은 발생하지 않았습니다. HDD의 경우에도 여전히 흥미 롭습니다.]리눅스에서 HDD를 빨리 읽는 것 - 이상한 현상
일정한 크기의 파일에서 루프를 읽으려면 다음 코드를 사용합니다. 읽을 파일이 모두 있고 읽기가 성공했습니다.
파일 크기를 변경하면 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'
모든 아이디어를 환영 할 것이다.
페드 람은
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
정말 프로그래밍 문제입니까? –
이 질문은 하드웨어 성능에 관한 것이므로 프로그래밍과 관련이없는 것 같습니다. –