在 C# 中捕获位移中的衰减字节

本文关键字:衰减 字节 | 更新日期: 2024-11-07 18:39:56

如果你想知道某个特定位是否设置在一个字节中,一个简单的AND掩码就可以了。我想知道是否有更快的方法来实现相同的目标。例如,位移<<或>>返回移位的数字,而不是刚刚"掉落"的位。

如果托管代码中没有替代方法,编写不安全的汇编会加快速度吗?如果是,请解释如何。

上下文:这适用于需要针对生产代码进行高度优化的复杂算法。我觉得有必要澄清这一点,以避免可怕的"做你自己的功课"评论和/或投票否决。

在 C# 中捕获位移中的衰减字节

要通过移位操作执行位测试,您必须将其移位(无符号)两次,以从任何一侧敲掉多余的位(您不需要将其放回任何特定位置 - 只需测试零)。这很复杂,不是最佳的。

奇怪的是,&是执行位测试的标准方式,并且经过了大量优化;这是一个单一的CPU指令,而且非常非常快。

只需使用&测试,例如if((x & MASK) != 0) .

不,unsafe代码在这里不会真正帮助您。 unsafe主要对指针感兴趣。指针既有趣又有趣,但是您可以在没有指针的情况下进行完全相同的位测试。这里指针的一个潜在用途是,如果有某种方法可以使用指针强制一次测试比原来更多的数据,例如,如果你有一个byte[],但你想一次测试它 8 个字节,通过强制byte[]到一个byte*, 然后byte*long*ulong*.这可能是一个有用的优化,比如说,web-socket掩码(使用更宽的异或掩码在字节流上运行)。但是,对于简单的位测试,这些都不是必需的。

如前所述:按位运算非常高效。在任何现代处理器上,几乎任何此类操作几乎肯定会在单个时钟周期内执行。

如果要查看为表达式生成的实际代码,请在 Visual Studio 调试器中启动它。设置断点,点击时点击菜单:调试。窗户。。拆卸。

也许,如果你的表达式足够复杂,你可以在这种事情上击败编译器和优化器,但我对此表示怀疑。更重要的是,您遇到的任何性能问题都不太可能与位抖动有关。在遇到问题之前不要优化。正如詹姆斯·迈克尔·黑尔所说:

记住优化的两个定律。 我不确定我首先在哪里 听到这些,但它们是如此真实:

  • 对于初学者:不要优化。
  • 对于专家:暂时不要优化。

这是千真万确的。 如果您是初学者,请完全抵制优化的冲动 成本。 如果您是专家,请推迟该决定。只要你 为您的任务选择了正确的数据结构和算法, 您的表现可能绰绰有余。 机会是 这将是网络、数据库或磁盘命中,这将是您的 放慢速度,而不是你的代码。正如他们所说,98%的代码瓶颈 在代码的 2% 中,因此过早优化可能会增加维护 以及不会产生任何可衡量影响的安全债务。

相反,为

可维护性和安全性编写代码,然后,只有这样,当你发现 一个真正的瓶颈,那么你应该回去进一步优化。

更多在这里:

  • 过早优化
  • 过早优化的危险

请参阅Bit-Twiddling Hacks,了解如何完成与位操作相关的任何操作。面向 C 语言,但相同的技术在 C# 中只需稍作修改即可工作(例如,任何涉及指针的内容都可能需要重新考虑)。