|
|
1
668
你可以用 Enumerable.SequenceEqual 方法
|
|
2
259
P/Invoke 超能力启动!
|
|
|
3
160
|
|
|
4
123
可以找到从.NET5.0.0开始的实现(细节) here .
我已经
revised
|
|
|
5
84
使用者 产生此解决方案的建议不安全代码:
它对尽可能多的阵列进行基于64位的比较。这种情况依赖于数组开始对齐qword这一事实。如果不对齐qword,它就会工作,只是速度不如以前快。
它比简单的计时器执行速度快大约七个计时器
|
|
|
6
31
Arrays.equals(byte[], byte[]) method ... 如果有人嘲笑你,不要怪我。。。 编辑:不管它值多少钱,我使用Reflector来反汇编代码,下面是它的样子:
|
|
|
7
26
.NET 3.5及更新版本具有新的公共类型,
Equals方法的反射器反编译:
上述实现意味着,在最坏的情况下,您可能需要遍历数组三次:首先计算array1的哈希,然后计算array2的哈希,最后(因为这是最坏的情况,所以长度和哈希相等)比较array1中的字节与数组2中的字节。
|
|
|
8
21
I posted 关于检查字节[]是否充满零的类似问题。(SIMD代码被击败,因此我将其从该答案中删除。)以下是我比较得出的最快代码:
在两个256MB字节阵列上测量:
|
|
|
9
11
最近微软发布了一个特别的NuGet软件包, System.Runtime.CompilerServices.Unsafe . 它很特别,因为它是用英文写的 IL ,并提供C#中无法直接使用的低级功能。
注意
此方法不如本文演示的其他方法快,但它比naive方法快得多,不使用不安全的代码或P/Invoke或pinning,并且实现非常简单(IMO)。这里有一些 BenchmarkDotNet 来自我的机器的结果:
|
|
|
10
10
|
|
11
9
我发明了一种方法,可以稍微
更新日期:2019年3月30日 从.NET core 3.0开始,我们支持SIMD! 在我的电脑上,此解决方案以相当大的优势最快:
|
|
12
6
我会使用不安全的代码并运行
也许你也应该考虑检查数组是非空的。 |
|
13
6
如果您看看.NET是如何处理string.Equals的,您会发现它使用了一个名为EqualHelper的私有方法,该方法有一个“不安全”的指针实现。 .NET Reflector 这可以用作字节数组比较的模板,我在博客文章中对其进行了实现 Fast byte array comparison in C#
|
|
14
5
我使用附加的程序.NET4.7发行版进行了一些测量,没有附加调试程序。我认为人们使用了错误的度量标准,因为如果你关心速度的话,这里的问题是计算两个字节数组是否相等需要多长时间。i、 e.以字节为单位的吞吐量。
正如你所见,没有比这更好的方法了
|
|
|
15
4
找不到一个我完全满意的解决方案(性能合理,但没有不安全的代码/pinvoke),所以我提出了这个解决方案,没有什么真正的原创,但很有效:
与本页上的其他一些解决方案相比,性能:
*位转换器:4886个刻度,4.06 不完美比较:1636勾,12.12 等长展开时间:637节,31.09 P/memcmp:369个刻度,53.67
|
|
|
16
4
看来 等长展开 是以上建议中最好的。
|
|
|
17
4
对于那些关心秩序的人(即想要
在里面
the original GitHub proposal
接下来,这应该是比较字节数组或字节范围的go-to方法(使用
|
|
|
18
2
对于比较短字节数组,以下是一个有趣的技巧:
对这段代码进行性能分析会很有趣。 |
|
|
19
2
我在这里没有看到很多linq解决方案。
请注意,这仅适用于大小相同的阵列。 扩展可能是这样的
|
|
|
20
1
我想到了许多图形卡中内置的块传输加速方法。但是,您必须按字节复制所有数据,因此如果您不想在非托管和硬件相关的代码中实现整个逻辑部分,这对您没有多大帮助。。。 这是一个需要比较的时间和频率与需要以逐字节方式访问数据的时间和频率的问题,例如,在API调用中将其用作需要字节[]的方法中的参数。最后,您只能知道您是否真正了解用例。。。 |
|
|
21
1
|
|
|
22
0
抱歉,如果您正在寻找一种管理方式,那么您已经正确地执行了,据我所知,BCL中没有内置的方法来执行此操作。 您应该添加一些初始的空检查,然后像在BCL中一样重用它。 |
|
|
23
0
|
|
|
24
0
这与其他方法类似,但这里的区别在于,我不能一次检查下一个最高的字节数,例如,如果我有63个字节(在我的SIMD示例中),我可以检查前32个字节的相等性,然后检查最后32个字节的相等性,这比检查32个字节、16个字节、8个字节等都快。输入的第一个检查是比较所有字节所需的唯一检查。 在我的测试中,这确实排在第一位,但只差一点点。 下面的代码正是我在airbreather/ArrayComparePerf.cs中测试它的方式。
|
|
25
-1
使用
|
|
|
26
-2
如果您正在寻找一个非常快速的字节数组相等比较器,我建议您阅读这篇STSdb实验室文章: Byte array equality comparer. 它提供了一些字节[]数组相等比较的最快实现,并对这些实现进行了介绍、性能测试和总结。 您还可以关注这些实现: BigEndianByteArrayComparer -从左到右的快速字节[]数组比较器(BigEndian) BigEndianByteArrayEqualityComparer LittleEndianByteArrayComparer LittleEndianByteArrayEqualityComparer |
|
27
-2
简单的回答是:
通过这种方式,您可以使用优化的.NET字符串比较来进行字节数组比较,而无需编写不安全的代码。这是如何做到这一点的 background :
|
|
|
28
-2
由于上述许多奇特的解决方案不适用于UWP,并且因为我喜欢Linq和函数方法,我向您介绍了我的版本来解决这个问题。 为了在出现第一个差异时避免比较,我选择了.FirstOrDefault()
|
|
Sweepy Dodo · JSON lite的格式化 1 年前 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
Zegarek · Postgresql递归查询未提供预期结果 1 年前 |
|
|
Joe · 为什么这两个查询之间的性能存在如此大的差异? 1 年前 |
|
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 1 年前 |