Java性能问题

Java性能问题,java,performance,method-invocation,Java,Performance,Method Invocation,我有一个关于java性能和方法执行的问题 在我的应用程序中,有很多地方我必须验证一些参数,因此我编写了一个验证器类,并将所有验证方法放入其中。以下是一个例子: public class NumberValidator { public static short shortValidator(String s) throws ValidationException{ try{ short sh = Short.parseShort(s);

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

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

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!");
        }
    }
...
public class NumberValidator{
公共静态短验证程序(字符串s)抛出ValidationException{
试一试{
short sh=short.parseShort(s);
如果(sh<1){
抛出新的ValidationException();
}
返回sh;
}捕获(例外e){
抛出新的ValidationException(“参数错误!”);
}
}
...
但是我在想,这样行吗?它是面向对象的,模块化的,但是考虑到性能,这是个好主意吗? 如果我在同一时间进行了大量的调用呢?上面的代码段很短,速度很快,但是有些方法需要更多的时间

当对同一类中的静态方法或实例方法进行大量调用,并且该方法不同步时,会发生什么情况?所有调用方法必须对齐,JVM按顺序执行它们

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


谢谢是预付款。

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


当然,在调用类中复制并粘贴此方法不会提高性能。可能会降低性能,因为您的代码大小会增加,并且会在che处理器缓存中浪费空间,但对于这样一个短的方法,我认为这是一个可跟踪的效果。

关于方法的可重入性:如果它是静态的,它会没有任何状态,所以非常安全


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

您是否遇到性能问题

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

如果你在每一个选项上都对代码的速度进行了优化,那么你经常会遇到一些不可读的东西,不得不从头开始修复简单的bug

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

只有两条注释:

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


2) 尝试避免“捕获”(异常e)“。这是不推荐的,因为您还捕获了各种各样的RuntimeException。如果您在一个非常重要的验证中有一个bug,您可能会抛出一个ValidationException来隐藏代码中的bug。

我怀疑这段代码,与其说是出于性能考虑,不如说是因为我认为它没有成功地抽象出任何东西。”这值得抽象

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


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

"“微优化问题”正在显现!我知道这是吹毛求疵,但您的参数不应该有一个双参数构造函数来接受导致当前异常的异常吗?所有的框架异常都不……不是回答您的问题,而是关于样式的注释。在您的示例中,您似乎将异常用作控制流机制(在sh<1之后抛出,捕获,然后再次抛出)。这不仅会使代码更难理解,而且会生成额外的异常,而且由于您正在进行优化,这是低效的,而且try/catch是“昂贵的”根据我所读的内容构造。re.:OMG Unicorns:我以后不会使用那个异常对象。当异常发生时(任何类型)验证将失败,我将向用户报告。我不关心它是什么异常。是的,你说得对!我有多个线程的并发调用。我不是专家,也不知道它是如何工作的。我认为有一种方法,即使它不同步,也只有一个线程可以执行一次,是吗因为“有一个”@Colby77:不,这不是它的工作方式。线程可以同时执行相同的代码;方法参数和局部变量位于堆栈上,每个线程都有自己的堆栈。谢谢Michael,我不知道!也可能是他正在验证必须导入的文件的输入,或者他有一个高并发服务器应用程序。N尽管如此,他并没有任何明显的性能问题。事实上,我是在不久前受到阿特伍德跌入微优化陷阱的启发()我使用javascript在客户端验证数据。因此,考虑到正确的使用,不存在发送错误数据的机会。如果有人发送了错误数据,我就不必将他做错的事情发回给他,