JodaTime第一次打电话时速度很慢

时间:2012-07-03 08:25:39

标签: java performance static jodatime

import org.joda.time.LocalDate;

public class Test {
    public static void main(String[] args) {
        long time=System.currentTimeMillis();
        new LocalDate(2000,1, 1);
        System.out.println(System.currentTimeMillis()-time);
        time=System.currentTimeMillis();
        new LocalDate(2000,1, 1);
        System.out.println(System.currentTimeMillis()-time);
    }
}

第一次调用new LocalDate需要110ms。 第二次通话需要0ms。

首先,如何为给定的类运行所有静态初始值设定项? 其次,有没有办法在我的应用程序提前引用的所有类中执行此操作?

我的应用程序对延迟非常敏感。

3 个答案:

答案 0 :(得分:2)

这就是Java和JVM的工作原理 - 在最佳运行之前总是需要预热。您应该进行一些集成测试,以执行应用程序的所有部分,最好是以对数据无破坏的方式。然后在每次部署时对应用程序运行它们。这将使您确信该应用程序正在运行。

答案 1 :(得分:2)

您可以获取使用-XX:+TraceClassLoading加载的类列表,并将其保存到文件中。 然后,您可以使用Class.forName()来确保所有这些类都已加载。

这将加载每个类并确保已加载它们的静态块。

然而,对于延迟敏感代码,您确实需要确保它已经通过升温来编译(即调用它足以触发编译)这可以将延迟进一步减少10倍或更多。


如果你跑

public class CallStatic {
    public static void main(String... args) throws ClassNotFoundException {
        Class.forName("Static");
    }
}

class Static {
    static {
        System.out.println("static block run");
    }
}

打印

static block run

尝试创建实例不会更多地加载类。它可以加载默认构造函数(如果有的话),但只有那样才有用。

答案 2 :(得分:0)

看起来像静态初始化问题。尝试做

Class.forName("org.joda.time.LocalDate");
在你打电话之前

。这应该减少时间。可能你需要强制加载其他相关的类。如果问题是动态初始化,这将无济于事。