Среднее время доступа UNIX

Среднее время доступа UNIX

07.12.2011 05:36:12 Просмотров 31 Источник

Напишите программу, которая будет измерять среднее время доступа к внутренней и внешней памяти (чтение данных из оперативной памяти и с внешней памяти, в качестве которой выступает дискета 3.5). Сравните и обоснуйте полученные результаты. За неимением берётся флоппи-дисковода берётся флешка. И там, и там один и тот же файл.

FILE *f;
long c;
c = clock();
f = fopen("/home/Документы/file.txt", "r");
for (; fgetc(f) != EOF;) ;
c = (clock() - c) / 1000;
printf("hardw read______\n%ldms\n", c);
printf("%fmb/s\n", 262143.0 / (float)c);    // мегабайт в сек   
close(f);

c = clock();
f = fopen("/media/flash/file.txt", "r");
for (; fgetc(f) != EOF;) ;
c = (clock() - c) / 1000;
printf("flash read______\n%ldms\n", c);
printf("%fmb/s\n", 262143.0 / (float)c);
close(f);

В итоге получаю очень похожую скорость. Всё ли верно? Или я где-то не там и не то меряю? Спасибо.

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix#comment60230_60225
файлик где то на 1мб сделайте
https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix#comment60231_60225
а что будет, если попробовать читать что-то большое (сотни мегабайт) ?
https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix#comment60233_60225
shurik, то есть 256 мегабайт много?
https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix#comment60239_60225
нет, я думал что файлик мелкий. + возможно он закешировался, так как вы часто его читаете. Попробуйте на новый тест новый файлик делать. А еще лучше записывать файлик на одном компе а читать на другом, хотя перемонтирование должно сбросить кеш. По коду вроде всё верно

Ответы - Среднее время доступа UNIX / Среднее время доступа UNIX

skegg

07.12.2011 08:48:04

Я вот не понял. Задача - в сравнении скорости чтения из оперативной памяти и с диска. А Вы сравниваете чтение с жесткого диска, где находится Ваша домашняя директория, с флешкой. Мне кажется, тут что-то не то происходит.

А вообще, скорость чтения с современных флешек достаточно велика. Так что если файл небольшой, то больше времени уйдет на системный вызов, внтуриядерные разборки, обращение к порту ввода-вывода, ожидание ответа и т.д., чем на собственно чтение.

https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix/60281#comment60301_60281
сам подозреваю, что делаю не то в первом случае. потому и задал вопрос. не подскажите, как работать с оперативной памятью напрямую?
https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix/60281#comment60310_60281
ну так уже написали - memcpy()
Является ответом!
avp

07.12.2011 09:10:49

В подобной задаче файл надо читать большими блоками (скажем по 64Kbyte). Правильнее будет использовать open()/read() а не fopen()/fread() тем более не fgetc().

В противном случае Вы в основном меряете накладные расходы на память/память.

Вообще здесь, (скорость с файлами) нужно четко понимать, какую скорость Вы хотите измерить - с учетом файлового кэша или без него (т.е. при первом чтении файла кем-либо в системе). Если мерять с кэшем, то файл надо читать несколько раз. Без учета кэша - берите действительно большой файл (скажем гигабайт).

Для измерения скорости работы с памятью выделите 2 больших (сотни мегабайт, скажем 1/2 ОЗУ) блока и копируйте вызывая memcpy(). Для маленьких блоков Вы будете измерять производительность процессорного кэша. Меряйте в цикле,первое измерение не учитывайте.

https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix/60292#comment61579_60292
avp, что-то я не совсем понял как это осуществить. можете пояснить? Желательно с кодом, не совсем как осуществить выделение памяти.(Последний абзац)
https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix/60292#comment61595_60292
Выделить память - malloc().
https://ru.stackoverflow.com/questions/60225/%d0%a1%d1%80%d0%b5%d0%b4%d0%bd%d0%b5%d0%b5-%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%b0-unix/60292#comment61830_60292
спасибо) сдал ещё до вашего ответа)
Закрыть X