返回信息流linux中memset的实现是1字节1字节的赋值,从理论上讲,如果我要对一个long long的数组清0,那么写一个for循环来对它8字节8字节的赋值,要比memset快些才对。但实际我写出的测试程序表明,memset要稍快一些。请问是什么原因?
1、memset做了优化(编译器优化、cache命中、else);2、我上述理解有错;3、我写的测试程序有问题;4、else。
多谢解答。
这是一条镜像帖。来源:北邮人论坛 / cpp / #85433同步于 2015/1/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
memset这个函数,效率到底怎么样
Mabraygas
2015/1/23镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
不会是一字节一字节这么赋值的,这也太弱了。
glibc里面做过一定的优化,简单来说,假设memset的第二个参数是c,内存长度是47(地址从5到51,假设),那么会构造一个8(或者4)字节的longlong整型a,他的每个字节都是c,然后对5、6、7三个字节循环赋值c,然后8~47这段内存是8个字节为一个单位整体赋值的,然后把剩余的48、49、50、51循环赋值c。这样既保证了读写的时候内存对齐,又降低了循环的次数。
【 在 Mabraygas 的大作中提到: 】
: linux中memset的实现是1字节1字节的赋值,从理论上讲,如果我要对一个long long的数组清0,那么写一个for循环来对它8字节8字节的赋值,要比memset快些才对。但实际我写出的测试程序表明,memset要稍快一些。请问是什么原因?
: 1、memset做了优化(编译器优化、cache命中、else);2、我上述理解有错;3、我写的测试程序有问题;4、else。
: 多谢解答。
如果信不过,可以去找找有个蛋疼的家伙手工用汇编写了一堆标准库里的函数并且跑的比标准库快,就是链接找不到了
PS. 要是为了性能真到了比拼标准库效率的时候,可千万出来要说说怎么做的