How much would wrapping every method in in try-catch blocks slow a program down?
所以我正在处理这个代码库,每个方法都包含在一个try-catch块中,该块只将异常记录到一个日志文件中。
我正在考虑挥手改变这一点,但我一个月后就走了,我不确定这会减慢代码的速度。是的,这是可怕的练习,但这是本课程的标准。是的,它使错误更难调试,但它"更容易"。
这里的人的决定因素是速度。所以我想知道这会使代码慢多少?我在向比我更了解编译器的人征求大概的估计。
我知道有很多重复的问题,关于异常是否会减慢速度,它取决于编译器版本等,但我在这里寻找更多的建议。我也很好奇。
- 为什么不做一些基准测试?
- 就像@hosseinnarimanirad所说的,把尝试捕获物拿出来,运行一批操作。然后把它们放回去,运行同一批。
- 这很可能最终会落入"微观优化"范畴。如果你想显著提高性能,我相信你会找到更好的地方。我将从数据库访问和索引开始,然后继续进行一些事情,比如不必要地循环访问大型集合,不必要地进行小作业,而这些小作业不能成批地放在一起,诸如此类。
- 它插入了一些额外的IL,所以是的,它明显较慢,但是谁在乎呢。这更像是一个风格问题,就像@joe enos所说的,池塘里可能有更大的鱼。
- @Hosseinnarimanirad是一个庞大的代码库。我用几种方法做了这件事,两种方法都用了几百次,而且似乎相当容易被人取缔。但我想,有一些专业知识的人可以给我一个手摇的概述。
- 每个方法中的catch块是接受异常,还是重新引发异常?
- @小燕子。只需将其写入一个大日志文件。
- 每个方法都包含在一个try-catch块中,这意味着您有代码质量、维护和可能的正确性问题。我不会那么担心速度。
- @纳森坦佩尔曼:"燕子。只需将其写入一个大的日志文件。"如果您的Try/Catch块只是吞咽异常并让应用程序以未定义的方式静默失败,我建议您遇到比Try/Catch性能更大的问题。
- 如果它们接受异常,那么删除try-catch块将实质上改变应用程序的行为。我不会因为这个原因而做出改变,除非你愿意在转化过程中投入大量的工作。顺便说一下…真是一团糟。
- 请参阅dailywtf.com/articles/exceptional-hard-to-swallow.aspx以了解警示故事。
- @亨霍尔特曼是的,我很清楚,但速度似乎是人们唯一关心的事情。这可能就是它这么慢的原因。当你想到这件事时有点滑稽。
它可能不会减慢正在运行的应用程序的速度,因为在抛出异常之前,它实际上不会做任何事情。(除非你真的想要压缩每一点性能,而且大多数应用程序不需要这样做。更不用说,这种编码方式意味着这个应用程序可能还有许多其他更普遍的问题。)
它所做的就是用大量不必要的异常捕获来污染代码。(注意抓取和有意义的处理之间的区别。我可以向您保证,这段代码是在做前一段代码,而不是后一段代码。)这会减慢开发速度,开发时间比系统时间的毫秒要昂贵得多。
Yeah, it's horrible practice, but that's par for the course.
听起来你已经走了:)
Yeah, it makes errors more difficult to debug, but it's"easier".
这是两个相互排斥的陈述。这不可能既困难又容易。有人认为这会更容易。他们错了。
How much would wrapping every method in try-catch blocks slow a program down?
以开发时间来衡量,很多。
- 是的,这基本上就是我想的。如果没有一个巨大的速度提升点,我认为这些点不会有太大的摇摆。不过,谢谢你的回答,它写得很好,很聪明。
在每个方法中加入一个try/catch来捕获一般的异常,结果会因为性能以外的原因而变得很痛苦。即,无论应用程序的状态如何,应用程序都将继续"运行"。换句话说,并非所有的异常都可以或应该被处理。例如,当数据库关闭、电子邮件服务器、坏事务(或者应该是事务性的但不是因为糟糕的设计)等时会发生什么?
我在类似的环境中工作过。最终关注的不是性能。我害怕把"业绩原因"作为一个笼统的含糊不清的地方,抓住所有的理由做出其他的强制性决定……我离题了。
但是,如果你在一个月内外出,我提醒你考虑这个论点是否有必要。开发车间已经证明低于您的标准。重要的是不要烧了一座桥,因为一个坏的参考可能会让你失去一个未来的职位。
- "if you are out in a month there's little reason to worry about it"—我一直在向上投票按钮上徘徊,直到我看到…
- @大卫-我这么说只是因为有些战斗不值得战斗。根据我的经验,做出如此巨大的改变很容易导致"烧桥"。这不是明智的政治举动。注意自己的职业生涯和技术决策是很重要的。如果运营商认为他们可以在不"招致老板愤怒"的情况下做出这样的改变,那么无论如何都要做出正确的技术决策。
- 一个有效的观点,但仍然是一种不专业的方法。如果雇主坚持使用糟糕的软件实践,那么他们就不是一座可以继续使用的桥梁。把它作为研究一个课题的机会,提出一个有说服力的论点。当然,这可能是一个完全的损失。但是,不管自己的原则如何,放弃并坚持现状是不好的职业发展。
- 行动表明了主动性,并希望通过参与行动来提高。我称之为良好的职业发展。我经历过这样的情况:我提出了许多被忽视的论点,这使我失去了我的地位。考虑到行动党已经决定退出,我怀疑他们也处于类似的困境中。在这种情况下,这是一个糟糕的举措,因为引用确实很重要。
- @大卫,你们都有好的观点,所以谢谢你们。我想我可能会提到它,看看它去了哪里,给我一个机会让我的连贯的论点。也就是说,我不认为我会用力推。我们称之为妥协。我还发现了一个home brew add element to array方法,它可以在每次添加元素时调整数组的大小,而且它已经使用了数千次。我认为使用链表应该会大大提高性能,所以如果讨论有问题的话,也许这会给我一个和平的机会。
try块中的代码在编译器如何优化方面受到限制。实际上,如果用try/catch包装每个方法,您将限制优化。请参阅http://msmvps.com/blogs/peterritchie/archive/2007/06/22/performance-implications-of-try-catch-finally.aspx和http://msmvps.com/blogs/peterritchie/archive/2007/07/12/performance-implications-of-try-catch-finally-part-two.aspx
性能受影响的程度取决于应用程序。
- 写得不错,很有趣。我甚至没有考虑过JIT的优化。
- C编译器基本上不进行优化。它所做的一切都是显而易见的。
- 是的,但是有了这样的代码,你会惊讶于有多少令人生厌的显而易见的东西被遗留下来。