首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >比memset更快的零内存方式是什么?

比memset更快的零内存方式是什么?
EN

Stack Overflow用户
提问于 2018-05-09 09:37:43
回答 2查看 0关注 0票数 0

我知道这memset(ptr, 0, nbytes)真的很快,但有没有更快的方法(至少在x86上)?

这是我测试的内容:

代码语言:javascript
复制
    #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上运行)需要进一步测试。

EN

回答 2

Stack Overflow用户

发布于 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循环完成清除

票数 0
EN

Stack Overflow用户

发布于 2018-05-09 19:29:48

memset通常被设计成非常快速的通用设置/调零代码。它处理所有具有不同尺寸和对齐的案例,这些案例会影响可以用来完成工作的各种说明。根据你所使用的系统,底层的实现可能是针对该体系结构的汇编器,以利用其本机属性的任何优势。它也可能有内部特殊情况来处理调零情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档