現在登場している多くのjvm言語の中で、特に魅力的だと思われるものがあります
見て
http://fantom.org/doc/docIntro/Tour.html
動的型付け機能を無視すると、生成されたバイトコードはJavaと同等のパフォーマンスを発揮するのでしょうか...
ps: パフォーマンスに関する宣言を追加
現在登場している多くのjvm言語の中で、特に魅力的だと思われるものがあります
見て
http://fantom.org/doc/docIntro/Tour.html
動的型付け機能を無視すると、生成されたバイトコードはJavaと同等のパフォーマンスを発揮するのでしょうか...
ps: パフォーマンスに関する宣言を追加
クイックソートのパフォーマンステストを行いました。
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>
です。新しいテストは違いを示しています。ArrayList
Fantomがまだ遅い理由は、おそらく、Duration、Int、およびListクラスに、plainまたはInteger
orよりもはるかに多くのメソッド/フィールドがあるため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)
}
}
そして、すべてのIntが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);
}
}
ファントムの経験はありませんが、ファントム インタープリターはJava、.net、または JS ライブラリを使用できるように見えますが、ファントムでコンパイルされたバイトコードをそのままで Java、.net、または JavaScript で読み取ることができるわけではありません。
そうは言っても...後で確認しますが、面白そうです:)
Fantom は、「fcode」と呼ばれる独自のバイトコード形式にコンパイルされます。これは、実行時に Java バイトコードまたは IL に変換されます。詳細については、このページを参照してください。
http://fantom.org/doc/docLang/Deployment.html
JavaScript の動作は少し異なります。実際の JavaScript ソース コードは、Fantom ソース コードから (Fantom ランタイムが必要とするすべてのメタデータと共に) コンパイル時に生成され、ブラウザーで直接実行できるスタンドアロンの js ファイルを生成します。