对于已知情况是否应该避免尝试捕获

2024-02-07

我有一个我知道会发生但非常罕见的案例。例如,代码每运行一万次,这种情况可能会发生一次。

我可以通过一个简单的方法来检查这种情况if但是这个if会运行很多次没有用。

另一方面,我可以将代码放在 try-catch 块中,当发生特殊情况时,我会执行恢复所需的操作。

问题是哪一个更好?我知道,一般来说,由于开销问题,try-catch 不应该用于已知情况,而且应用程序逻辑不应该依赖于 catch 代码,但多次运行 if 会产生更多性能问题。我已经使用这个小测试代码对此进行了测试:

static void Main(string[] args)
{
    Stopwatch sc = new Stopwatch();
    var list = new List<int>();
    var rnd = new Random();
    for (int i = 0; i < 100000000; i++)
    {
        list.Add(rnd.Next());
    }

    sc.Start();
    DoWithIf(list);
    sc.Stop();
    Console.WriteLine($"Done with IFs in {sc.ElapsedMilliseconds} milliseconds");
    sc.Restart();
    DoWithTryCatch(list);
    sc.Stop();
    Console.WriteLine($"Done with TRY-CATCH in {sc.ElapsedMilliseconds} milliseconds");
    Console.ReadKey();
}

private static int[] DoWithTryCatch(List<int> list)
{
    var res = new int[list.Count ];
    try
    {
        for (int i = 0; i < list.Count; i++)
        {
            res[i] = list[i];
        }
        return res;
    }
    catch
    {
        return res;
    }
}

private static int[] DoWithIf(List<int> list)
{
    var res = new int[list.Count - 1];
    for (int i = 0; i < list.Count; i++)
    {
        if (i < res.Length)
            res[i] = list[i];
    }
    return res;
}

此代码只是将大量数字复制到大小不足的数组中。在我的机器中,每次检查数组边界都需要花费一些时间210毫秒使用 try-catch 运行,一旦运行就会命中 catch190 毫秒.

另外,如果您认为这取决于情况,我的情况是我在应用程序中收到推送通知,并会检查我是否有消息的主题。如果没有,我将获取并存储下一条消息的主题信息。几个主题中有很多消息。


因此,准确地说,在您的测试中,if选项比try...catch选项增加 20 毫秒,循环 100000000 次。
这意味着 20 / 100,000,000 - 这就是每次迭代 0.0000002 毫秒.

您真的认为这种纳米优化值得编写违背正确设计标准的代码吗?

例外是指特殊情况,即您无法控制或无法提前测试的事情 - 例如,当您从数据库读取数据并且连接在中间终止时 - 诸如此类的事情。 对可以通过简单代码轻松测试的事物使用异常 - 嗯,这完全是错误的。

例如,如果您已经证明这两个选项之间存在有意义的性能差异,那么也许您可以证明使用try...catch代替if- 但这里的情况显然不是这样。

所以,总结一下 - 使用if, not try...catch.

您应该为了清晰而设计代码,而不是为了性能。
编写代码,以尽可能清晰的方式传达其正在实现的算法。
设置性能目标并根据这些目标衡量代码的性能。
如果您的代码无法达到您的性能目标,请找到瓶颈并加以解决。
设计代码时,不要在纳米优化上浪费时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于已知情况是否应该避免尝试捕获 的相关文章

  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • mysql表中的数据非常大。即使 select 语句也需要很多时间

    我正在开发一个数据库 它是一个相当大的数据库 有 13 亿行和大约 35 列 这是我检查表状态后得到的结果 Name Table Name Engine InnoDB Version 10 Row format Compact Rows 1
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 未解决的包含:“cocos2d.h” - Cocos2dx

    当我在 Eclipse 中导入 cocos2dx android 项目时 我的头文件上收到此警告 Unresolved inclusion cocos2d h 为什么是这样 它实际上困扰着我 该项目可以正确编译并运行 但我希望这种情况消失
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • NHibernate - CreateCriteria 与 CreateAlias

    假设以下场景 class Project public Job Job class Job public Name 假设我想使用 Criteria API 搜索其 Job 名称为 sumthing 的所有项目 我可以使用 CreateAli
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Gradle 任务差异

    下面两个代码片段有什么区别 First task copyFiles type Copy lt lt from folder from into dest folder Second task copyFiles type Copy fro
  • 如何通过EC2 SSH隧道从本地JAVA程序连接到RDS

    我正在尝试通过 SSH 隧道从本地 JAVA 程序连接到 RDS 数据库到 EC2 实例 以进行调试 我正在尝试在 EC2 实例中建立 SSH 隧道 然后将端口转发到 RDS 数据库 这是我的代码 final int localPort 9
  • Webgl 没有渲染我的圆圈

    我正在尝试学习如何使用 Webgl 并且已经学会了如何绘制三角形 正方形和直线 我在 webgl 中创建圈子时遇到问题 var InitDemo function var canvas document getElementById cir
  • 如何设置绑定项目的ContextMenu?

    我正在努力实现以下目标
  • C# RichTextBox选择问题

    我的应用程序上有一个 RichTextBox 控件 这是我的问题 当应用程序运行时 如果我开始用鼠标选择单词内的某些字符并继续在其外部选择 则选择会自动包含我开始选择的整个单词以及我想从中选择一部分的任何其他单词 ms word ish 如
  • IMPORTXML 到具有自动更新功能的 Google Apps 脚本中 [重复]

    这个问题在这里已经有答案了 我正在尝试让 Google 表格应用程序脚本适用于我正在使用的 IMPORTXML A1 importxml http www nfl com liveupdate scorestrip ss xml q A2
  • 获取矩阵元素的邻居

    我有一个矩阵 对于每个元素 我想获取其周围元素的索引 所有这些结果必须按以下方式存储到矩阵中 矩阵的每一行对应于一个矩阵元素 并且该矩阵的每一列包含 s 个邻居索引 例如 对于 4x4 矩阵 我们将得到一个 16x8 结果数组 某些矩阵元素
  • Ms Access vba 打开另一个数据库中表的数据表视图

    该语句将打开当前数据库中指定表的数据表视图 DoCmd OpenTable sTablename acViewNormal 有没有办法让另一个数据库中的表达到相同的结果 我有一个表单 可以在其中选择 Access 数据库 然后下拉菜单中会填
  • Mongodb 是否可以聚合对象?

    我正在尝试汇总本文档中的数据包总数 id ObjectId 51a6cd102769c63e65061bda capture 1369885967 packets 0 595 1 596 2 595 3 595 我能得到的最接近的是 db
  • Jythonc 失踪

    我刚刚安装了 Jython 2 5 1 我想将我的 Python 文件转换为 Java 类文件 网站上指示使用 jythonc 命令行工具 但我找不到它 有谁知道我在哪里可以找到它 基本上我想要完成的是让我的 Python 代码在浏览器中运
  • ValueError:无法处理多标签指示器和二进制的混合

    我将 Keras 与 scikit learn 包装器一起使用 特别是 我想使用 GridSearchCV 进行超参数优化 这是一个多类问题 即目标变量只能在一组 n 个类上选择一个标签 例如 目标变量可以是 Class1 Class2 C
  • PyMC - 方差-协方差矩阵估计

    我读了下面的论文 http www3 stat sinica edu tw statistica oldpdf A10n416 pdf http www3 stat sinica edu tw statistica oldpdf A10n4
  • PHPUnit 总是输出“没有执行测试!”在 MacOS 大苏尔

    当尝试跑步时anyPHPUnit 测试 我总是得到No tests executed 我的 MacOS 机器上的消息 在这台特定机器上进行重现的一个简单方法是安装一个新的 Laravel 实例并运行默认测试 composer create
  • jQuery;对于 new Image(),Chrome 图像宽度和高度 = 0

    在 DOM 加载后 我无法让 Chrome 识别图像宽度或高度 图像通过 phpThumb 脚本动态加载 调整图像大小 如果我去掉动态 url 并将其替换为图像的直接 url 我不会遇到任何问题 并且 Chrome 中一切正常 但使用动态
  • SQL 中关键字“GROUP”附近的语法不正确

    我在对语句进行分组时遇到错误 这是我的代码 DECLARE avg volume INT SELECT avg volume ISNULL AVG Total Volume 0 FROM SELECT station id DATEPART
  • 使用 ALTER 删除 MySQL 中存在的列

    如果 MySQL 表中存在某列 如何使用 ALTER 删除该列 我知道我可以使用ALTER TABLE my table DROP COLUMN my column 但是如果my column不存在 是否有替代语法来有条件地删除列 我使用的
  • Android 数据绑定:多次调用自定义绑定适配器时生成的代码中缺少返回语句

    我正在使用 android 数据绑定库和 MVVM 架构 在 xml 布局中 我定义了一个名为 viewModel 类型为 myViewModel 的变量 该布局有几个 TextInputEditText 我使用了以下自定义绑定适配器 ma
  • 检查 C++ 中 int 溢出

    我正在运行一个 C 程序 它在 for 循环中添加数字 int y 0 for int i 0 i
  • Mac Python“安装步骤失败:运行 postflight 脚本”

    我是 Python 开发新手 在尝试安装 Aptana Studio 时 我似乎搞乱了我的 Python 安装 所以我按照这里的卸载 MacPython 说明进行操作http homepages cwi nl jack macpython
  • 对于已知情况是否应该避免尝试捕获

    我有一个我知道会发生但非常罕见的案例 例如 代码每运行一万次 这种情况可能会发生一次 我可以通过一个简单的方法来检查这种情况if但是这个if会运行很多次没有用 另一方面 我可以将代码放在 try catch 块中 当发生特殊情况时 我会执行