我在处理异常时遇到了一些麻烦。 我正在建设... aaaaa ... soooo ...嗯...图表数据库?是的,像这样......用vb.net。 我正在构建解析器,用于处理db的基本功能(?)会发生什么?用户进行研究,程序选项卡,并允许进行一些计算。通常是字符串处理,但是,为了提供完整的工具,我还实现了数学函数 没有办法知道他要插入的开发时间数学类型的值。尤其是,无法知道遍历遍历的列的每一行是否具有相同的数据类型。它是一个无架构的数据库(?)。 所以发生了什么...我必须实现错误处理。
For i As Integer = 0 To pR.r.wsRowCount - 1
Try
pR.r.wsItem(cix, i) = Convert.ToDouble(pR.r.wsItem(ca.ix, i)) * Convert.ToDouble(pR.r.wsItem(cb.ix, i))
Catch
pR.r.wsItem(cix, i) = String.Empty
End Try
Next
像这样......
(psss .. Convert.toDouble()
是cDbl()
,Double.Parse()
等之间性能最高的函数。
但是当我运行它时,如果所有行(基准测试大约2000行),真的是数字......几毫秒,但如果某些行不是数字,则需要3或4秒。最糟糕的情况是,如果用户应该在字符串列中进行数学运算...再见,同时最好去喝咖啡。
所以我的计算机可能不是世界上最先进的,但是你知道是否有任何方法可以避免错误处理中这种令人难以置信的延迟?我记得这是查询的解析器,我会避免让它变重。
答案 0 :(得分:3)
当您的代码遇到无法转换为double的值时,您正在使用例外来解决问题。这称为使用异常驱动您的代码,这是一种不好的做法。捕获异常从来都不是这种情况的好方法。
特别是当有明确的方法来避免它们时
For i As Integer = 0 To pR.r.wsRowCount - 1
Dim d1 As Double
Dim d2 As Double
if Double.TryParse(pR.r.wsItem(ca.ix, i), d1) Then
if Double.TryParse(pR.r.wsItem(cb.ix, i), d2 Then
pR.r.wsItem(cix, i) = (d1 * d2).ToString()
else
pR.r.wsItem(cix, i) = String.Empty
End If
Else
pR.r.wsItem(cix, i) = String.Empty
End If
Next
Convert.ToDouble
无法处理字符串不是有效数值的事实,如果遇到这种情况,则会抛出异常。抛出异常在性能方面成本很高,特别是在收集有关调用堆栈的信息时。
相反,如果您的输入可能包含无法转换为double的值,那么Double.TryParse
也是正确的方法,如果您的基准测试表现出性能上的一些差异。如果传递的字符串无法转换为double,但返回false,则Double.TryParse
不会引发异常。通过这种方式可以避免代价高昂的异常,并且您有更可预测的执行时间
说,你应该重新评估你在某些字符串结构中存储每种数据的方法。在字符串和预期数据类型之间进行持续转换的需要可能是一个真正的瓶颈。