Как элементарно обработать 1 гиг?

Тема в разделе "WASM.A&O", создана пользователем kibernetics, 3 май 2006.

  1. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Quantum

    > "Не помню всплывал такой совет уже или нет..."

    Помнится в одном из топиков я и советовал использовать DLL для автоматизации создания документов в MS Excel\Word. Тут как раз и рулит подход "кто на что учился". Я вот мягко говоря "недолюбливаю" VBA, поэтому всю основную обработку возлагаю на DLL. У приверженцев и знатоков васика может быть противоположный подход - использовать DLL для вспомогательных целей. Например VarPtr это рантайм функция, импортируемая из msvbwm60.dll и представляющая собой пару строчек на ассемблере
    Код (Text):
    1. mov eax,[esp+4]
    2. ret 4
    Поэтому ничего не стоит включить ее в свою простенькую dll. (Кстати если пошевелить мозгами, то наверное можно и в Win API найти простые функции, возвращающие переданное в них значение)



    > "Да и работает он по понятным причинам только в скомпилированном экзешнике"

    А вот эту фразу я не понял. "Такой подход" работает во время исполнения куска кода (функции) и тут не важно создан экзешник заранее или кусок скомпилирован на ходу JIT-компилером (стеки, хипы и указатели никто не отменял и отменять не собирается, по кр.мере для х86)



    PS: попробовал я на досуге "такой подход" в MS Word 97 и 200? - полет нормальный :)) И выделение глобальных\локальных переменных и передача параметров самые обычные, т.е. например объявляя друг за другом Arr() и Long, можно по адресу второй переменной определить адрес предыдущей.

    PSS: SAFEARRAY я думаю тоже врядли кто в ближайшее время "отменит" - на нем "все" OLE сидит и в oleaut32.dll есть пара десятков функций SafeArrayXXX.



    mix_mix

    Ну ты батенька загнул ;) Автору топика достаточно было просто со своим васиком разобраться и получить заветные 1.5 минуты на обработку 1Гб. А MMX\SSE тут вообще ни причем - читаем кусок из одного места и пишем в другое - винда со своим файловым кэшем и ленивой записью сама все прекрасно разруливает и никакое ручное укрупнение блоков чтения\записи практического выигрыша не дает
     
  2. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    leo

    Просто связка MOVAPD+MOVNTPD намного быстрей REP MOVSD :)
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo



    LockResource такое делает.





    Вы же сами указали на ошибку в variant. В скомпилированном экзешнике это поле в моих экспериментах не проверялось, а в JIT, наверное, проверяется всегда. Если учесть все тонкости, будет работать и в JIT.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Quantum

    > "LockResource такое делает"

    Действительно работает. Хотя по грозному описанию типа "Do not pass any value..." ни за что не догадаешься. Поэтому вроде как и нет полной уверенности, что это будет работать во всех версиях винды. Или это древний баг, бережно охраняемый из соображений совместимости ?



    > "Если учесть все тонкости"

    Я это и имел ввиду - полностью воспроизвести валидную структуру SAFEARRAY, включая до кучи "скрытый" параметр VarType = vbByte по смещению -4.

    Например, можно включить объявление массива в структуру:
    Код (Text):
    1. type XXX 'название по вкусу :))
    2.   Buf() as Byte         'по сути Long - указатель на DimsAndFlags
    3.   ElemType as Long      '= vbByte (VBVarType)
    4.   DimsAndFlags as Long  '= &H800001, 1 - размерность, 80h - наличие VarType по смещению (-4)
    5.   ElemSize as Long      '= 1 - размер элемента
    6.   Locks as Long         '= 0 - число блокировок
    7.   lpMem as Long         '= указатель на внеш.память
    8.   ElemCount             '= число эл-тов = размеру блока памяти в байтах
    9.   LowIndex as Long      '= 0 - начальный индекс массива
    10. end type
    Кстати во флагах можно попробовать добавить признаки STATIC и FIXEDSIZE - чтобы VB не пытался удалять массив в случае невызова Unbind



    PS: Расписывать Bind\Unbind ес-но лень ;) Если любители васика проснутся, тогда еще можно будет порассуждать :))
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo



    Совместивости на уровне исходников с Win16. Возможно, ещё и с Win32s.





    Тут уже статью писать можно :)
     
  6. diakin

    diakin New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2006
    Сообщения:
    1
    Hi!
    Сказали же - юзайте FreeBasic
    Кроме обычных для Бейсика элементов языка, в этом компиляторе реализован ряд возможностей, существенно расширяющих базовый синтаксис . Речь идет о поддержке указателей, о расширенном наборе встроенных типов, о пользовательских типах, о перегрузке функций, о поддержке инструкций на языке ассемблера (X86) и о многом другом, что делает FreeBASIC полноценным средством разработки программ. Приложения могут разрабатываться для 32-разрядных операционных систем: MS Windows, Linux и DOS.

    Компилятор FreeBASIC позволяет создавать бинарные файлы различных форматов: OBJ, LIB, DLL, а также EXE (например, консольные и GUI-приложения для Win32). Так, для создания статической или динамической библиотеки достаточно добавить лишь один ключ в командную строку компилятора: -lib или -dll.

    Все компоненты FreeBASIC (в том числе и сторонних разработчиков) являются свободными (то есть не предусматривают лицензионных сборов за их использование в коммерческих или некоммерческих целях), исключая только библиотеку GoRC для Win32. Ассемблер, компоновщик, архиватор и другие утилиты, входящие в инсталляционный пакет, взяты из GNU binutil programming tools.


    http://www.freebasic.net/
    http://www.freebasic.net/forum/

    А это так, для примера

    Код (Text):
    1. type sometype
    2.     a           as integer
    3.     b           as short
    4.     bytefunc    as function( ) as byte ptr
    5.     strfunc     as function( byval s as string ) as string
    6. end type
    7.  
    8. type bar
    9.     a           as integer
    10.     b           as short
    11.     c           as byte
    12.     func        as function( ) as sometype ptr
    13. end type
    14.  
    15. declare function foo ( ) as bar ptr
    16.  
    17.     '' string function
    18.     print foo( )->func( )->strfunc( "abc" )
    19.  
    20.     '' change value (kids, don't do that at home!)
    21.     *foo( )->func( )->bytefunc( ) = 8
    22.    
    23.     '' do nothing, skip result
    24.     foo( )->func( )->bytefunc( )
    25.  
    26. .... итеде
     
  7. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Короче, маппинг не юзай ничего не выиграешь. Пользуй Read*, Write*, SetFilePointer, CloseHandle всё из kernel32 ессесно. Почитай примеры из МСДН и будет тебе обработка файла при помощи АПИ...