2017-05-30 10 views
3

私はジュリアの実行速度をベンチマークしています。ジュリア・プロンプトで@time [i^2 for i in 1:1000]を実行したところ、20ミリ秒の何かが発生しました。私のコンピュータはi7プロセッサ(私はLinux Ubuntuを使用しています)でモダンなので、これは奇妙に思えます。ジュリアの実行速度

もう1つの奇妙なことは、1:10の範囲で同じコマンドを実行すると実行時間が15ミリ秒になるということです。

私がここで紛失していることは些細なものでなければなりませんか?

答えて

8

いくつかのこと、performance tips次を参照してください。

  1. グローバルスコープでないベンチマークを実行してください。
  2. このようなものの最初の実行を測定しないでください。
  3. BenchmarkToolsを使用してください。

ジュリアはJITコンパイル言語なので、初めて測定するときはコンパイル時間を測定しています。これは固定された小さなオーバーヘッドなので、時間がかかるものは無視しても問題ありませんが、このような短期間のコードではほとんどすべての時間です。定数ではないグローバル変数は、コンパイラにタイプについてほとんど何も仮定させず、すべてのパフォーマンスを損なう傾向があります。これは状況によっては問題ありませんが、ほとんどの場合、入力はいくつかのグローバルから来る暗黙のパラメータではなく、関数への明示的なパラメータであるようにコードを書くべきです、そして、b)グローバル変数を使用するコードを書くべきではありません状態。

+0

私は最初の実行を測定しませんでした。 20msは2回目以降の実行時の実行時間です。 Juliaのチュートリアルでは、同じベンチマークが1ms未満であると主張されていました。 – NSL

+2

私は今すぐそれを得ました。コマンドプロンプトでこれを実行すると、毎回コンパイルされるようです。そこで、このコードを* .ilファイルの中の関数で定義し、その関数を呼び出しました。実際、2回目以降は、1:100000のリストで1ミリ秒未満でした。ありがとう! – NSL

+0

@NSL - グローバルスペースでのベンチマークは、多くの新規ユーザーにとって共通のトラップです。コンパイル時間が含まれているため、最初の実行を除いた関数を常にベンチマークします。つまり、REPLで戻り値型の注釈を使ってこの理解リストを実行しても、 '@time(Int64)[i^2 for i:1:1000]; 'は約4μsecで実行されます。よいジュリアコードを書くための多くの同様のトリックの詳細については、[This JuliaCon 2016 talk](https://youtu.be/szE4txAD8mk)を参照してください。 – AboAmmar

関連する問題