#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-файла вы можете запустить непосредственно в своем браузере.