大周期的 C 函数速度优化

标签 c performance encryption

我正在玩pedagogical implementation A5/1,但我的一些功能性能很糟糕:

#define R1MASK      0x07FFFF
#define R1TAPS      0x072000

bit parity(word x) { // XOR all bits
  x ^= x>>16;
  x ^= x>>8;
  x ^= x>>4;
  x ^= x>>2;
  x ^= x>>1;
  return x&1;
}

word clockone(word reg, word mask, word taps) { // clock one register
  word t = reg & taps;
  reg = (reg << 1) & mask;
  reg |= parity(t);
  return reg;
}

bit frameR1bit(word frame, int t) // Compute value of hat{f}_t^reg for chosen frame, chosen register, chosen many times
{
  bit framebit;
  R3 = 0;
  for (int i = 0; i < 22; i++) {
    clockone(R3, R3MASK, R3TAPS); /* clock with frame */
    framebit = (frame >> i) & 1; /* The i-th bit of the frame  */
    R3 ^= framebit;
  }
  for (int i = 0; i < t; i++)
    clockone(R3, R3MASK, R3TAPS); /* clock */
  return (parity(R3)); // Compute hat{f}_t^reg
} 

参数t在79到94之间,帧是数组中的228位,R3是字(R3寄存器的内容),我可以预先计算的所有内容都已加载到内存中。 问题是这些函数的计算量很大。我在很多周期中使用函数frameR1bit,因此计算了2^16 * 512 * 40 * 12次。整个程序真的很慢,我发现这是由于这个frameR1bit函数的循环造成的。有谁知道如何更好地实现这个功能?我真的很感谢任何形式的帮助。

最佳答案

尽管不太清楚,但移动 clockone 的内容和parity进入你的frameR1bit该循环中的函数将为您买回一些周期。就目前情况而言,它正在设置和拆除t parity 的堆栈帧和clockone 。这不会是最大的节省,但在机器级别,每次迭代将消除超过 16 条指令。

这可以通过使用 -finline-functions 来完成可以自动为您完成此操作,无需修改您的代码。

关于大周期的 C 函数速度优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30166404/

相关文章:

c - 当你用&号调用相同的进程时,视觉上会发生什么

c - 为什么指针值被用作 .而不是 -> 在此

c - 将文件中的数据放入C中的数组

xml - 在 Perl 中从 XML 文件中提取一些元素值的最快方法是什么?

ios - 如何以编程方式知道任何文件是否加密?- iPhone

security - X.509 DN 的所有部分都是可选的吗?

C 为什么传递这个易失变量的地址失败

java - 是否可以强制现有的 Java 应用程序使用不超过 x 个内核?

c - 并行数组的元素之和?

java - 使用 RSA 加密长字符串 (Java)