gpt4 book ai didi

vb.net - 我怎样才能简化和优化这个校验和代码?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:50:50 25 4
gpt4 key购买 nike

好的,这段代码可以工作,但我认为中间有一些必要的步骤才能得到结果。关于如何使它更紧的任何想法?

Public Function CalCheckSum(ByVal ByteList As List(Of Byte)) As List(Of Byte)
Dim total As Integer = 0
For Each b As Byte In ByteList
total = total + b

Next
Dim modedVal As Integer = 0
modedVal = total Mod &H100
Dim negatedValue As Integer = 0
negatedValue = &H100 - modedVal
Dim charList As List(Of Char) = Hex(negatedValue).ToCharArray.ToList
Dim returnList As New List(Of Byte)
For Each ch As Char In charList
returnList.Add(Asc(ch))

Next
Return returnList

End Function

顺便说一句,这是我用来测试它的:

Dim blist As New List(Of Byte)
blist.Add(&H52)
blist.Add(&H34)
blist.Add(&H35)
blist.Add(&H31)
blist.Add(&H32)
blist.Add(&H33)
blist.Add(&H34)
blist.Add(&H30)

blist.Add(&H30)
blist.Add(&H30)
blist.Add(&H30)
blist.Add(&H46)
blist.Add(&H46)
blist.Add(&H46)
blist.Add(&H46)
blist.Add(&H42)
blist.Add(&H4B)
blist.Add(&H9)
blist.Add(&H44)

Dim b As List(Of Byte) = CalCheckSum(blist)

b 的正确值是:

  • b(0) = &H43
  • b(1) = &H39

最佳答案

老实说,我不确定您为什么要浪费时间来优化它。在一个循环中调用该函数超过 100,000 次需要不到 20 毫秒。即使这是您的应用程序中的“热点”之一(因为您说它与嵌入式硬件设备通信),您也不太可能通过优化现有代码看到任何明显的速度提升。

但只是为了好玩,我决定看看我是否不能对事情进行一些优化......这是我想出的:

  1. 删除多余的 List(Of Char) 创建。您已经使用 ToCharArray 方法将值转换为数组。为什么要花费调用 ToList 的费用,只是为了遍历它?您也可以遍历数组。这将时间缩短到 8 秒左右,以最少的努力实现了相当大的加速。

  2. 您还可以将新 List(Of Byte) 的近似大小作为参数传递给构造函数。您已经从 charArray 的大小知道这一点,因为您只是将这些元素中的每一个添加回去。当您只处理两个项目时,这没有任何区别,如您提供的示例,但对于大量元素,它可以使事情稍微更有效率,因为 List 在循环期间的任何时候都不必动态调整大小。

    <
  3. AscAscWConvert.ToInt32 之间绝对没有区别。我明确地测量了它们中的每一个只是为了看看。我的直觉是将其更改为 AscW,但显然这并不重要。许多人会对使用 VB 特有的习语嗤之以鼻,并推荐他们认为由 .NET Framework 提供的更通用的方法。事实证明,由于所有特定于 VB 的代码都是用与备选方案相同的托管代码编写的,因此使用哪种偏好只是一个简单的问题。

  4. 否则用简单数组替换 List(Of T) 也不会产生任何明显的差异。由于 List 更易于在函数外部使用,因此您不妨将其保留为返回类型。

所以我的最终代码看起来像这样:

Public Function CalCheckSum(ByVal ByteList As List(Of Byte)) As List(Of Byte)
Dim total As Integer = 0
For Each b As Byte In ByteList
total = total + b
Next

Dim negatedValue As Integer = 0
negatedValue = &H100 - (total Mod &H100)

Dim charArray As Char() = Hex(negatedValue).ToCharArray()

Dim returnList As New List(Of Byte)(charArray.Length)
For Each ch As Char In charArray
returnList.Add(CByte(Asc(ch)))
Next

Return returnList
End Function

即使在一个循环中运行 999,000 次,我始终将它计时在 62 到 64 毫秒之间。

您也可以使用 LINQ。这不是我的领域,我怀疑你会看到任何可测量的速度增加(它仍然必须在幕后进行相同数量的循环和迭代)。它提供的最大好处是您的代码更简单,看起来更干净。我很惊讶有人还没有发布这个解决方案。

编辑:顺便说一句,您的原始代码没有为我编译。我必须添加 CByte 运算符以将从 Asc 运算符返回的 Integer 值转换为 Byte 类型.这告诉我你不是在用 Option Strict 编程 上。 但您应该这样做。您必须在项目的属性中明确设置该选项,但强类型的好处远远超过检查和修复一些现有代码的成本。您甚至可能会注意到性能提升,尤其是在您无意中使用了大量后期绑定(bind)的情况下。

关于vb.net - 我怎样才能简化和优化这个校验和代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812560/

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