javatry/Catch块的基准测试

javatry/Catch块的基准测试,java,try-catch,Java,Try Catch,我知道在执行一个程序时,进入catch块会有一些重大的成本,但是,我想知道进入try{}块是否也会有任何影响,所以我开始在谷歌上寻找答案,提出了很多意见,但根本没有基准测试。我找到的一些答案是: 然而,他们没有用事实回答我的问题,所以我决定自己试试 这就是我所做的。我有一个以下格式的csv文件: 主机;知识产权;数量;日期;地位电子邮件;uid;名称姓氏;促销代码 状态之后的所有内容都是可选的,甚至没有相应的,因此,在解析验证以查看值是否存在时,我想到了try/catch问题 我在公司继承

我知道在执行一个程序时,进入catch块会有一些重大的成本,但是,我想知道进入try{}块是否也会有任何影响,所以我开始在谷歌上寻找答案,提出了很多意见,但根本没有基准测试。我找到的一些答案是:

  • 然而,他们没有用事实回答我的问题,所以我决定自己试试

    这就是我所做的。我有一个以下格式的csv文件:

    主机;知识产权;数量;日期;地位电子邮件;uid;名称姓氏;促销代码

    状态之后的所有内容都是可选的,甚至没有相应的,因此,在解析验证以查看值是否存在时,我想到了try/catch问题

    我在公司继承的当前代码执行以下操作:

    StringTokenizer st=new StringTokenizer(line,";");  
    String host = st.nextToken();
    String ip = st.nextToken();
    String number = st.nextToken();
    String date = st.nextToken();
    String status = st.nextToken();                             
    String email = "";
    try{
        email = st.nextToken();
    }catch(NoSuchElementException e){
        email = "";
    }
    
    它用uid、name、lastname和promo_代码重复它对电子邮件所做的操作

    我把一切都改成:

    if(st.hasMoreTokens()){
        email = st.nextToken();
    }
    
    事实上,它表现得更快。解析没有可选列的文件时。以下是平均时间:

     --- Trying:122 milliseconds
     --- Checking:33 milliseconds
    
    然而,这是让我困惑的地方,也是我提出问题的原因:当使用CSV所有8000行中可选列的值运行示例时,if()版本仍然比try/catch版本性能更好,所以我的问题是

    try块真的对我的代码没有任何性能影响吗?

    此示例的平均时间为:

    --- Trying:105 milliseconds
    --- Checking:43 milliseconds
    
    有人能解释一下这是怎么回事吗

    非常感谢

    是的,try(在Java中)对性能没有任何影响。编译器不会为try块生成VM语句。它只记录try块处于活动状态的程序计数器,并将此信息附加到类文件中的方法。然后,当抛出异常时,VM将展开堆栈,并在每个帧检查该帧中的程序计数器是否位于相关的try块中。这(加上构建堆栈跟踪)成本非常高,因此捕获成本很高。但是,尝试是免费的:)

    不过,将异常用于常规控制流并不是一个好的实践

    代码执行速度更快的原因可能是捕获的成本非常高,超过了用简单的尝试替换检查所节省的时间


    Try-catch可以在捕获不经常触发的代码中更快,例如,如果您进入Try 10000次但只捕获一次,那么Try方法将比if检查更快。尽管如此,这不是一种好的样式,您最好使用显式检查更多令牌的方法。

    每次检查条件都会使程序运行变慢。有多个IF语句不是一个好主意。你们公司的做法似乎可以理解。无论何时出现任何错误,您都可以使用catch块来查看它是关于什么的。我不会支持这一点。在他的情况下,电子邮件是可选的,因此不再有代币不是例外情况,但可能经常发生。在这里使用异常不是一种好的风格。不仅会经常发生,而且是默认行为。我们只会在很多小的情况下获得可选字段。我不知道这是否会对某些人有所帮助,但我正在使用英特尔奔腾双核2.70的Ubuntu 10.04上运行Java jdk_linux_x86_1.6.0.13中的“基准测试”Ghz@AlpeshPrajapati我发现另外两篇文章讨论了try/catch作为控制流机制的使用。它们很好,所以我想分享它们,谢谢,我真的理解这一点,但是我试过的代码说不一样,它执行起来像try{}它在运行时给它带来了一些开销,这就是我的问题所在。我可以将测试代码粘贴到某个地方,这样你就可以自己试试看了。好的,我明白了。好吧,问题可能是尝试更难优化。但是,性能影响无论如何都是可以忽略的。作为经验法则,为了优化的原因,你不应该考虑用It/catch来交换。只需使用try/catch即可实现异常行为,如果用于常规控制流,则使用if。其他一切都是黑客行为。我在问题中给出的次数是1)每次进入catch块时总是(8000次*5列)2)永远不要进入catch块,因为可选列总是在那里。这种try/catch结构经常用于实时环境,其中执行时间非常重要,并且您不会期望出现很多错误。如果您已经说“期望出现很多错误”,那么您指的是异常情况。在这些情况下,不管怎样,try/catch都可以。