2

我有一个与 java 性能和方法执行有关的问题。

在我的应用程序中有很多地方我必须验证一些参数,所以我编写了一个 Validator 类并将所有验证方法放入其中。这是一个例子:

public class NumberValidator {
    public static short shortValidator(String s) throws ValidationException{
        try{
            short sh = Short.parseShort(s);

            if(sh < 1){
                throw new ValidationException();
            }
            return sh;
        }catch (Exception e) {
            throw new ValidationException("The parameter is wrong!");
        }
    }
...

但我正在考虑这一点。这个可以吗?它是 OO 和模块化的,但是 - 考虑到性能 - 这是一个好主意吗?如果我同时有很多调用怎么办?上面的代码片段简短而快速,但有些方法需要更多时间。

当同一个类中的一个静态方法或者一个实例方法被大量调用并且方法不同步时会发生什么?所有的调用方法都必须排成一行,并且 JVM 按顺序执行它们?

拥有一些与上述相同的类并随机调用它们相同的方法是个好主意吗?我认为不是,因为“不要重复自己”和“重复是邪恶的”等。但是性能呢?

谢谢是提前。

4

5 回答 5

1

关于您的方法的重入:如果它是静态的,则它不保持任何状态,因此它非常安全。

关于性能:查看您的用例。由于您正在验证字符串,我只能假设您正在验证用户输入。在任何情况下,系统的同时用户数都不可能导致性能瓶颈。

于 2010-04-21T13:51:45.113 回答
1

只有两条评论:

1) 将验证分解到方法中实际上可能会稍微提高性能。据我所知,JIT 编译器旨在检测频繁的方法调用。因此,验证方法是 JIT 优化的良好候选者。

2) 尽量避免'catch(Exception e)'。不建议这样做,因为您还要捕获各种 RuntimeException。如果您在其中一个重要验证中遇到错误,您可能会抛出隐藏代码中错误的 ValidationException。

于 2010-04-21T13:56:37.760 回答
0

不知道你有什么顾虑。既然您提到了未同步的方法,我想您有来自多个线程的并发调用。并且由于该方法不是同步的,因此任何调用都可以同时执行而不会出现问题。

通过将此方法复制并粘贴到调用类中,您肯定不会获得任何性能改进。可能您会降低性能,因为您的代码大小会增加并且会浪费处理器缓存中的空间,但是对于这么短的方法,我认为这是一个可追溯的效果。

于 2010-04-21T13:40:45.040 回答
0

您是否遇到性能问题?

首先让代码易于维护,如果它没有达到预期,它将易于阅读和易于重构。

如果您为每个选择的速度优化代码,您通常会得到一些不可读的东西,并且必须从头开始修复简单的错误。

也就是说,您的方法是静态的,并且只需要初始化一次。那快速版本。:-)

于 2010-04-21T13:54:29.683 回答
0

我对这段代码持怀疑态度,与其说是基于性能,不如说是我认为它没有成功地抽象出任何值得抽象的东西。

如果它是用于检查用户输入,它会用 'ValidationException' 替换合理的错误消息,例如“允许的最大小部件数量为 9999”。而且,如果您添加诸如参数(或 try/catch 子句)之类的内容以在上下文中正确获取消息,那么几乎可以肯定,所需的调用站点代码比直接的处理方式更复杂、更难编写和维护。

如果是为了内部健全性检查,你很可能会开始失去有意义的性能,并且肯定会大大增加复杂性和错误,如果你将参数作为字符串传递到各处并不断解析和验证它们。

于 2010-04-21T14:16:35.717 回答