代码小比较

DongHao 2011-02-15 14:14

判断上百万个4k的buffer是否为全0,我最先想到的办法是:
zero_buffer = malloc(4096);
memset(zero_buffer, 0, 4096);

/* 循环百万次读取buffer */
    if (!memcmp(zero_buffer, buffer)) {
        /* 全0 */
    }

做完以后跑了一下,速度凑合。由于好奇,看看shell工具cp的代码,它的解决办法是:

/* 循环百万次读取buffer */
    long *wp = buffer;
    while (*wp++ ==0 && wp<buffer + 4096)
        continue;

    if (wp >= buffer + 4096) {
        /* 全0 */
    }

cp的代码真称得上千锤百炼,这比我的方法要快,因为我的办法需要CPU访问两块内存(buffer和zero_buffer),而cp只问一块内存,CPU的cache会高效得多。
判断一块4k buffer当然看不出快慢,我们循环上百万次,立刻就能看出差别:cp的算法比我的快了3倍。

[返回] [原文链接]