3 года назад

Быстрота выполнения функции в цикле несколько раз подряд...

может кто скажет... я написал функцию заполнения нулями какой-то области памяти. Когда я вызываю один раз свою функцию, то по результатам она выполняется в 2-3 раза быстрее чем memset, а вот если я вызываю свою функцию в цикле, к примеру 1000 раз, то моя функция выполняется в 3 раза медленнее чем memset. В чем может быть проблема?Моя функция полностью написана одной целой ассемблерной вставкой. memset - функция из хидела stig.h в C/C++
я компилил в Debia amd64: "g++ -lt memset.cpp"/*memset.cpp*/#iclude <stdio.h>#iclude <time.h>#iclude <stig.h> typedef usiged log  ULONG; ilie void zeoMemoy(void *pt, ULONG size){        asm volatile("zeoMemoy1:        \\t \                                cmpq $8,%%cx         \\t \                                jl zeoMemoy2        \\t \                                movq %%bx,(%%di)    \\t \                                addq $8,%%di         \\t \                                subq $8,%%cx         \\t \                                jmp zeoMemoy1       \\t \\                                zeoMemoy2:          \\t \                                cmpq $4,%%cx         \\t \                                jl zeoMemoy3        \\t \                                movl %%ebx,(%%di)    \\t \                                addq $4,%%di         \\t \                                subq $4,%%cx         \\t \                                jmp zeoMemoy2       \\t \\                                zeoMemoy3:          \\t \                                cmpq $2,%%cx         \\t \                                jl zeoMemoy4        \\t \                                movw %%bx,(%%di)     \\t \                                addq $2,%%di         \\t \                                subq $2,%%cx         \\t \                                jmp zeoMemoy3       \\t \\                                zeoMemoy4:          \\t \                                cmpq $0,%%cx         \\t \                                je exitzeoMemoy     \\t \                                movb %%bl,(%%di)     \\t \                                icq %%di            \\t \                                decq %%cx            \\t \                                jmp zeoMemoy4       \\t \                                exitzeoMemoy:       \\t"::"D"(pt),"b"(0),"c"(size));} #defie C 5000#defie N 900000 it mai(){        stuct timespec befo;        stuct timespec afte;        UCHAR  b[N];        clock_gettime(CLOCK_REALTIME,&befo);        fo(it i=0;i<C;i++)                memset(&b[0],0,sizeof(b));        clock_gettime(CLOCK_REALTIME,&afte);        pitf("=====\memset:  %d.%p\", afte.tv_sec-befo.tv_sec, (afte.tv_sec-befo.tv_sec)/C);        clock_gettime(CLOCK_REALTIME,&befo);        fo(it i=0;i<C;i++)                zeoMemoy(&b[0],sizeof(b));        clock_gettime(CLOCK_REALTIME,&afte);        pitf("zeoMemoy: %d.%p\", afte.tv_sec-befo.tv_sec, (afte.tv_sec-befo.tv_sec)/C);        etu 0;}to tecolote:        Да, одну и ту же область.

Серафим Кораблёв (Гость) Assembler
3

Assembler: Быстрота выполнения функции в цикле несколько раз подряд...

8 месяцев назад Форматированный вывод массива в Edit используя WinAPI или встроенные функций MASM

Значения некоторого массива заполняют некоторый буфер следующим образом:;начало цикла  mov eax, [ebx] ;в ebx находится указатель на элемент массива  ivoke dwtoa, eax, ADDR buf11 ;правильно ли используется функция dwtoa  ivoke lstcat,add buf11,add st11 ;st11 db ", ",0;конец циклаНеобходимо вывести этот буфер в edit в диалоговом окне. Как создать такое диалоговое окно (представляет собой рамку внутри которой edit и больше ничего)? И как вывести этот буфер в edit диалоговог...

Лога (Гость) Нет ответов
3
8 месяцев назад Как посчитать количество гласных идущих в строке подряд?

Как найти место в строке в которой несколько гласных в подряд?Мы вводим с клавиатуры строку, проверяем на гласные и выводим количество повторяемых буквассемблерtasm32

Vanez (Гость) Нет ответов
3
8 месяцев назад Необходимо разобраться почему не корректно работает ASM

Необходимо расширить функции компилятора из pascal'е видного языка в assemble моё задание добавить поддержку функций приведу часть кода, на assemble, который получается:Начало кода mai:      mov     AX, @Data      mov     DS, AX      mov     ES, AX      xo     AX, AX  ;Начало оператора WRITE push ax mov dx, offset  _msg1 call Wite pop ax  ;Конец оператора WRITE     &...

Chunosov Pavel (Гость) 1 ответ
3
Ответы (5)
Roman Hatbery (Гость) 3 года назад
3

Весьма вероятно, проблема в накладных расходах при вызове функции. Там ведь куча данных кладётся в стек, инициализируются локальные переменные и прочая, прочая, прочая. В memset эти расходы, очевидно, сведены к минимуму.

Это так, в качестве предположения.

Пожаловаться
Gugumot (Гость) 3 года назад
3

хитрый вопрос. дело видимо в цикле. она 1000 раз одну и ту же область обнуляет ?

Пожаловаться
спичьки (Гость) 3 года назад
3

Меня интересует, как вы считаете время, когда они выполняются один раз? Это же настолько малое время, что любые его измерения будут крайне неточны.

Пожаловаться
Nazar Nosikov (Гость) 3 года назад
3

а вы попробуйте асм-код вставить напрямую в тело цикла...

Пожаловаться
Carina.Prelude (Гость) 3 года назад
3

Советую убрать inline директиву.

Пожаловаться
Быстрота выполнения функции в цикле несколько раз подряд... (Assembler) - вопросы и ответы на все случаи жизни - справочник Assembler i-vopros.ru