内存拷贝(memcpy)这个操作看似简单,但长期以来存在很多关于其优化的讨论,各种编程语言库也都有对应实现,而对于memcpy性能评估测试的讨论就更多了。
那么如下的memcpy实现到底有什么问题?
void * simple_memcpy(void *dst, const void *src, size_t n)
{
const uint8_t *_src = src;
uint8_t *_dst = dst;
size_t i;
for (i = 0; i < n; ++i)
_dst[i] = _src[i];
return dst;
}
很简单,首先,这看起来太简单,不够高端,气势上就先输了;同时,代码没有使用Vector指令,没有指令级并行,没有做地址对齐处理,最终性能完全依赖于编译器的优化——然而这些并没有什么问题,在某些应用场景中这个函数的性能甚至会比glibc的memcpy性能更高——当然,这的确完全得益于编译器的优化。
本文的观点是:不存在一个“最优”的适用于任何场景(硬件+软件+数据)的memcpy实现。这也是DPDK中rte_memcpy存在的原因:不是glibc中的memcpy不够优秀,而是它和DPDK中的核心应用场景之间不合适,有没有觉得这种说法很耳熟?本文将着重探讨如何针对具体应用进行memcpy(或其他任何程序)的性能优化。