63

Julia言語は毎回スクリプトをコンパイルしますが、代わりにjuliaを使用してバイナリをコンパイルすることはできませんか?println関数を使用して小さなhelloworldスクリプトを試しましたが、juliaが出力を表示するのに2.3秒かかりました。毎回コンパイルするのではなく、バイナリを作成できればもっと良いでしょう

更新:私がこの質問をしたので、ジュリアにいくつかの変更がありました。私はもうjuliaの更新をフォローしていませんが、私はこの質問をしたので、似たようなものを探している場合は、juliaをフォローしている人々による以下の回答とコメントを調べてください。

また、スクリプトのロードに約150ミリ秒かかることを知っておくとよいでしょう。

4

2 に答える 2

106

ケノの答えは的確ですが、何が起こっているのか、そしてそれについて私たちが何を計画しているのかについてもう少し詳しく説明できるかもしれません。

現在、LLVMJITモードのみがあります。

  • いくつかの単純なトップレベルのステートメントには、非常に簡単なインタプリタがあります。
  • 他のすべてのコードは、実行前にマシンコードに組み込まれます。コードは、コードが適用されている実行時型の値を使用して積極的に特殊化され、動的型推論を使用してプログラム全体に伝播されます。

これは、コードが型注釈なしで記述されている場合でも、Juliaが優れたパフォーマンスを発揮する方法です。呼び出すと、64ビットシステムの型にf(1)特化したコードが得られます。電話をかけると、すべてのシステムのタイプに特化した、新しくジッターされたバージョンが表示されます。関数のコンパイルされた各バージョンは、取得するタイプを認識しているため、Cのような速度で実行できます。戻り型が型だけでなく実行時データに依存する「型不安定」関数を記述して使用することでこれを妨害できますが、コア言語と標準ライブラリの設計ではそうしないように細心の注意を払っています。Int641f(1.0)Float641.0

Juliaのほとんどはそれ自体で記述されてから、解析され、型推論され、jittedされるため、システム全体を最初からブートストラップするのに15〜20秒かかります。これを高速化するために、型推論されたASTのシリアル化されたバージョンをファイルに解析して型推論し、キャッシュする段階的なシステムがありますsys.ji。次に、このファイルがロードされ、を実行するときにシステムを実行するために使用されますjulia。ただし、 LLVMコードまたはマシンコードはキャッシュされないため、起動するsys.jiたびにすべてのLLVMジッタを実行する必要があるため、約2秒かかります。julia

この2秒間の起動遅延は非常に煩わしいものであり、修正する計画があります。基本的な計画は、Juliaプログラム全体をバイナリにコンパイルできるようにすることです。実行可能な実行可能ファイル、または.so.dylibのプログラムから単に共有Cライブラリであるかのように呼び出すことができる共有ライブラリのいずれかです。バイナリの起動時間は他のCプログラムと同じであるため、2秒の起動遅延はなくなります。

補遺1: 2013年11月以降、開発バージョンのJuliaは、標準ライブラリをバイナリコードとしてプリコンパイルするため、2秒の起動遅延がなくなりました。起動時間はPythonやRubyよりも10倍遅いので、改善の余地はありますが、かなり高速です。次のステップは、パッケージとスクリプトの事前コンパイルを許可して、Julia自体がすでに実行しているのと同じ速さで起動できるようにすることです。

補遺2: 2015年6月以降、Juliaの開発バージョンは多くのパッケージを自動的にプリコンパイルし、それらをすばやくロードできるようにしています。次のステップは、Juliaプログラム全体の静的コンパイルです。

于 2012-05-23T00:05:21.360 に答える
48

現時点では、JuliaJITは起動時に標準ライブラリ全体をコンパイルします。私たちは状況を認識しており、現在、状況を改善するためにLLVM JIT出力のキャッシュに取り組んでいますが、それまでは、それを回避する方法はありません(REPLを使用する場合を除く)。

于 2012-05-07T14:38:32.397 に答える