Книга: Программирование для Linux. Профессиональный подход

Листинг 9.2. (bit-pos-asm.c) Нахождение позиции старшего значащего бита с помощью инструкции bsrl

Листинг 9.2. (bit-pos-asm.c) Нахождение позиции старшего значащего бита с помощью инструкции bsrl

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
 long max = atoi(argv[1]);
 long number;
 unsigned position;
 volatile unsigned result;
 /* Повторяем вычисления для большого количества чисел. */
 for (number = 1; number <= max; ++number) {
  /* Вычисляем позицию старшего значащего бита с помощью
     ассемблерной инструкции bsrl. */
  asm("bsrl %1, %0" : "=r" (position) : "r" (number));
  result = position;
 }
 return 0;
}

Скомпилируем обе версии программы в режиме полной оптимизации:

% cc -O2 -о bit-pos-loop bit-pos-loop.c
% cc -O2 -о bit-pos-asm bit-pos-asm.c

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

% time ./bit-pos-loop 250000000
19.51user 0.00system 0:20.40elapsed 95%CPU (0avgtext+0avgdata
0maxresident)k0inputs+0outputs (73major+11minor)pagefaults 0swaps
% time ./bit-pos-asm 250000000
3.19user 0.00system 0:03.32elapsed 95%CPU (0avgtext+0avgdata
0maxresident)k0inputs+0outputs (73major+11minor)pagefaults 0swaps

Приведенные результаты могут немного меняться в зависимости от загруженности системы, но хорошо видно, что ассемблерная версия выполняется гораздо быстрее.

Оглавление книги


Генерация: 1.283. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз