LINUX.ORG.RU

Ответ на: А ты сам-то как думаешь? от ansky

Мне кажется, что с учётом всяческих кэшей должно работать одинаково. Хотя всё таки системные вызовы ведь дёргаются...

Но виндузятники клянутся, что у них блоками быстрее.

Yareg ★★★
() автор топика
Ответ на: комментарий от Yareg

> виндузятники клянутся, что у них блоками быстрее.

Ну когда это виндузятники правду говорили? На самом деле у них часы тормозят.

ansky ★★★★★
()
Ответ на: комментарий от ansky

Не, ну а на самом деле-то как?

Yareg ★★★
() автор топика

Смотря какими средствами пользоваться: через системные вызовы блоками быстрее будет, через библиотечные функции разницы может и не быть (например, библиотека может буферизовать работу с файлами).

anonymous
()
Ответ на: комментарий от Deleted

Блин, действительно медленней, причём значительно....

131072 bigfile
#include <stdio.h>

char buf[1024];

int main()
{
FILE *file=fopen("bigfile","r");
while(fread(&buf,1,1024,file));
return 0;
}
real 0m0.249s
user 0m0.064s
sys 0m0.176s
#include <stdio.h>

int main()
{
FILE *file=fopen("bigfile","r");
while(fgetc(file)!=EOF);
return 0;
}
real 0m7.607s
user 0m7.388s
sys 0m0.172s
Yareg ★★★
() автор топика

А как тогда быстро работают всякие потоковые хрени. Блоками читают?

Yareg ★★★
() автор топика
Ответ на: комментарий от Yareg

tcp принимает пакетами, соответственно стек приложению сразу весь принятый объем выдает зараз, если размера буфера хватает.

ansky ★★★★★
()
Ответ на: комментарий от Yareg

stdio.h по умолчанию буферизует ввод-ввывод

anonymous
()
Ответ на: комментарий от Yareg

диск тоже с секторами работает.

программа dd — готовый макет для такого эксперимента. там ключики соответствующие есть.

ansky ★★★★★
()
Ответ на: комментарий от Yareg

Про затраты на вызов функций не забывай: одному вызову fread будет соответствовать до 1024 вызовов fgetc

anonymous
()
Ответ на: комментарий от Yareg

Блоками. У тебя есть ещё какие-то варианты? Впрочем, некоторые из них используют обычный потоковый интерфейс. Т.е. fread()/frite(). Но если будешь читать блоками, то лучше использовать read()/write()

mikki
()
Ответ на: комментарий от Yareg

В оффтопике только не вздумай говнопозиксовые АПИ использовать.

anonymous
()
Ответ на: комментарий от anonymous

Хм... Точно, надо для чистоты эксперимента добавить 1023 вызова пустой функции на каждое считывание.

Yareg ★★★
() автор топика
Ответ на: комментарий от ansky

При чём тут тцп и диск с секторами?

Я имею ввиду всякие вещи вроде греп, как они читают, блоками или посимвольно? Или вообще построчно?

Yareg ★★★
() автор топика
Ответ на: комментарий от mikki

Рид и райт не совсем кроссплатформено же?.. Хотя, мне это, конечно, не очень важно...

Yareg ★★★
() автор топика
Ответ на: комментарий от Yareg

Ну как бы strace -e trace=open,read grep «root» /etc/passwd

И всё видно, какими блоками. Есть ещё поле IO Block в stat(1), но греп на него лично у меня не обращает внимания и читает по 32К.

lodin ★★★★
()
Ответ на: комментарий от anonymous

Хех, а ведь и правда такой код

#include <stdio.h>

char buf[1024];

func(char a)
{
  static c=0;
  c++;
}

int main()
{
  FILE *file=fopen("bigfile","r");
  while(fread(&buf,1,1024,file))
    for(int i=0;i<1023;i++)
      func(buf[i]);
  return 0;
}

работает уже

real    0m2.629s
user    0m2.388s
sys     0m0.176s
Yareg ★★★
() автор топика
Ответ на: комментарий от Yareg

грепу для чтения нет никакой разницы, пайп у него на входе или его заставили обычный файл открыть. И что у него там за пайпом (tcp или чей нибудь stdout) ему тоже до определенной степени по барабану.

Обычно так, как ты в последнем посте и написал. читается в буфер, а буфер уже обрабатываешь, как тебе надо. греп и ему подобные читают в буфер, а работают со строками.

Конечно, можно и побайтно считывать, так проще писать, проверок меньше. Если что-то одноразовое надо для себя сляпать, то почему бы и нет... Однако если такое в оренсорц выложить, то сразу в криворукости обвинят и перепишут на другой день.

ansky ★★★★★
()

всё зависит от всего

фс тип носителя щина данный и интерфейс, вплоть до ревищии материнки так что пробуйте

Теоретически блоками быстрее.

guilder
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.