gpt4 book ai didi

c - sprintf vs strcpy - 使用更多内存和快速复制还是几乎没有内存和慢速复制?

转载 作者:行者123 更新时间:2023-11-30 15:23:44 25 4
gpt4 key购买 nike

我正在编写延迟关键的应用程序(自制的高频交易系统)。我有这样的代码,只需将 uint64 转换为字符串:

    // TODO: cache sprintf, use strcpy? measure?
sprintf(dest, "%" PRIu64, divRes.quot);

这里 divRes.quot 是保证在 1 到 1 000 000 之间的整数。因此我可以预分配(相当大)数组并“缓存”每个值。然后我就可以执行 strcpy(dest, cache[divRes.quot])。

乍一看,它肯定要快得多,因为 strcpy 肯定比 sprintf 快得多。但请注意,我使用的是巨大的数组,几乎肯定无法完全加载到 CPU 缓存中。所以第二种方法几乎肯定会进入主内存。虽然在第一种方法中,我很可能会保留在 CPU 缓存中(甚至可能在最快的 L1 缓存中?!)

所以平均来说什么会更快:

  • CPU 缓存运行缓慢
  • 可以访问主内存的快速函数?

我认为这取决于一个函数比另一个函数快多少,以及 CPU 缓存访问比主内存访问快多少。

我想编写一个真正的测试是非常困难的。因为在实际应用程序中,整体系统负载会有所不同,因此缓存/内存使用也会有所不同,这可能会发生巨大的变化。

请注意,我不关心可读性、维护等,我只需要速度。

最佳答案

为了使表查找顺利进行,您必须足够频繁地执行此操作(在具有大缓存的 CPU 上),以便在您执行此操作的大部分时间里,表的大部分内容都位于缓存中。该表占用大约 7 MB 内存,因此除非缓存相当大,并且您一次要转换数百万个数字,因此大多数访问都会缓存,否则它几乎肯定是一个网络损失。

根据我的计算,使用普通除法(约 5 个除法 + 6 个加法)转换单个数字可能需要大约 100 个时钟。从主内存中读取数据通常需要大约 200 个处理器时钟,因此您需要 50% 左右的缓存命中率才能实现收支平衡。

就我个人而言,我怀疑我是否会使用这两种方法中的任何一种。相反,我可能会做混合动力。我将这个数字除以 1000,然后进行两次表查找(一个包含被除数,另一个包含余数)。

优点是,这会将表大小减少到大约 4 KB,并将每个表条目的使用量增加大约 1000 倍。假设您要转换至少几百个(左右)随机分布的数字一次,您或许可以指望接近 100% 的缓存命中率。凭借高缓存命中率,我们可以计划一次除法加上两次缓存加载,总共需要大约 25 个时钟周期,或者大约是我们从简单转换中预期的速度的 4 倍。

关于c - sprintf vs strcpy - 使用更多内存和快速复制还是几乎没有内存和慢速复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28663679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com