JRuby 性能逼近 CRuby,但熱點代碼仍需進一步優化。CRuby 有 RubyInline 內嵌 C 擴展,JRuby 陣營推出 RubyInline Java Builder 即時編譯嵌入 Java 代碼。
class FastMath
inline :Java do |builder|
builder.package "org.jruby.test"
builder.java %q{
public static long factorial_java(int max) {
int i=max, result=1;
while (i >= 2) { result *= i--; }
return result;
}
}
end
end
缺點:強依賴 JDK 6 編譯器 API,部分環境不可用。
Charles Nutter 嘗試字節碼 DSL,如構建 `bar` 方法將小寫字符串加入 ArrayList:
method(:bar, ArrayList, String, ArrayList) do
aload 1
invokevirtual(String, :toLowerCase, String)
aload 2
swap
invokevirtual(ArrayList, :add, [Boolean::TYPE, Object])
aload 2
areturn
end
門檻極高,需深諳 JVM 指令集。
class Fac
def self.fac(max)
{max => :int, :return => :int}
i = max
result = 1
while i > 1
result *= i
i -= 1
end
result
end
end
原型階段,展示以 Ruby 子集實現靜態類型推斷生成高性能字節碼的可能性,類比 Squeak Smalltalk 的 Slang。Rubinius 亦規劃類似 Garnet 方案。