3

在当今出现的许多 jvm 语言中,有一种似乎特别吸引人

看一下

http://fantom.org/doc/docIntro/Tour.html

我只是想知道,当忽略动态类型功能时,生成的字节码是否与 java 等效...

ps:添加了关于性能的声明

4

3 回答 3

6

我做了一些快速排序性能测试。

Int[100.000] array quicksort
  Java ~ 11ms
  Java using long and ArrayList<Long> ~ 66ms
  Fantom ~ 97 ms

Int[1.000.000] array quicksort
  Java ~ 91ms
  Java using long and ArrayList<long> ~ 815ms
  Fantom ~ 1100ms.

所以我想说,目前 Fantom 的代码运行速度比 Java 的代码慢 10 倍。但是请注意,我使用了 Java 的 int 和 Fantom 的 Int,它们并不相同。Java 的 int 是 32 位的,而 Fantom 的是 64 位的.

在对事情进行了一些分析之后,有迹象表明 Fantom 代码几乎可以像 Java 一样执行。但是,如果性能绝对关键,请远离列表,使用特定于平台的列表版本,或者降级为原生并用 Java 编写。

编辑:我和布赖恩谈过,他证实了我的怀疑。Fantom 速度较慢的原因是因为它Int都是 64 位整数并且所有Int[]数组都类似于ArrayList<Long>. 新的测试显示了差异。ArrayListFantom 仍然较慢的原因可能是它的 Duration、Int 和 List 类比普通的or Integeror类有更多的方法/字段System.currentMillis。这是一个可能适合也可能不适合您的权衡。如果您真的需要高性能,只需创建一个本机方法并用 Java/C#/Javascript 对其进行编程。这样,您将获得与 Java 相当的性能。

如果您想自己测试,请参考以下资源:

幻想来源:

class TestQuickSort
{

   public static Void swap(Int[] a, Int i, Int j) {  
    temp := a[i];  
    a[i] = a[j];  
    a[j] = temp;  
   }  

   public static Void quicksortA(Int[] a, Int L, Int R) {  
    m := a[(L + R) / 2];  
    i := L;  
    j := R;  
    while (i <= j) {  
     while (a[i] < m)  
      i++;  
     while (a[j] > m)  
      j--;  
     if (i <= j) {  
      swap(a, i, j);  
      i++;  
      j--;  
     }  
    }  
    if (L < j)  
     quicksortA(a, L, j);  
    if (R > i)  
     quicksortA(a, i, R);  
   }  

   public static Void quicksort(Int[] a) {  
    quicksortA(a, 0, a.size - 1);  
   }   

  static Void main(Str[] args) {  

    // Sample data  
    a := Int[,]

    for(i := 0; i<1000000; i++)
    {
      a.add(i*3/2+1)
      if(i%3==0) {a[i]=-a[i]}
    }

    t1 := Duration.now 
    quicksort(a);  
    t2 := Duration.now 
    echo((t2-t1).toMillis)  

   }  
}

和所有 Ints 被 longs 和 ArrayList 替换的 java。原始 Java 实现可以在http://stronglytypedblog.blogspot.com/2009/07/java-vs-scala-vs-groovy-performance.html找到。

import java.util.ArrayList;
public class QuicksortJava {  

 public static void swap(ArrayList<Long> a, long i, long j) {  
  long temp = a.get((int)i);  
  a.set((int)i, a.get((int)j));  
  a.set((int)j, temp);  
 }  

 public static void quicksort(ArrayList<Long> a, long L, long R) {  
  long m = a.get((int)(L + R) / 2);  
  long i =  L;  
  long j =  R;  
  while (i <= j) {  
   while (a.get((int)i) < m)  
    i++;  
   while (a.get((int)j) > m)  
    j--;  
   if (i <= j) {  
    swap(a, i, j);  
    i++;  
    j--;  
   }  
  }  
  if (L < j)  
   quicksort(a, L, j);  
  if (R > i)  
   quicksort(a, i, R);  
 }  

 public static void quicksort(ArrayList<Long> a) {  
  quicksort(a, 0, a.size() - 1);  
 }  

 public static void main(String[] args) {  

  // Sample data  
  long size = 100000;
  ArrayList<Long> a = new ArrayList<Long>((int)size);  
  for (long i = 0; i < size; i++) {  
   a.add(i * 3 / 2 + 1);  
   if (i % 3 == 0)  
    a.set((int)i, -a.get((int)i));  
  }  

  long t1 = System.currentTimeMillis();  
  quicksort(a);  
  long t2 = System.currentTimeMillis();  
  System.out.println(t2 - t1);  

 }  

}  
于 2011-06-29T21:08:04.720 回答
2

没有使用 fantom 的经验,但是看起来 fantom 解释器可以使用java、.net 或 JS 库,但并不是说可以通过 java、.net 或 javascript 开箱即用地读取fantom编译的字节码。

话虽如此......我稍后会检查它,它看起来很有趣:)

于 2011-04-27T08:58:39.377 回答
2

Fantom 编译成它自己的称为“fcode”的字节码格式——然后在运行时被翻译成 java 字节码或 IL——更多细节请参见这个页面:

http://fantom.org/doc/docLang/Deployment.html

JavaScript 的工作方式有点不同——实际的 JavaScript 源代码是在编译时从 Fantom 源代码(以及 Fantom 运行时所需的所有元数据)生成的——生成一个可以直接在浏览器中运行的独立 js 文件。

于 2011-04-27T12:21:08.193 回答