Текущий архив: 2004.06.06;
Скачать: CL | DM;
Вниз
почему так ??? Найти похожие ветки
← →
GanibalLector © (2004-05-23 16:01) [0]Решил я в одной своей проге сохранение файлов сделать не через assignfile а через createfile(ну на API).Сделал все работает.Потом решил проверить,а кто быстрее работает assingfile или createfile.Естественно думал ,что createfile быстрее,НО...
У меня получилась следующая статистика:
-через createfile файл размером 40М создавался 1,87сек
-через assignfile тот же файл(40М) создавался 1,12 сек
Кто нибудь мне может обьяснить почему так???
← →
jack128 © (2004-05-23 16:06) [1]и тот и другой код приведи, а там видно будет.может делфи кеширует запись на винт(хотя СИЛЬНО сомниваюсь, но вдру ;-)), а может ты что то не так сделал..
← →
GanibalLector © (2004-05-23 16:32) [2]procedure TForm1.Button1Click(Sender: TObject);
var ffile:textfile;
i,T1:integer;
begin
deletefile("C:\fucke1.txt");
T1:=GetCurrentTime;
assignfile(ffile,"C:\fucke1.txt");
rewrite(ffile);
for i:=1 to 800000 do
writeln(ffile,"tratatatatatatata");
closefile(ffile);
Caption:=inttostr(GetCurrentTime-T1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var F:THandle; Dw:Dword;i,T1:integer;
begin
deletefile("C:\fucke2.txt");
T1:=GetCurrentTime;
f:=CreateFile(
pChar("C:\fucke2.txt"),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0);
SetFilePointer(f,0,nil,FILE_END);
for i:=1 to 800000 do
WriteFile(f,"tratatatatatatata"+#10#13,19,Dw,nil);
closehandle(f);
Caption:=inttostr(GetCurrentTime-T1);
end;
← →
VMcL © (2004-05-23 16:42) [3]>>GanibalLector © (23.05.04 16:32) [2]
1.
Перезагрузись. Нажми Button1. Запиши результат.
Перезагрузись. Нажми Button2. Запиши результат.
2. GetCurrentTime - не очень-то точный измеритель для малых промежутков времени. Попробуй QueryPerformanceFrequency() + QueryPerformanceCounter() или инструкцию процессора RDTSC.
← →
GanibalLector © (2004-05-23 16:45) [4]2 VMcL © (23.05.04 16:42) [3]
А нафига перегружаться???В чем фишка???
← →
Palladin © (2004-05-23 16:48) [5]Работа с текстовыми файлами идет через буффер.
← →
GanibalLector © (2004-05-23 16:48) [6]2 VMcL © (23.05.04 16:42) [3]
> GetCurrentTime - не очень-то точный измеритель для малых промежутков времени
Может Вы и правы,но разница существенная.Я увеличил значение переменной i.Получил примерно следующее :4 сек. и 20 сек.
← →
GanibalLector © (2004-05-23 16:49) [7]2 Palladin © (23.05.04 16:48) [5]
Так а что делать???Как увеличить скорость в АПЯХ???
← →
Palladin © (2004-05-23 16:52) [8]Организовать свой буффер.
← →
GanibalLector © (2004-05-23 16:55) [9]2 Palladin © (23.05.04 16:52) [8]
Т.е. примерно так :
for i:=1 to 800000 do
...заполняем буфер
WriteFile(f,буффер,length(буффер),Dw,nil);
Я правильно Вас понял???
← →
Palladin © (2004-05-23 17:00) [10]Да, примерно так, только не нужно такой здоровый буффер. Хотя бы килобайт в 16, время записи уже уменьшится...
← →
GanibalLector © (2004-05-23 17:03) [11]2 Palladin © (23.05.04 17:00) [10]
Ок.Попробуем-с.Спасибо,кстати...
← →
VMcL © (2004-05-23 20:59) [12]>>Palladin © (23.05.04 16:52) [8]
Хммм. Думаю дело не в буфере. Софтварный дисковый кеш, имеющийся в Винде, никто вроде не отменял, так что странно...
← →
Palladin © (2004-05-23 21:03) [13]
> [12] VMcL © (23.05.04 20:59)
Согласитесь, есть все таки разница между тысячью записями в кеш по 19 байт и 19тью записями по тысяче байт....
← →
Anatoly Podgoretsky © (2004-05-23 21:17) [14]VMcL © (23.05.04 20:59) [12]
Именно в буфере, кеш к этому отношение не имеет, время здесь тратится на вызов API функции. Легко проверить сделать запись большого файла по одному байту и блоками по 4кб. Тоже повторить для файлов Паскаля, в которых обращение к АПИ будет только после заполнения внутреннего буфера.
← →
GanibalLector © (2004-05-23 21:45) [15]2 Anatoly Podgoretsky and Palladin
Спасибо еще раз...
Страницы: 1 вся ветка
Текущий архив: 2004.06.06;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.02 c