Скорость читать-писать
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Самый быстрый - винапи 
Тока буферок надо завести и порядок...
Если надо кину примерчик.
А так DOS или ASCII...
Буфер делай порядка 10кил и будет тебе счастье.
Сергей.
Ибо в старых версиях ASCII-драйвер работает убийствено медленно (на пару порядков проигрывал ручной работе с файлами). Сейчас драйвер достаточно быстрый - рукми удается выиграть процентов 30%-40%.
Так что самый шустрый вариант - делать чтение-запись через API большими блоками. Самый простой - работать через DOS-драйвер.
--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757
Написал: ClaList(2)

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

Так что самый шустрый вариант - делать чтение-запись через API большими блоками. Самый простой - работать через DOS-драйвер.
--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757
Написал: ClaList(2)
Пример чтения/записи файлов через API лежит на моём сайте в разделе
Download.
Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com
Написал: ClaList(2)
Download.
Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com
Написал: ClaList(2)
Еще один вариант
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)
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)
Hello, Andrew!
Решил проверить на всем, что было под рукой. Вот результаты:
Строчка
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. Остального инструмента у меня нет.
Потестируем!...
По ходу дела...
А почему только <10> ? Кажется стандартно идёт <13,10>. Или я ошибаюсь?
Сергей - chusha@mail333.com ; chusha@hotbox.ru
Написал: ClaList(2)
Решил проверить на всем, что было под рукой. Вот результаты:
Код: Выделить всё
время (сек.)
метод сетевой диск локальный диск
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)
Юних 
Best regards,
Andrew Listiev
Да и нужно не "мильйон раз" писать по 50 байт, а накапливать буферок кил на 50 хотя бы и уже его сбрасывать на диск - тогда и скорость будет. А тормоза при чтении регламентируются даже не самим чтением (подразумевается, что читаем блоками, а не побайтово), а парсингом буфера в поисках возврата картеки. Ну у меня так было по крайней мере...
--
Best regards,
Vadym
(Добавление)
таймауте.
Так что пофиг на чем делать.
На всякий случай - у меня 4-я клара. Мало ли чего они в последующих версиях в драйверах меняли.
--
Best regards,
Maxim Yemelyanov
Нет, я не о выигрыше от кеша. Я о данных, которые читаются заведомо первый раз. Так вот еще раз - ascii-драйвер в версиях до C55 читал крайне медленно...
А писать - так там что dos, что ascii формат - все едино. Что, собственно, твой тест и показал.
--
Best regards,
Vadym
Написал: ClaList(2)

Best regards,
Andrew Listiev
Да и нужно не "мильйон раз" писать по 50 байт, а накапливать буферок кил на 50 хотя бы и уже его сбрасывать на диск - тогда и скорость будет. А тормоза при чтении регламентируются даже не самим чтением (подразумевается, что читаем блоками, а не побайтово), а парсингом буфера в поисках возврата картеки. Ну у меня так было по крайней мере...
--
Best regards,
Vadym
(Добавление)
в конце письма, если интересно. можно еще открытие/закрытие файла не учитывать вПотестируем!...
таймауте.
Блин, ты прав! Результаты с 50000-байтовым буфером, писавшимся 1000 раз:А почему только <10> ? Кажется стандартно идёт <13,10>. Или я ошибаюсь?
Да и нужно не "мильйон раз" писать по 50 байт, а накапливать буферок кил на 50 хотя бы и уже его сбрасывать на диск - тогда и скорость будет.
Код: Выделить всё
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)
что то не получается даже приблизительно что то похожее получить.Так что пофиг на чем делать.
На всякий случай - у меня 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
(Добавление)
CreateFileа чем файлы открывал в API, часом не FileOpen ?
Глянь в мое вчерашнее письмо Чушкину, там внизу код.
cw4, может в этом дело? Если они меняли драйвера, то очень даже может быть.
--
Best regards,
Maxim Yemelyanov
API в разы не выигрывает - если сравнивать с C55.
Процентов 30-40 можно получить выигрыш от силы.
и DOS выиграет либо в интегрировнном тесте либо при чтении - при записи оба драйвера должны работать практичкески одинаково.
Так что цифры теста более-менее адекватны - там же только запись сравнивалась.
--
Best regards,
Vadym
Написал: ClaList(2)
А насчет сопутствующих обстоятельств? Буферизация чтения-записи для каждого случая и прочее...
и насчет ASCII в таком разрезе не стОит говорить. Ты же не делаешь пост-подготовку буфера записи при чтении через api - а драйвер делает.
но даже и при этом что-то совсем старнные данные у тебя для чтения через ASCII выходят. Смахивает на то, как это было в C5.
Да... видать меня память подвела. Поднял свои классы трехлетеней давности, сделал тест (интегрированный - копирование мегайбатового текстового файла) - выходит, что работа с файлом в "дос-режиме" все же пока что весьма выгодна именно руками. если работать с файлом как с текстом - то выигрышь неочевиден в зависимости от условия буфферизации - иногда у меня самопальный класс давал и худшие результаты относительно работы через ASCII-драйвер. В аттаче характерные цифры.
да еще - всюду буфер записи один килобайт
--
Best regards,
Vadym
(Добавление)
Best regards,
Andrew Listiev
Work mailto:andrewl@inbox.lv
Home mailto:gidravlic@mhm.lv
ICQ UID: 169357390
MS Messenger: werdna_werdna@hotmail.com
(Добавление)
Best regards,
Andrew Listiev
ASCII/DOS
--
Best regards,
Maxim Yemelyanov
Сорри.
Понял.
Просто меня ввело в заблуждение обсуждение CreateFile... И вольно невольно подумал при чем здесь драйвер?
Best regards,
Andrew Listiev
Глянул текст.
Немного отличаются вызовы в CreateFile
и декларация WriteFile у меня другая немного.
но по большому счёту очень похоже.
У тебя CW4, я на сайте выложил удобный класс чтения/записи через API и ещё кое что, от сегодняшнего числа.
там же и тестик, про который я говорил, если будет желание, глянь на результаты, там всё в исходниках.
Andrew Myalin
Написал: ClaList(2)
и насчет 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)