1

マニュアルで述べたように、http://www.erlang.org/erldoc?q=erlang:now

戻り値を一意で単調に増加させる必要がない場合は、代わりに os:timestamp/0 を使用してオーバーヘッドを回避してください。

os:timestamp/0 は erlang:now/0 よりも高速である必要があります

しかし、私の PC で timer:tc/3 を使ってテストしたところ、10000000 回の呼び出しの場合、マイクロ秒で費やされた時間は

erlang:現在 951000
os:timestamp 1365000

erlang:now/0 が os:timestamp/0 より速いのはなぜですか?

私の OS: Windows 7 x64、erlang バージョン: R16B01。

- - - - - - - - - 編集 - - - - - - - - -

別のテスト コードを並行して書きました (100 スレッド)。ここにデータがあります:

----- single thread ------
erlang:now 95000
os:timestamp 147000

----- multi thread ------
erlang:now 333000
os:timestamp 91000

だから、「オーバーヘッド」は並列用だと思います。

4

3 に答える 3

4

トラウトワインによる優れた回答とは別に、シリアルテストでの方が速い理由erlang:now()は、時間の経過よりも速く呼び出している可能性があり、カーネルをヒットしない状況にあるため、おそらくカーネルを回避するためです。頻繁。

ただし、複数のコアを追加するまで、テストはだまされていることに注意してください。その後os:timestamp()、トラウトワインの書き込みのように、erlang:now().

また、弱いプラットフォーム、つまり Windows を使用していることにも注意してください。これは通常、重要な方法でパフォーマンスに影響します。

于 2013-07-01T08:45:51.420 に答える