リスト(長さlist-refなど)、文字列(文字列長、長さなど)ではなく、sequence-length、sequence-ref、sequence-mapなどを使用すると、文字列参照など)、ベクトルなどのラケット?Racketのすべてのためのシーケンス関数なぜではない
答えて
パフォーマンス。
は、この小さなベンチマークを考えてみましょう:
; vectors (vector-ref vs sequence-ref)
cpu time: 1 real time: 1 gc time: 0
cpu time: 2082 real time: 2081 gc time: 0
はい、それは大きさの3桁の違いがあります:
#lang racket/base
(require racket/sequence)
(define len 10000)
(define vec (make-vector len))
(collect-garbage)
(collect-garbage)
(collect-garbage)
(time (void (for/list ([i (in-range len)])
(vector-ref vec i))))
(collect-garbage)
(collect-garbage)
(collect-garbage)
(time (void (for/list ([i (in-range len)])
(sequence-ref vec i))))
これは私のマシン上に出力されています。
なぜですか?まあ、racket/sequence
はひどく "スマートな" APIではないし、ベクトルがランダムアクセスであっても、sequence-ref
はそうではない。ラケットオプティマイザがプリミティブ操作を大幅に最適化する機能と組み合わせることで、シーケンスAPIは非常に貧弱なインターフェースになります。
もちろん、ベクトルはランダムなアクセスであり、リストのようなものはそうではないので、これは少し不公平です。ただし、上記1とまったく同じテストを実行する代わりに、ベクトルのリストを使用すると、まだかなり厳しい結果が得られます。
は; lists (list-ref vs sequence-ref)
cpu time: 113 real time: 113 gc time: 0
cpu time: 1733 real time: 1732 gc time: 0
シーケンスAPIは、主な原因間接のハイレベル、遅いです。
高性能な抽象度で作業することには具体的なメリットがあるため、パフォーマンスだけではAPIを完全に拒否するわけではありません。
...不インタフェースの実装に不要な負担をかけ、その実装、ステートフルされています。それはそれはので、私は、シーケンスのAPIが良い抽象化はないと思う、と述べました。
...ランダムアクセスベクターやハッシュテーブルなど、リストに似ていないものには対応していません。
あなたがより高いレベルのAPIで作業したい場合は、一つの可能なオプションがracket/sequence
に似たAPIを提供しようとする、collections
packageを使用することであるが、データ構造の種類以上を収容し、また、より完全持ちます機能のセット。 免責事項:私はcollections
パッケージの著者です。もう一度上記のベンチマークを考えると
は、パフォーマンスはまだ直接基礎となる機能を使用するよりも悪いですが、それは、少なくとも、もう少し扱いやすいです:あなたはオーバーヘッドを買う余裕ができ
; vectors (vector-ref vs ref)
cpu time: 2 real time: 1 gc time: 0
cpu time: 97 real time: 98 gc time: 10
; lists (list-ref vs ref)
cpu time: 104 real time: 103 gc time: 0
cpu time: 481 real time: 482 gc time: 0
かどうかによって異なりますまさにあなたがやっていること、そしてあなた自身のために電話をかけるのはあなた次第です。特別な操作は、何らかの動的ディスパッチが実行されている間は、それらの操作を遅らせる操作よりも少なくとも幾分速くなります。パフォーマンスの最適化のルールを忘れないでください。
- 1. Racketでなぜgotoのような機能ですか?
- 2. なぜ変数が私のために働いていないのですか?
- 3. Javascript - すべてのコールでこの関数の値がリセットされないのはなぜですか?
- 4. なぜxxxは関数ではない
- 5. なぜこの関数はすべてゼロを返すのですか
- 6. イテレータからすべての関数を実装してイテレータを実装しないのはなぜですか?
- 7. なぜ関数ではない
- 8. 3つ目の関数がすべてpipeKで呼び出されないのはなぜですか?
- 9. 関数のShowインスタンスがないのはなぜですか?
- 10. なぜこの関数は返されないのですか
- 11. このPHP関数がすべての可変データを渡さないのはなぜですか?
- 12. 3jsレンダリング関数内のwhileループがすべてのフレームを更新しないのはなぜですか?
- 13. [PSSession]に関数のパラメータを宣言するためにキャストできないのはなぜですか?
- 14. はなぜすべての
- 15. なぜバッファーが関数エラーではないのですか
- 16. なぜこのWaitGroupはすべてのゴルーチンを待たないのですか?
- 17. なぜforEachは子供のために働いていないのですか?
- 18. jQuery.css()が私のために働いていないのはなぜですか?
- 19. 特定の関数を指すために関数ポインタ変数を割り当てることができないのはなぜですか?エラーが
- 20. カーネルモードでコールバック関数を実行していないのはなぜですか?
- 21. なぜfoldlはandFn関数で短絡していないのですか?
- 22. なぜ関数代入が関数プログラミングで使われるべきでないのですか
- 23. 私のJQuery get()関数がJSON URLのために働いていますが、非JSON URLのために働いているのはなぜですか?
- 24. RANK関数とDENSE_RANK関数が機能しないのはなぜですか?
- 25. rand()はすべての実行で同じ番号のシーケンスを生成するのはなぜですか?
- 26. jquery関数がトリガーされないのはなぜですか?
- 27. SetupDiGetDeviceProperty関数が機能しないのはなぜですか?
- 28. Java 8に「myArray.stream()」関数がないのはなぜですか?
- 29. SendMessage()関数が機能しないのはなぜですか?
- 30. C:fgets関数が動作しないのはなぜですか?
(時間...)機能間に(収集ゴミ)が必要ですか? – rnso