gpt4 book ai didi

c# - 在 C# 中,BitArray 获取位值的速度是否比简单的位移运算更快?

转载 作者:IT王子 更新时间:2023-10-29 04:41:11 25 4
gpt4 key购买 nike

1). var bitValue = (byteValue & (1 << bitNumber)) != 0;

2).使用 System.Collections.BitArray Get(int index) 方法

  • 什么更快?
  • 对于 .NET 项目,在什么情况下 BitArray 可能比与位移位的简单结合更有用?

最佳答案

@乔纳森莱因哈特,

不幸的是,您的基准测试没有定论。它没有考虑可能的延迟加载、缓存和/或预取(通过 CPU、主机操作系统和/或 .NET 运行时)的影响。

打乱测试顺序(或多次调用测试方法),您可能会注意到不同的时间测量值。

我用“任何 CPU”平台目标和 .NET 4.0 客户端配置文件构建了您的原始基准测试,在我的机器上运行,配备 i7-3770 CPU 和 64 位 Windows 7。

我得到的是这个:

Testing with 10000000 operations:
A UInt32 bitfield took 484 ms.
A BitArray (32) took 459 ms.
A List<bool>(32) took 393 ms.

这与您的观察非常一致。

但是,在 UInt32 测试之前执行 BitArray 测试会产生以下结果:

Testing with 10000000 operations:
A BitArray (32) took 513 ms.
A UInt32 bitfield took 456 ms.
A List<bool>(32) took 417 ms.

通过查看 UInt32 和 BitArray 测试的时间,您会注意到测量的时间似乎与测试本身无关,而是与测试运行的顺序有关。

为了至少稍微减轻这些副作用,我在每次运行的程序中执行了两次测试方法,结果如下。

测试顺序UInt32、BitArray、BoolArray、UInt32、BitArray、BoolArray:

Testing with 10000000 operations:
A UInt32 bitfield took 476 ms.
A BitArray (32) took 448 ms.
A List<bool>(32) took 367 ms.

A UInt32 bitfield took 419 ms. <<-- Watch this.
A BitArray (32) took 444 ms. <<-- Watch this.
A List<bool>(32) took 388 ms.

测试顺序 BitArray, UInt32, BoolArray, BitArray, UInt32, BoolArray:

Testing with 10000000 operations:
A BitArray (32) took 514 ms.
A UInt32 bitfield took 413 ms.
A List<bool>(32) took 379 ms.

A BitArray (32) took 444 ms. <<-- Watch this.
A UInt32 bitfield took 413 ms. <<-- Watch this.
A List<bool>(32) took 381 ms.

查看测试方法的第二次调用,似乎至少在具有最新 .NET 运行时的 i7 CPU 上,UInt32 测试比 BitArray 测试快,而BoolArray 测试仍然是最快的。

(我很抱歉我不得不写下我对 Jonathon 基准测试的回应作为答案,但作为一个新的 SO 用户我不能发表评论......)

编辑:

您可以尝试在调用第一个测试之前放置一个 Thread.Sleep(5000) 或类似的东西,而不是打乱测试方法的顺序...

此外,原始测试似乎使 UInt32 测试处于劣势,因为它包括边界检查“if (bitnum < 0 || bitnum > 31)”,它被执行了 3000 万次。其他两个测试都不包括这样的边界检查。然而,这实际上不是全部事实,因为 BitArray 和 bool 数组都在内部进行边界检查。

虽然我没有测试,但我预计消除边界检查将使 UInt32 和 BoolArray 测试执行类似,但这对于公共(public) API 来说不是一个好提议。

关于c# - 在 C# 中,BitArray 获取位值的速度是否比简单的位移运算更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16471759/

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