"Заливка" памяти нужным значением - C (СИ)
Формулировка задачи:
Есть некий блок памяти [ ][ ][ ][ ] [ ][ ][ ][ ] [ ][ ][ ][ ]. И есть uint32_t a, равный например 0xAABBCCDD. Каким наиболее быстрым способом можно сделать так:
[AA][BB][CC][DD] [AA][BB][CC][DD] [AA][BB][CC][DD]?
Решение задачи: «"Заливка" памяти нужным значением»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <memory.h>
#include <stdlib.h>
#include <time.h>
#define VALUE 0xAABBCCDD;
void usualmemfill(int size)
{
char * start = malloc(size * sizeof(uint32_t));
int i;
uint32_t value = VALUE;
for (i = 0; i < size; i++)
{
memcpy(start + i * sizeof(uint32_t), &value, sizeof(uint32_t));
}
free(start);
}
void newmemfill(int size)
{
char * start = malloc(size * sizeof(uint32_t));
uint32_t value = VALUE;
asm volatile("cld\n\t"
"rep\n\t"
"stosl"
: /* no output registers */
: "c" (size), "a" (value), "D" (start)
/*: "%ecx", "%edi*/
);
free(start);
(void)value;
}
clock_t start;
clock_t finish;
#define COUNT 100000
int main(void)
{
int i;
printf("Starting usual\n");
start = clock();
for (i = 0; i < COUNT; i++)
usualmemfill(i);
finish = clock();
printf("Time for usual realisation : %g\n", (float)(finish - start) / CLOCKS_PER_SEC);
printf("Starting modified\n");
start = clock();
for (i = 0; i < COUNT; i++)
newmemfill(i);
finish = clock();
printf("Time for modified realisation : %g\n", (float)(finish - start) / CLOCKS_PER_SEC);
return 0;
}