может кто скажет... я написал функцию заполнения нулями какой-то области памяти. Когда я вызываю один раз свою функцию, то по результатам она выполняется в 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:
Да, одну и ту же область.
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.