feat: написаны функции сравнения времени выполнения
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user