对齐和性能

发布于 2025-01-01 03:53:38 字数 163 浏览 2 评论 0原文

用于比较 char *memcmp 的例程 strcmp 对于其他所有内容,它们在以某种方式对齐的内存块(在 x86_64 上)上运行速度是否更快(如何?)? libc 是否使用 SSE 来执行此例程?

Routines strcmp for comparing char * and memcmp for everything else, do they run faster on memory block (on x86_64) which is somehow aligned (how?)? Does libc use SSE for this routines?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独孤求败 2025-01-08 03:53:38

这取决于对齐重要或 SIMD 指令可用的架构,通常例程将在前导字节上操作,然后执行数据允许的尽可能多的宽对齐操作,然后在尾随字节上操作。

前导字节和尾随字节是否对数据处理时间有显着影响可以通过实验来确定。

It depends, but on architectures where alignment matters or where SIMD instructions are available, typically the routines will operate on leading bytes, then do as many wide aligned operations as the data allows, then operate on trailing bytes.

Whether the leading and trailing bytes are contributing significantly to the processing time for your data can be determined by experiment.

好多鱼好多余 2025-01-08 03:53:38

如果您担心比较的性能,您应该看看著名的 Boyer-摩尔算法这篇文章来自 GNU Grep 作者 Mike Haertel。

他解释了如何能够快速地在数据块中搜索某些内容。

他的总结非常清楚要做什么:

  • 使用 Boyer-Moore(并展开其内循环几次)。
  • 使用原始系统调用滚动您自己的无缓冲输入。避免复制
    在搜索输入字节之前。 (但是,请使用缓冲
    输出。正常的 grep 场景是输出量为
    与输入量相比较小,因此输出的开销
    缓冲区复制很小,同时由于避免了许多小缓冲区而节省了成本
    无缓冲的写入可能很大。)
  • 在找到匹配项之前,不要在输入中查找换行符。
  • 尝试设置(页面对齐的缓冲区、页面大小的读取块、
    可以选择使用 mmap),这样内核还可以避免复制字节。

If you worry about performance for comparison, you should take a look at well-known Boyer-Moore alogrithm and this post from GNU Grep author, Mike Haertel.

He explains how one can manage to be really fast about searching something in a data block.

His summary is quite clear about what to do :

  • Use Boyer-Moore (and unroll its inner loop a few times).
  • Roll your own unbuffered input using raw system calls. Avoid copying
    the input bytes before searching them. (Do, however, use buffered
    output. The normal grep scenario is that the amount of output is
    small compared to the amount of input, so the overhead of output
    buffer copying is small, while savings due to avoiding many small
    unbuffered writes can be large.)
  • Don't look for newlines in the input until after you've found a match.
  • Try to set things up (page-aligned buffers, page-sized read chunks,
    optionally use mmap) so the kernel can ALSO avoid copying the bytes.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文