【问题标题】:Is there any way to speedup be32 encoding in C?有什么方法可以加速 C 中的 be32 编码?
【发布时间】:2018-01-10 09:25:04
【问题描述】:

有什么方法可以加速 C 中的 be32enc 吗?这是我为 uint32_t 所做的示例:

for (int i=0; i < 19; i++) {
    be32enc(&endiandata[i], pdata[i]);
}

还有函数本身:

static inline void be32enc(void *pp, uint32_t x)
{
 uint8_t *p = (uint8_t *)pp;
 p[3] = x & 0xff;
 p[2] = (x >> 8) & 0xff;
 p[1] = (x >> 16) & 0xff;
 p[0] = (x >> 24) & 0xff;
}

我用谷歌搜索了很多东西,但没有找到任何东西——这个话题不太受欢迎。目标 CPU 是 i3-7350k,我使用 msvc2017。也可以使用 MIT/GPL 库。

【问题讨论】:

  • 你能相信 x 是小端吗?
  • 我不同意这个副本。 OP 似乎不打算反转位,只打算反转字节。
  • 我会依赖 hton 函数。它是一种用于 TCP/IP 网络的实用函数,可将 32 位整数从主机字节序转换为网络(大字节序)字节序。您可以尝试根据您自己的实现在您的系统上对其进行基准测试
  • x86 有一个明确的字节交换和(最近)一个存储大端

标签: c optimization encode compiler-optimization endianness


【解决方案1】:

有两个修改可能会提高be32inc 函数的性能。首先摆脱指针魔法,使其成为从uint32_tuint32_t 的函数。其次,如果您不需要移植到 x86 以外的其他架构,请使用_bswap-intrinsic 实现它。

【讨论】:

【解决方案2】:

如果你有一个不错的编译器,你应该能够使用内置函数(顺便说一句,有一个 BSD 标准函数可以满足你的需求,htobe32()):

#ifndef I_HAVE_A_CRAP_COMPILER
#define bswap32(x) __builtin_bswap32(x)

#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
#define htobe32(x) bswap32(x)
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#define htobe32(x) (x)
#else
#error Must be little or big endian
#endif

#else
/*your implementation here*/
#endif

编辑:如果您想尝试 C 库的内置 htobe32() 函数,您可以:

#define _BSD_SOURCE
#include <endian.h>

尽管内置编译器可能会更快,因为它将完全避免函数调用和内联高效汇编(x86 和 x86_64 上的单个 bswap 指令)

【讨论】:

  • 较新的 x86 CPU 有 movbe,这在许多情况下可能会更好
  • @LưuVĩnhPhúc 当使用适当的“-march=”参数编译时,编译器(至少是 clang 和 gcc)将自动为 atom 和 haswell 或更高版本使用内置 bswap 执行此操作,但它不可用在所有 x86_64 架构上。
猜你喜欢
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多