Я протестировал предложенные решения и два других.Я не смог протестировать предложение onemasse, поскольку результат, сохраненный в s [], был неверным.Я тоже не смог это исправить.Я должен был сделать некоторые изменения в коде лунной тени.Единица измерения - тактовые циклы, поэтому чем ниже, тем лучше.
Исходный код:
#define MAX 100
void inline STACKO ( struct timespec *ts, struct timespec *te ){
int i, *s, *a, *b;
for (i = 0; i < MAX; ++i){
s = (int *) malloc (sizeof (int)); ++s;
a = (int *) malloc (sizeof (int)); ++a;
b = (int *) malloc (sizeof (int)); ++b;
}
srand ( 1024 );
for (i = 0; i < MAX; ++i){
a[i] = ( rand() % 2 );
b[i] = ( rand() % 2 );
}
rdtscb_getticks ( ts ); /* start measurement */
for (i = 0; i < MAX; i++)
s[i] = a[i] ^ b[i];
rdtscb_getticks ( te ); /* end measurement */
/*
printf("\n");
for (i = 0; i < MAX; ++i)
printf("%d", s[i]);
printf("\n");
*/
}
Новое предложение 1: зарегистрируйте int
С:
int i, *s, *a, *b;
Кому:
register int i, *s, *a, *b;
Новое предложение 2: Нет обозначения массива
s_end = &s[MAX];
for (s_ptr = &s[0], a_ptr = &a[0], b_ptr = &b[0]; \
s_ptr < s_end; \
++s_ptr, ++a_ptr, ++b_ptr){
*s_ptr = *a_ptr ^ *b_ptr;
}
Предложенная оптимизация лунной тени:
s_ptr = &s[0];
a_ptr = &a[0];
b_ptr = &b[0];
for (i = 0; i < (MAX/4); i++){
s_ptr[0] = a_ptr[0] ^ b_ptr[0];
s_ptr[1] = a_ptr[1] ^ b_ptr[1];
s_ptr[2] = a_ptr[2] ^ b_ptr[2];
s_ptr[3] = a_ptr[3] ^ b_ptr[3];
s_ptr+=4; a_ptr+=4; b_ptr+=4;
}
Предложенная оптимизация лунной тени + зарегистрируйте int:
От:
int i, *s, ...
До:
register int i, *s, ...
Предложенная Кристоффером оптимизация:
#pragma omp for
for (i = 0; i < MAX; i++)
{
s[i] = a[i] ^ b[i];
}
Результаты:
![Performance graph](https://i.stack.imgur.com/kmXXR.jpg)
Original Code 1036.727264
New Proposal 1 611.147928
New proposal 2 450.788845
moonshadow 713.3845
moonshadow2 452.481192
Christoffer 1054.321943
Есть и другиепростой способ оптимизации полученного двоичного файла.Передача -O2 в gcc говорит о том, что вы хотите оптимизировать.Чтобы точно знать, что делает -O2, обратитесь к справочной странице gcc.
После включения -O2: ![Performance graph](https://i.stack.imgur.com/bYNHt.jpg)
Original Code 464.233031
New Proposal 1 452.620255
New proposal 2 454.519383
moonshadow 428.651083
moonshadow2 419.317444
Christoffer 452.079057
Исходные коды доступны по адресу: http://goo.gl/ud52m