我知道这memset(ptr, 0, nbytes)
真的很快,但有没有更快的方法(至少在x86上)?
这是我测试的内容:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <sys/time.h>
#define TIME(body) do { \
struct timeval t1, t2; double elapsed; \
gettimeofday(&t1, NULL); \
body \
gettimeofday(&t2, NULL); \
elapsed = (t2.tv_sec - t1.tv_sec) * 1000.0 + (t2.tv_usec - t1.tv_usec) / 1000.0; \
printf("%s\n --- %f ---\n", #body, elapsed); } while(0) \
#define SIZE 0x1000000
void zero_1(void* buff, size_t size)
{
size_t i;
char* foo = buff;
for (i = 0; i < size; i++)
foo[i] = 0;
}
/* I foolishly assume size_t has register width */
void zero_sizet(void* buff, size_t size)
{
size_t i;
char* bar;
size_t* foo = buff;
for (i = 0; i < size / sizeof(size_t); i++)
foo[i] = 0;
// fixes bug pointed out by tristopia
bar = (char*)buff + size - size % sizeof(size_t);
for (i = 0; i < size % sizeof(size_t); i++)
bar[i] = 0;
}
int main()
{
char* buffer = malloc(SIZE);
TIME(
memset(buffer, 0, SIZE);
);
TIME(
zero_1(buffer, SIZE);
);
TIME(
zero_sizet(buffer, SIZE);
);
return 0;
}
结果:
memset更快。(所有测试均在Linux上运行)需要进一步测试。
发布于 2018-05-09 18:36:21
x86是相当广泛的设备。
对于完全通用的x86目标,带有“rep movsd”的汇编块可能会在零时刻将零发送到内存32位。尝试确保这项工作的大部分是DWORD对齐的。
对于mmx的芯片,movq的汇编循环可以一次达到64位。
可以通过指向long long或_m64的指针获取C / C ++编译器以使用64位写入。目标必须是8字节对齐才能获得最佳性能。
对于使用sse的芯片,movaps速度很快,但是只有当地址是16字节对齐时,才能使用movsb直到对齐,然后用一个movaps循环完成清除
发布于 2018-05-09 19:29:48
memset
通常被设计成非常快速的通用设置/调零代码。它处理所有具有不同尺寸和对齐的案例,这些案例会影响可以用来完成工作的各种说明。根据你所使用的系统,底层的实现可能是针对该体系结构的汇编器,以利用其本机属性的任何优势。它也可能有内部特殊情况来处理调零情况。
https://stackoverflow.com/questions/-100008437
复制相似问题