feat: написаны функции сравнения времени выполнения

This commit is contained in:
root
2024-10-02 20:07:05 +03:00
parent 4b05989ba5
commit 414f189d18
2 changed files with 100 additions and 29 deletions

View File

@ -1,4 +1,5 @@
global fill_arr global fill_arr1
global fill_arr2
section .note.GNU-stack section .note.GNU-stack
@ -19,33 +20,77 @@ section .text
%endrep %endrep
%endmacro %endmacro
fill_arr: ; rdi - указатель на память, rsi - сколько, rdx - сколько рядов fill_arr1:
;xor rax, rax ; заполнять видимо будем нулями push rbp
PUSH_M r8, rdi, rsi, rdx, rcx mov rbp, rsp
push rdx ; один раз для сохранения, другой - для трюка PUSH_M rdi, rsi, rdx
; считаем сколько четных рядов ; Вычисляем сколько числе в строке
mov rax, rdx mov rax, [rbp - 16]
xor rdx, rdx
div qword [rbp - 24]
push rax ; сохраняем в локальные переменные. rbp - 32
; Вычисляем сколько проходов цикла необходимо
mov rax, [rbp - 24]
xor rdx, rdx xor rdx, rdx
mov rcx, 2 mov rcx, 2
div rcx div rcx
mov rcx, rax push rax ; rbp-40
; считаем сколько колонок
mov rax, rsi ; Надеюсь rdi не успел поменяться
div qword [rsp] ; заполняем память
mov rcx, rax push rbx
mov rdx, rax mov rbx, [rbp - 32]
add rsp, 8 mov rcx, [rbp - 40]
mov rax, 777 mov rax, 777 ; специально такое число, чтобы выделялось
; заполняем массив .next_row:
.fill_even_row:
push rcx push rcx
push rdi mov rcx, [rbp - 32]
.loop_row: rep stosd
stosd lea rdi, [rdi + 4 * rbx] ; пропускаем строку
loop .loop_row
pop rdi
pop rcx pop rcx
lea rdi, [rdi + 8 * rdx] loop .next_row
loop .fill_even_row pop rbx
RPOP_M r8, rdi, rsi, rdx, rcx
add rsp, 16 ; чистим 2 доп переменные, образовавшиеся в процессе вычислений
RPOP_M rdi, rsi, rdx
pop rbp
ret
fill_arr2:
push rbp
mov rbp, rsp
PUSH_M rdi, rsi, rdx
; Вычисляем сколько числе в строке
mov rax, [rbp - 16]
xor rdx, rdx
div qword [rbp - 24]
push rax ; сохраняем в локальные переменные. rbp - 32
; Вычисляем сколько проходов цикла необходимо
mov rax, [rbp - 24]
xor rdx, rdx
mov rcx, 2
div rcx
push rax ; rbp-40
; Надеюсь rdi не успел поменяться
; заполняем память
push rbx
mov rbx, [rbp - 32]
mov rcx, [rbp - 40]
mov rax, 777 ; специально такое число, чтобы выделялось
.next_row:
push rcx
mov rcx, [rbp - 32]
.fill:
mov [rdi], rax
lea rdi, [rdi + 4]
loop .fill
lea rdi, [rdi + 4 * rbx] ; пропускаем строку
pop rcx
loop .next_row
pop rbx
add rsp, 16 ; чистим 2 доп переменные, образовавшиеся в процессе вычислений
RPOP_M rdi, rsi, rdx
pop rbp
ret ret

View File

@ -1,17 +1,43 @@
#include <stdio.h> #include <stdio.h>
#include <time.h>
extern void fill_arr(int* arr, size_t size, size_t row_size); extern void fill_arr1(int* arr, size_t size, size_t row_count);
extern void fill_arr2(int* arr, size_t size, size_t row_count);
double measure_fill_time(void(*function)(int*, size_t, size_t), int* arr, size_t size, size_t row_count)
{
const size_t times = 10000000;
clock_t begin = clock();
for (size_t i = 0; i < times; i++)
{
function(arr, size, row_count);
}
clock_t end = clock();
return (double)(end - begin)/(CLOCKS_PER_SEC);
}
int main() int main()
{ {
const int arr_size = 256; const int arr_size = 256;
int array[arr_size]; int array1[arr_size];
fill_arr(array, arr_size, 16);
printf("String methods took %fs to loop 10,000,000 times\n", measure_fill_time(fill_arr1, array1, arr_size, 16));
for (size_t i = 0; i < arr_size; i++) for (size_t i = 0; i < arr_size; i++)
{ {
printf("%d ", array[i]); printf("%d ", array1[i]);
} }
printf("\b \n"); printf("\b \n");
int array2[arr_size];
printf("Lea methods took %fs on to loop 10,000,000 times\n", measure_fill_time(fill_arr2, array2, arr_size, 16));
for (size_t i = 0; i < arr_size; i++)
{
printf("%d ", array2[i]);
}
printf("\b \n");
return 0; return 0;
} }