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

C++ оптимизация Программирование assembler

может кто скажет... я написал функцию заполнения нулями какой-то области памяти. Когда я вызываю один раз свою функцию, то по результатам она выполняется в 2-3 раза быстрее чем memset, а вот если я вызываю свою функцию в цикле, к примеру 1000 раз, то моя функция выполняется в 3 раза медленнее чем memset. В чем может быть проблема?
Моя функция полностью написана одной целой ассемблерной вставкой. memset - функция из хидела string.h в C/C++

Примечание:
я компилил в Debian amd64: "g++ -lrt memset.cpp"

/*memset.cpp*/
#include <stdio.h>
#include <time.h>
#include <string.h>

typedef unsigned long ULONG;

inline void zeroMemory(void *ptr, ULONG size){
asm volatile("zeroMemory1: \n\t \
cmpq $8,%%rcx \n\t \
jl zeroMemory2 \n\t \
movq %%rbx,(%%rdi) \n\t \
addq $8,%%rdi \n\t \
subq $8,%%rcx \n\t \
jmp zeroMemory1 \n\t \
\
zeroMemory2: \n\t \
cmpq $4,%%rcx \n\t \
jl zeroMemory3 \n\t \
movl %%ebx,(%%rdi) \n\t \
addq $4,%%rdi \n\t \
subq $4,%%rcx \n\t \
jmp zeroMemory2 \n\t \
\
zeroMemory3: \n\t \
cmpq $2,%%rcx \n\t \
jl zeroMemory4 \n\t \
movw %%bx,(%%rdi) \n\t \
addq $2,%%rdi \n\t \
subq $2,%%rcx \n\t \
jmp zeroMemory3 \n\t \
\
zeroMemory4: \n\t \
cmpq $0,%%rcx \n\t \
je exitzeroMemory \n\t \
movb %%bl,(%%rdi) \n\t \
incq %%rdi \n\t \
decq %%rcx \n\t \
jmp zeroMemory4 \n\t \
exitzeroMemory: \n\t"::"D"(ptr),"b"(0),"c"(size));
}

#define C 5000
#define N 900000

int main(){
struct timespec befor;
struct timespec after;
UCHAR b[N];

clock_gettime(CLOCK_REALTIME,&befor);
for(int i=0;i<C;i++)
memset(&b[0],0,sizeof(b));
clock_gettime(CLOCK_REALTIME,&after);
printf("=====\nmemset: %d.%p\n", after.tv_sec-befor.tv_sec, (after.tv_nsec-befor.tv_nsec)/C);
clock_gettime(CLOCK_REALTIME,&befor);
for(int i=0;i<C;i++)
zeroMemory(&b[0],sizeof(b));
clock_gettime(CLOCK_REALTIME,&after);
printf("zeroMemory: %d.%p\n", after.tv_sec-befor.tv_sec, (after.tv_nsec-befor.tv_nsec)/C);

return 0;
}

to tecolote:
Да, одну и ту же область.
Ответы:
Весьма вероятно, проблема в накладных расходах при вызове функции. Там ведь куча данных кладётся в стек, инициализируются локальные переменные и прочая, прочая, прочая. В memset эти расходы, очевидно, сведены к минимуму.
хитрый вопрос. дело видимо в цикле. она 1000 раз одну и ту же область обнуляет ?
Меня интересует, как вы считаете время, когда они выполняются один раз? Это же настолько малое время, что любые его измерения будут крайне неточны.
Советую убрать inline директиву.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.