Страница 1 из 1
Добавлено: 24 Февраль 2004, 18:57
Гость
Добрый день.
Надо последовательно писать одну строку в файл. Затем последовательно считывать.
Главный критерий скорость. Наверно ASCII самый шустрый???
Спасибо.
Сергей.
Njgor@ru.mos.ru
Написал: ClaList(2)
Добавлено: 25 Февраль 2004, 6:15
Гость
Чаще всего, когда мне требуется скорость я использую не файл, а Queue.
Выигрыш по скорости при этом, как правило, будет в разы.
Написал: Anatoly(38)
Добавлено: 25 Февраль 2004, 10:05
Гость
Самый быстрый - винапи

Тока буферок надо завести и порядок...
Если надо кину примерчик.
А так DOS или ASCII...
Буфер делай порядка 10кил и будет тебе счастье.
Сергей.
Наверно ASCII самый шустрый???
В общем случае - нет. В частном случае - для клаши версий до C55 - _совсем_ нет.

Ибо в старых версиях ASCII-драйвер работает убийствено медленно (на пару порядков проигрывал ручной работе с файлами). Сейчас драйвер достаточно быстрый - рукми удается выиграть процентов 30%-40%.
Так что самый шустрый вариант - делать чтение-запись через API большими блоками. Самый простой - работать через DOS-драйвер.
--
Best regards,
Vadym mailto:
vadim@softcreator.com
ICQ: 82308757
Написал: ClaList(2)
Добавлено: 25 Февраль 2004, 10:09
Гость
И сколько строк всего ожидается записАть? А сколько раз по сколько строк считывать?
Если всего одна строка - так завести переменную типа String(...) :gigi:
Если ее надо хранить между сеансами - так PutINI ее...
2Anatoly: Не в разы, а в сотни (как минимум) раз.
Написал: PigKiller(45)
Добавлено: 25 Февраль 2004, 12:31
Гость
Пример чтения/записи файлов через API лежит на моём сайте в разделе
Download.
Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group:
clarion@yahoogroups.com
Написал: ClaList(2)
Добавлено: 25 Февраль 2004, 12:32
Гость
Еще один вариант
Best regards,
Andrew Listiev
Work mailto:
andrewl@inbox.lv
Home mailto:
gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger:
werdna_werdna@hotmail.com
Написал: ClaList(2)
Добавлено: 25 Февраль 2004, 15:37
Гость
Hello, Andrew!
Решил проверить на всем, что было под рукой. Вот результаты:
Код: Выделить всё
время (сек.)
метод сетевой диск локальный диск
print(перл) 11 16
fprintf(си) 12 18
winapi(си/клара) 247/248 30/17 <-- ничего не понимаю!
драйвер ASCII 23.5 28
драйвер DOS 25 27.5
Строчка
str cstring('This is a test string to write to some text file<10>')
писалась мильйон раз в файл. Для ASCII <10> в конце был убран.
А теперь кто-нибудь сможет объяснить, почему винду колбасит при записи на сеть?
На всякий случай: на сервере FreeBSD, samba 2.2.4.
И почему можут быть такая разница в винапишных цифрах для одной и той же программы на разных языках?
Все тесты гонялись несколько раз, поочередно, созданные файлы убивались, т.е. пытался как-то избежать влияния дискового кеша.
--
Best regards,
Maxim Yemelyanov,
Enigma Soft Company
phone: +380 572 177977
WEB:
http://enigmasoft.com.ua
e-mail:
clalist@enigmasoft.com.ua
ICQ: 12253836
Пробовали в ASCII читать-писать через API и через VB6. Второе быстрее в 2 раза.
Сергей.
(Добавление)
Привет!
Еще один вариант
Ну, тогда уж и мой возьмите 
В аттаче примерчик с классами буферизованных байт-потоков на чтение и запись. Размером буфера можно рулить через второй параметр методов Reinit.
По дефолту 10кил.
Ввиду специфики задачи реализованы именно байт-потоки (не char), поэтому в примере дважды производятся ненужные преобразования из байта в чар и обратно. Если будет критично - feel free to make your changes 
Сергей.
(Добавление)
Решил проверить на всем, что было под рукой.
Исходники(примеры) в студию!
Clarion и WinAPI. Остального инструмента у меня нет. 
Потестируем!...
Строчка
str cstring('This is a test string to write to some text file<10>')
писалась мильйон раз в файл. Для ASCII <10> в конце был убран.
По ходу дела...
А почему только <10> ? Кажется стандартно идёт <13,10>. Или я ошибаюсь?
Сергей - chusha@mail333.com ; chusha@hotbox.ru
Написал: ClaList(2)
Добавлено: 25 Февраль 2004, 17:44
Гость
Юних
Best regards,
Andrew Listiev
Да и нужно не "мильйон раз" писать по 50 байт, а накапливать буферок кил на 50 хотя бы и уже его сбрасывать на диск - тогда и скорость будет. А тормоза при чтении регламентируются даже не самим чтением (подразумевается, что читаем блоками, а не побайтово), а парсингом буфера в поисках возврата картеки. Ну у меня так было по крайней мере...
--
Best regards,
Vadym
(Добавление)
Потестируем!...
в конце письма, если интересно. можно еще открытие/закрытие файла не учитывать в
таймауте.
А почему только <10> ? Кажется стандартно идёт <13,10>. Или я ошибаюсь?
Да и нужно не "мильйон раз" писать по 50 байт, а накапливать буферок кил на 50 хотя бы и уже его сбрасывать на диск - тогда и скорость будет.
Блин, ты прав! Результаты с 50000-байтовым буфером, писавшимся 1000 раз:
Код: Выделить всё
net local
c fwrite: 6.42 9.5
c winapi: 5.9 10.0
clara ascii: 7.0 6.7
clara dos: 6.6 7.3
clara winapi: 6.1 8.6
Так что пофиг на чем делать.
На всякий случай - у меня 4-я клара. Мало ли чего они в последующих версиях в драйверах меняли.
А тормоза при чтении регламентируются даже не самим чтением (подразумевается, что читаем блоками, а не побайтово), а парсингом буфера в поисках возврата картеки. Ну у меня так было по крайней мере...
Чтение ускорится за счет обращения к уже откешированным данным.
Код: Выделить всё
! winapi test
PROGRAM
_ABCDllMode_ EQUATE(0)
_ABCLinkMode_ EQUATE(1)
INCLUDE('MAXY_win32data.clw')
MAP
INCLUDE('MAXY_win32inc.clw')
END
lTIMES equate(1000)
t1 ulong
t2 ulong
f ulong
wr ulong
fname cstring('cl-winapi.txt')
str string(50000)
CODE
str = all('a', size(str))
t1 = GetTickCount()
f = CreateFile(address(fname), GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0)
if f = INVALID_HANDLE_VALUE
return
end
loop lTIMES times
WriteFile(f, address(str), size(str), wr,0)
end
CloseHandle(f)
t2 = GetTickCount()
stop('elapsed time: '&Format((t2-t1)/1000, @n_10.3 ))
!eof
--
Best regards,
Maxim Yemelyanov
Нет, я не о выигрыше от кеша. Я о данных, которые читаются заведомо первый раз. Так вот еще раз - ascii-драйвер в версиях до C55 читал крайне медленно...
А писать - так там что dos, что ascii формат - все едино. Что, собственно, твой тест и показал.
--
Best regards,
Vadym
Написал: ClaList(2)
Добавлено: 27 Февраль 2004, 11:41
Гость
Так что пофиг на чем делать.
На всякий случай - у меня 4-я клара. Мало ли чего они в последующих версиях в драйверах меняли.
что то не получается даже приблизительно что то похожее получить.
написал я тестик, и как положено с /FILEBUFFERS
API подход всегда выигрывает в разы, DOS всегда выигрывает у ASCII
C55
ЗЫ
а чем файлы открывал в API, часом не FileOpen ?
Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group:
clarion@yahoogroups.com
(Добавление)
а чем файлы открывал в API, часом не FileOpen ?
CreateFile
Глянь в мое вчерашнее письмо Чушкину, там внизу код.
cw4, может в этом дело? Если они меняли драйвера, то очень даже может быть.
--
Best regards,
Maxim Yemelyanov
API в разы не выигрывает - если сравнивать с C55.
Процентов 30-40 можно получить выигрыш от силы.
и DOS выиграет либо в интегрировнном тесте либо при чтении - при записи оба драйвера должны работать практичкески одинаково.
Так что цифры теста более-менее адекватны - там же только запись сравнивалась.
--
Best regards,
Vadym
Написал: ClaList(2)
Добавлено: 27 Февраль 2004, 11:49
Гость
ну не знаю, вот результат моего теста
Andrew Myalin
Написал: ClaList(2)
Добавлено: 27 Февраль 2004, 12:01
Гость
Да, у меня соотношение получилось таким же.
А потом я увеличил буфера до 10000, и к-во повторений до 1000.
Результат в аттаче. Что скажешь на это? У себя попробуешь?
--
Best regards,
Maxim Yemelyanov
Написал: ClaList(2)
Добавлено: 27 Февраль 2004, 12:02
Гость
Попробовал, цифры приблизительно те же.
API вариант выигрывает в разы, DOS выигрывает у ASCII
Sorry, DOS не выигрывает у ASCII на больших размерах записи
Andrew Myalin
Написал: ClaList(2)
Добавлено: 27 Февраль 2004, 12:04
Гость
А насчет сопутствующих обстоятельств? Буферизация чтения-записи для каждого случая и прочее...
и насчет ASCII в таком разрезе не стОит говорить. Ты же не делаешь пост-подготовку буфера записи при чтении через api - а драйвер делает.
но даже и при этом что-то совсем старнные данные у тебя для чтения через ASCII выходят. Смахивает на то, как это было в C5.
Да... видать меня память подвела. Поднял свои классы трехлетеней давности, сделал тест (интегрированный - копирование мегайбатового текстового файла) - выходит, что работа с файлом в "дос-режиме" все же пока что весьма выгодна именно руками. если работать с файлом как с текстом - то выигрышь неочевиден в зависимости от условия буфферизации - иногда у меня самопальный класс давал и худшие результаты относительно работы через ASCII-драйвер. В аттаче характерные цифры.
да еще - всюду буфер записи один килобайт
--
Best regards,
Vadym
(Добавление)
Глянь в мое вчерашнее письмо Чушкину, там внизу код.
cw4, может в этом дело? Если они меняли драйвера, то очень даже может быть.
Драйвера ЧЕГО?
Best regards,
Andrew Listiev
Work mailto:
andrewl@inbox.lv
Home mailto:
gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger:
werdna_werdna@hotmail.com
(Добавление)
Глянь в мое вчерашнее письмо Чушкину, там внизу код.
cw4, может в этом дело? Если они меняли драйвера, то очень даже может быть.
Драйвера ЧЕГО?
Best regards,
Andrew Listiev
ASCII/DOS
--
Best regards,
Maxim Yemelyanov
Сорри.
Понял.
Просто меня ввело в заблуждение обсуждение CreateFile... И вольно невольно подумал при чем здесь драйвер?
Best regards,
Andrew Listiev
Глянул текст.
Немного отличаются вызовы в CreateFile
и декларация WriteFile у меня другая немного.
но по большому счёту очень похоже.
У тебя CW4, я на сайте выложил удобный класс чтения/записи через API и ещё кое что, от сегодняшнего числа.
там же и тестик, про который я говорил, если будет желание, глянь на результаты, там всё в исходниках.
Andrew Myalin
Написал: ClaList(2)