Страница 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)