является ли байт-код, сгенерированный fantom, таким же производительным, как байт-код, эквивалентный java?

#java #performance #bytecode #fantom

#java #Производительность #байт-код #fantom

Вопрос:

из множества языков jvm, появляющихся в наши дни, есть один, который кажется особенно привлекательным

взгляните на

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

Мне просто интересно, является ли сгенерированный байт-код при игнорировании функции динамической типизации производительным, эквивалентным java…

ps: добавлена информация о производительности

Ответ №1:

Я провел некоторое тестирование производительности quicksort.

 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 выполняется примерно в 10 раз медленнее, чем код Java. Однако обратите внимание, что я использовал Java int и Fantom Int, которые не совпадают. Java int являются 32-разрядными, а Fantom — 64-разрядными.

После небольшого профилирования есть признаки того, что код Fantom почти такой же производительный, как Java. Однако, если производительность абсолютно критична, держитесь подальше от списков, используйте версии списков для конкретной платформы или перейдите к native и пишите на Java.

РЕДАКТИРОВАТЬ: я поговорил с Брайаном, и он подтвердил мои подозрения. Причина, по которой Fantom работает медленнее, заключается в том, что все его Int 64-разрядные целые числа и все Int[] массивы похожи на ArrayList<Long> . Новый тест показывает разницу. Причина, по которой Fantom все еще медленнее, вероятно, в том, что его классы Duration, Int и List содержат намного больше методов / полей, чем обычный ArrayList or Integer или System.currentMillis . Это компромисс, который может вам подходить, а может и не подходить. Если вам действительно нужна высокая производительность, просто создайте собственный метод и запрограммируйте его на Java / C # / Javascript. Таким образом, вы получите производительность, эквивалентную Java.

Вот исходники, если вы хотите протестировать его самостоятельно:

Исходный код Fantom:

 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)  

   }  
}
  

И java со всеми целыми числами, замененными на longs и ArrayList. Оригинальную реализацию 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);  

 }  

}  
  

Комментарии:

1. Я бы сказал, что конечным ответом было бы профилировать его . Fantom может выводить .jar файлы, и вы можете использовать любой профилировщик Java для его проверки. Затем вы могли бы попытаться оптимизировать критически важные для производительности сегменты с помощью native . Большую часть времени он имеет ту же производительность, что и Java, используя ArrayList и Long (для массивов и целых чисел соответственно).

2. «Итак, я бы сказал, что на данный момент байт-код Fantom выполняется примерно в 10 раз медленнее, чем байт-код Java». Это просто неверно. Вы делаете далеко идущие выводы из одного микро-бенчмарка, даже учитывая двойной эффект Int <-> . Разумным выводом было бы: есть смутный намек на то, что Fantom почти так же быстр, как Java, но остерегайтесь List of Int, потому что они медленные.

3. Верно, но это было написано до того, как я сделал свое замечание ниже. В любом случае, проблема была исправлена. Спасибо, что указали на это.

Ответ №2:

У меня нет опыта работы с fantom, но похоже, что интерпретатор fantom может использовать библиотеки java, .net или JS, но дело не в том, что скомпилированный байт-код fantom может быть прочитан из коробки java, .net или javascript.

Сказав это… Я проверю это позже, это выглядит интересно 🙂

Комментарии:

1. Да, это правда; Однако вы можете просто заставить Fantom выводить .jar файл вместо .pod ( .jar аналог Fantom). Также iirc Fantom имеет Java FFI, но нет . Net и JS (это все еще в разработке).

Ответ №3:

Fantom компилирует до своего собственного формата байт-кода, называемого «fcode», который затем преобразуется в байт-код java или IL во время выполнения — смотрите эту страницу для получения более подробной информации:

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

JavaScript работает немного иначе — фактический исходный код JavaScript создается во время компиляции из исходного кода Fantom (вместе со всеми метаданными, необходимыми среде выполнения Fantom) — для создания автономного js-файла вы можете запустить непосредственно в своем браузере.