Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能看到Java进行了哪些优化_Java_Performance - Fatal编程技术网

我怎样才能看到Java进行了哪些优化

我怎样才能看到Java进行了哪些优化,java,performance,Java,Performance,我有以下代码 public boolean matches(String word) { Pattern p = Pattern.compile("\\w$"); Matcher m = p.matcher(word); return m.find(); } 我想知道java编译器是用对象替换Pattern.compile(“\w$”)短语,还是每次调用函数时都创建对象 public static Pattern compile(String regex)

我有以下代码

 public boolean matches(String word) {

     Pattern p = Pattern.compile("\\w$");
     Matcher m = p.matcher(word);
     return m.find();

 }
我想知道java编译器是用对象替换Pattern.compile(“\w$”)短语,还是每次调用函数时都创建对象

public static Pattern compile(String regex) {
    return new Pattern(regex, 0);
}
如何找出java对我的代码的影响?

是否有一个eclipse插件显示了这一点?

compile
方法创建了新的对象
模式
,以后可以重用

源代码:

public static Pattern compile(String regex, int flags) {
    return new Pattern(regex, flags);
}

根据源代码,它会在每次调用函数时创建对象

public static Pattern compile(String regex) {
    return new Pattern(regex, 0);
}

要查看编译器完成的优化,可以如下所示:

1) 编译你的程序

2) 使用可用的java反编译程序(可以在google中查看)反编译您的程序,以再次生成源代码

3) 将您的源代码与反编译的源代码进行比较

这会给你足够的想法

因为反编译器不是那么聪明(也没有必要)


但是查看运行时优化要困难得多。

如果您查看了Java字节码生成的代码,就可以确定Java已经内置了很多优化


对于Eclipse,我知道直接从Eclipse显示字节码。可能您需要搜索一些资源来读取字节码,但大多数都很简单,比如对象创建或类调用。

Java编译器将针对
Java.util.regex.Pattern.compile
发出
invokestatic
字节码指令。实际上,这个方法将返回一个
模式
对象,您的代码可以使用它

因此,您真正想知道的内容可以在
Pattern.compile
的源代码中找到。如果该方法只返回一个新的
模式
对象,那么以后的调用将不会重用。如果您看到对象正在被缓存,那么就会发生一些重用


因此,请看一看您感兴趣的Java版本的源代码。

您可以使用调试器浏览您的代码,看看javac为什么要使用这些代码?它怎么可能知道这段代码是在一个线程中使用还是在多个线程中使用?请您进一步解释一下您最后的评论?为什么线程的数量很重要?@David让java创建了一个模式对象,每次调用该函数时都要使用,该函数将成为thread-usafe。只有在程序员注意重用它的情况下,它才会被重用。就Java API而言,没有重用(没有缓存)。反编译器对这项工作毫无用处:它只会显示确实调用了
Pattern.compile
。这个插件与eclipse juno一起工作吗?该网站说在Eclipse3.5之前有一个更新网站,抱歉,我不知道,因为我很久没有使用eclipse了。我在市场上找到了这个插件,可能是新版本的。或者在市场上搜索字节码,我想还有很多插件仍然可以提供这样的视图。