是否可以通过在程序集中手写代码来获得基于vm的语言的性能?

时间:2012-04-02 07:46:57

标签: assembly bytecode vm-implementation

我知道这样做可能没有多大意义,因为通常用更快的语言重写性能关键部分更快更合理,但抛开这一点,是否可以编写更快的CPython / JVM / CLR程序直接在其程序集中写入部分?

3 个答案:

答案 0 :(得分:3)

实际上是。不经常介意你,但我知道at least one case(跳过MSIL中的and会使代码更快一些)。可能有更多的情况,CLR JIT编译器并不是那么聪明。

答案 1 :(得分:0)

不,不推荐。例如,某些JVM中的实时编译功能会搜索字节码模式,以便在运行时对其进行大幅优化。如果用你自己的扭曲字节码替换它们,JIT可能不起作用,你最终会得到一个较慢的代码。这就是混淆Java程序时有时会发生的事情。

答案 2 :(得分:-1)

没有。大多数高级语言的字节码都是非常高级的,并且通常与语言使用的习语完全一致 - 除了编译器已经发出的任何方式之外,你根本无法编写代码来执行简单的任务,至少在没有使它变慢。

手工制作汇编程序的大多数加速来自聪明的寄存器使用,巧妙地使用机器特定的操作码等 - 在编写高级字节码时你无法控制的所有东西。

同样重要的是要注意,如果你发出异常代码 - 比如在一些基于堆栈的vm中你注意到一个值被使用了两次,并且聪明而不是发出一个临时变量,你将它留在堆栈上并在以后加入它。你可能只是努力表现。 JIT不再识别成语,因此会发出可怕的代码。我被这个第一手发射运行时生成的MSIL击中了 - 如果您发出的内容与编译器生成的代码不相似,则可能无法执行。

当然我在这里特别谈论MSIL - 但我相信它一般都会成立。