我们有一块代码块会产生很多异常(显然是IndexOutOfRangeException)。它有可能产生高达50,000 /秒的速度。它们被捕获但cpu真的很高峰。代码块只是检查IDataRecord的列。该块非常通用,如果列不存在,则捕获异常并返回布尔值。
如果不是例外情况,这不是问题。我能想到解决这个问题的唯一方法是迭代IDataRecord的列以查看列在处理之前是否存在,但这似乎也是一个昂贵的步骤,因为这是一个非常高流量的应用程序,你会在访问任何列之前都有这个循环。
我只是在寻找一些想法。
答案 0 :(得分:3)
确保首先找到您要查找的列。抛出异常通常会带来更大的性能影响,但所有这些虚假异常可能会隐藏代码中的合法错误。
确保列首先存在的最佳方法是使所有这些IDataRecord
类符合此函数关于它们包含哪种数据的假设。或者使功能符合实际数据。让一个过程假设一个值存在,它并不意味着你的程序的结构与它实现的业务逻辑不匹配,这是一种不应该被允许持久化的情况。
第二个问题是循环遍历每个对象的字段以查看它实际包含该字段的内容,但这有点在地毯下扫除更深层次的问题。
但是,你不应该依赖控制流的例外。
答案 1 :(得分:0)
如果要通过索引检查列。你应该先避免这个例外。请改用IsDBNull
的{{1}}方法,更多信息here
是的,如果列存在,您应首先检查,这就是您获得IDataRecord
答案 2 :(得分:0)
"我能想到解决这个问题的唯一方法是迭代IDataRecord的列,以便在处理之前查看列是否存在"
如果超出数组末尾,则只会出现此错误。您不需要逐步浏览每一列,只需获取当前列"计算"
for(int i = 0; i < column.count; i++)
{
dowork(column[1]);
}
根据我的阅读,例外成本约为5,000-10,000个时钟周期。在大多数情况下,迭代列会更便宜,但是我确定对象的属性会让你知道有多少列存在,而不是每次都实际计算它们。