Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.025 c
6-1082059289
fatman
2004-04-16 00:01
2004.06.06
TServerSocket внутри NT- сервиса


3-1084808589
Серг
2004-05-17 19:43
2004.06.06
Лицензия FireBird


1-1085570195
Zheka
2004-05-26 15:16
2004.06.06
Правильное открытие файла


1-1085552333
Idiliya
2004-05-26 10:18
2004.06.06
Thread: WinXP+Synchronize=Дружба.


1-1085577396
denis24
2004-05-26 17:16
2004.06.06
вытащить сумму из строки