leo Кстати у меня скорость обработки инфы в сотни раз быстрее, чем подобные в моей области сделаны на Васиках.
Valentin Дело не столько в самом Васике или асме, сколько в неверном (бездумном) использовании стандартных средств языка. Если для твоей задачи бесхитростно юзать склейку динамических строк в виде S=S+S1, то тормоза будут по любому - и в васике, и в дельфях и С++, т.к. при достаточно большой длине S будут возникать перераспределения памяти под S с копированием больших объемов данных из одного блока памяти в другой - а тут тебе и тормоза чтения\записи из-за невлезания данных в кэш процессора и отказы страниц и т.п., и все это может повторяться десятки-сотни раз. А если сразу выделить под результирующую строку блок памяти достаточно большого размера, то ничего этого не будет и скорость склейки будет значительно выше - и в си, и в дельфях, и в васике (если юзать функции АПИ CopyMemory и т.п.)
leo Согласен. Я заметил ч-з прогрессбар что с накоплением строки работа идет все медленнее и медленее, понятно. А как указать на конец буфера?? Если Вы опытный в памяти, приведите пожалуqста пример накопления строки в памяти. В ссылках на Ваши посты есть примеры, но архивы 7z не открываюся/
Valentin 1. Разово выделяешь 10-мегабайтовй буффер через VirtualAlloc 2. Указатель сохраняешь в 2 переменные: указатель на буффер и в указатель на конец строки 3. Делаешь самописную MylstrcpyA, которая после копирования, будет возвращать указатель на конец строки 4. Формируешь строку Думаю, это будет самый быстрый вариант Пример Код (Text): /*---------------------------copy string------------------------------------- char* MylstrcpyA(char* dest, char* src) { char* pointer; _asm { mov esi, [src] mov edi, [dest] copy_string: movsb cmp byte ptr [esi], 0 jnz copy_string mov byte ptr [edi], 0 mov [pointer], edi } return pointer; } Код (Text): /*---------------------------allocate memory------------------------------------- buff = VirtualAlloc(0, 0A00000h, MEM_COMMIT, PAGE_READWRITE); //buffer eos = (PCHAR)buff; //end of string /*---------------------------sample---------------------------------------------- eos = MylstrcpyA(eos, S1); eos = MylstrcpyA(eos, S2); eos = MylstrcpyA(eos, S3); eos = MylstrcpyA(eos, Sn); Дальше уже идет железная оптимизация, например замена опкодов на более быстрые, спаривающиеся, и.д. и.т.п. Я этих тонкостей не знаю, в этом поможет leo PS: если вдруг нужно онулить всю 10-мегабайтную строку, то делаешь так: Код (Text): eos = (char*)buff; eos[0] = 0;
в этом случае строка не будет завершена 0 считаю необходимым сделать как минимум mov byte ptr [edi],0 после цикла - мало ли как строка еще будет использоваться
int2e Я работаю на МАSM32, нужен перевод: пока так: ; ---------------------------copy string------------------------------------- MylstrcpyA proc destWORD, srcWORD) LOCAL pointerWORD mov esi, [src] mov edi, [dest] copy_string: movsb cmp byte ptr [esi], 0 jnz copy_string mov byte ptr [edi], 0 mov [pointer], edi ret MylstrcpyA endp Теперь с памятью: ;---------------------------allocate memory------------------------------------- buff dd ? eos dd ? invoke VirtualAlloc,0, 0A00000h, MEM_COMMIT, PAGE_READWRITE mov buff,eax = (PCHAR)buff; //end of string ========= как здесь??? ;---------------------------sample---------------------------------------------- invoke MylstrcpyA, addr eos, addr S1
Код (Text): MylstrcpyA proc dest:DWORD, src:DWORD mov esi, [src] mov edi, [dest] copy_string: movsb cmp byte ptr [esi], 0 jnz copy_string mov byte ptr [edi], 0 mov eax, edi ret MylstrcpyA endp Код (Text): buff dd ? eos dd ? invoke VirtualAlloc,0, 0A00000h, MEM_COMMIT, PAGE_READWRITE mov [buff],eax mov [eos], eax Код (Text): invoke MylstrcpyA, dword ptr [eos], addr S1 mov [eos], eax invoke MylstrcpyA, dword ptr [eos], addr S2 mov [eos], eax ;... invoke MylstrcpyA, dword ptr [eos], addr Sn mov [eos], eax
int2e Код (Text): copy_string: movsb cmp byte ptr [esi], 0 jnz copy_string mov byte ptr [edi], 0 ; mov eax, edi - так не получается, строка уже в eax ret теперь после выполнения: Код (Text): invoke MylstrcpyA, dword ptr [eos], addr S1 mov [eos], eax в [eos] -строки нет. И еще, где учавствует buff -?
По стандарту, функции возвращают значение в еах. Там строки и не будет. Там будет указатель на нее Если тебе понадобится освободить память либо занулить массив, то тут пригодится buff