以下Java程序平均需要在0.50到0.55之间运行:
public static void main(String[] args) {
long startTime = System.nanoTime();
int n = 0;
for (int i = 0; i < 1000000000; i++) {
n += 2 * (i * i);
}
System.out.println((double) (System.nanoTime() - startTime) / 1000000000 + " s");
System.out.println("n = " + n);
}
Run Code Online (Sandbox Code Playgroud)
如果我更换2 * (i * i)
用2 * i * i
,它需要0.60〜0.65s之间运行.怎么会?
我运行了每个版本的程序15次,在两者之间交替.结果如下:
2*(i*i) | 2*i*i
----------+----------
0.5183738 | 0.6246434
0.5298337 | 0.6049722
0.5308647 | 0.6603363
0.5133458 | 0.6243328
0.5003011 | …
Run Code Online (Sandbox Code Playgroud) 我知道PHP在服务器上运行之前被编译为字节代码,然后可以缓存该字节代码,这样就不必为每个Web访问重新解释整个脚本.
但是你可以"编译"php并上传一个二进制文件,它只能由字节码解释器运行吗?
我有以下Java类
public class HelloWorld {
public static void main(String []args) {
}
}
Run Code Online (Sandbox Code Playgroud)
当我编译这个文件并在生成的类文件上运行sha256时,我得到了
9c8d09e27ea78319ddb85fcf4f8085aa7762b0ab36dc5ba5fd000dccb63960ff HelloWorld.class
Run Code Online (Sandbox Code Playgroud)
接下来我修改了类并添加了一个如下所示的空白行:
public class HelloWorld {
public static void main(String []args) {
}
}
Run Code Online (Sandbox Code Playgroud)
我再次在输出上运行sha256,期望得到相同的结果,但我得到了
11f7ad3ad03eb9e0bb7bfa3b97bbe0f17d31194d8d92cc683cfbd7852e2d189f HelloWorld.class
Run Code Online (Sandbox Code Playgroud)
我已阅读此TutorialsPoint文章:
只包含空格的行(可能带有注释)称为空行,Java完全忽略它.
所以我的问题是,由于Java忽略空行,为什么两个程序的编译字节码都不同?
即在该差HelloWorld.class
一个0x03
字节是由替换0x04
字节.
只是想知道是否有人尝试过使用Android的新Java 7语言功能?我知道Android会读取Java吐出的字节码并将其转换为dex.所以我想我的问题是它能理解Java 7的字节码吗?
目前(Java 6)您可以在Java字节码中使用Java语言无法做到的事情吗?
我知道两者都是图灵完整的,所以读"可以做"就是"可以做得更快/更好,或者只是以不同的方式".
我正在考虑invokedynamic
使用Java生成的额外字节码,除了特定的字节码是针对未来的版本.
作为MSIL和Java字节码之间的差异问题的一种跟进?,Java虚拟机的工作方式(主要)差异或相似之处是什么?.NET Framework 公共语言运行时(CLR)有效吗?
还有,是 .NET框架 CLR是"虚拟机"还是没有虚拟机的属性?
我决定查看Emacs,我非常喜欢它.现在,我正在使用Emacs入门套件,它提供了更好的默认设置和一些很好的自定义默认安装的Emacs.
我已经定制了一点,添加了一些东西,如yasnippet,颜色主题,未绑定和其他东西.我已经设置了一个github存储库,我保留了所有的自定义设置,这样我就可以从多个地方访问它们,或者万一我的.emacs.d目录丢失了.
所有这一切都非常好,但是有一个问题:Emacs大约需要1-2秒才能加载.AFAIK我可以使用Mx byte-compile-file编译单个.el文件到.elc,它可以工作.但是有很多.el文件,我想知道是否有办法用简单的命令或其他东西编译它们,以加快Emacs的加载速度.我的Emacs并不总是打开,我经常打开和关闭它,特别是在我将其设置为Total Commander中的编辑命令的默认编辑器以便更快地习惯它(是的,windows xp这里).
我的Emacs版本是22.3.是的,没有任何自定义的默认Emacs安装会立即启动.
我不确定在加载时,首选哪个版本,.el或编译.elc的方式是Oo
那么,是否有一个elisp命令或Emacs命令行开关使Emacs在.emacs.d目录中进行字节编译?
我的理解是C/C++生成在特定机器架构上运行的本机代码.相反,Java和C#等语言运行在虚拟机之上,该虚拟机将本机架构抽象化.逻辑上,由于这个中间步骤,Java或C#似乎不可能匹配C++的速度,但是我被告知最新的编译器("热点")可以达到这个速度甚至超过它.
也许这更像是一个编译问题,而不是一个语言问题,但任何人都可以用简单的英语解释这些虚拟机语言之一如何比母语更好地执行?
如何在字节码级别实现Scala中的模式匹配?
它是否像一系列if (x instanceof Foo)
结构或其他东西?它的性能影响是什么?
例如,给定以下代码(来自Scala By Example第46-48页),该方法的等效Java代码如何eval
?
abstract class Expr
case class Number(n: Int) extends Expr
case class Sum(e1: Expr, e2: Expr) extends Expr
def eval(e: Expr): Int = e match {
case Number(x) => x
case Sum(l, r) => eval(l) + eval(r)
}
Run Code Online (Sandbox Code Playgroud)
PS我可以读取Java字节码,因此字节码表示对我来说已经足够了,但是对于其他读者来说,知道它看起来像Java代码会更好.
PPS Scala编程是否能够解答这一问题以及有关Scala如何实现的类似问题?我订购了这本书,但尚未到货.