問題タブ [lazy-evaluation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - Haskellアプリでメモリ使用量を減らすには?
私は関数型プログラミングの初心者で、Haskell を学んでいます。演習として、1D 線形拡散方程式に陽的オイラー法を実装することにしました。以下のコードは正しく動作しますが、そのパフォーマンスには満足できません。実際、私はメモリ消費に関心があります。遅延評価に関連していると思いますが、メモリ使用量を減らす方法がわかりません。
アルゴリズムの考え方は非常にシンプルで、命令的な用語で明確にします: 「配列」を取り、すべての内部ポイントに値を追加します。これは、ポイント自体とそのポイントの値の組み合わせとして計算されます。隣人。境界点は特殊なケースです。
これが私の Euler1D.hs モジュールです。
そして、単純な Main.hs:
比較のために、純粋な C 実装も作成しました。
ここで、十分に大きなサイズの array に対して Haskell 実装を実行しようとすると、次のn
ようになります。
比較のために、C バージョンはほぼ 2 桁高速です。
編集: Haskell バージョンはプロファイリング フラグを使用してコンパイルされており、C はそうではないため、この比較は実際には公平ではありません。
-O2
プロファイリング フラグを使用して、または使用せずに両方のプログラムをコンパイルすると、 を増やすことができn
ます。この場合time ./eulerhs 1000000
、0m2.236 秒かかりますが、time ./eulerc 1000000
0m0.293 秒しかかかりません。そのため、すべての最適化を行っても問題は残り、プロファイリングを行わないと、相殺されるだけです。また、Haskell プログラムのメモリ割り当ては、
n
. これで多分OKです。
しかし、最悪なのはメモリ要件です。私の Haskell バージョンでは100MB 以上が必要です (C での最低限の見積もりは4MBです)。これが問題の原因かもしれないと思います。プロファイリング レポートによると、プログラムは GC で 85% の時間を費やしており、
makeu0
それがとても高価なことを見て私は驚いた。これは遅延評価が原因であると判断しました (そのサンクが の最後までメモリに残っている場合stepEuler
)。
私はこの変更を試しましたMain.hs
:
しかし、違いはわかりませんでした。でメモリ使用量を減らす方法がわかりませんstepEuler
。だから、私の質問は次のとおりです。
- Haskell でリストを作成する方法/リスト内包表記を厳密に行う方法はありますか? この場合、怠惰にしておくメリットはありません。
- この場合、全体的なメモリ使用量を減らすにはどうすればよいですか? 私は何かを厳密にしなければならないと思いますが、何がわからないのですか。言い換えれば、
seq
s と bangs をいくつか入れなければならない場合、どこに、なぜ? - そして最後に、最も重要なのは、そのようなコストのかかる構造を特定するための最善の戦略は何ですか?
Real World Haskellのプロファイリングと最適化に関する章を読みましたが、厳密であるべきものとそうでないものをどのように正確に決定できるかは不明のままです。
このような長い投稿をお許しください。
EDIT2:コメントでA. Rexが示唆したように、valgrindで両方のプログラムを実行してみました。そして、これが私が観察したことです。Haskell プログラム (
n
=200000) の場合:malloc/free: 33 個の割り当て、30 個の解放、84,109 バイトが割り当てられました。... 55,712,980 バイトを確認しました。
そしてCプログラムの場合(小さな修正後):
malloc/free: 2 つの割り当て、2 つの解放、3,200,000 バイトの割り当て。
したがって、Haskell ははるかに小さいメモリ ブロックを割り当てますが、頻繁に割り当て、ガベージ コレクションの遅延によりメモリに蓄積されたままになるようです。それで、私は別の質問があります:
- Haskellで多くの小さな割り当てを避けることは可能ですか? 基本的には、必要に応じてデータ構造のフラグメントだけでなく、データ構造全体を処理する必要があることを宣言します。
python - Django 形式での遅延選択
次のような Django my_forms.py があります。
それぞれの選択肢は、例えば (「サルーン」、「サルーン (15 台)」) です。したがって、選択肢はこの関数によって計算されます。
私の問題は、単に my_forms.py をインポートするたびに選択関数が実行されることです。これは、Django がそのフィールドを宣言する方法によるものだと思います。つまり、クラスではなくクラス メソッドです。これは問題ありませんが、私の views.py は my_forms.py をインポートするため、どのビューが使用されているかに関係なく、すべてのリクエストで選択肢のルックアップが行われます。
ブラケットなしでchoices=bodystyle_choicesを入れるとうまくいくかもしれないと思いましたが、次のようになります。
p>明らかに、キャッシングを使用して、必要なビュー関数に「import my_forms」を配置することはできますが、それは主なポイントを変更しません: 私の選択は怠惰である必要があります!
haskell - 厳密な評価の賢い使い方はどこにありますか?
厳密な評価が行われている環境では実行できない、遅延評価された言語で実行された賢いことの例がたくさんあるようです。たとえば、Haskell の無限リストや、ツリー内のすべての要素を 1 回のパスでツリーの最小値に置き換えます。
遅延評価された言語では簡単に実行できない、厳密に評価された言語で実行された賢いことの例はありますか?
php - PHP で遅延評価を回避するにはどうすればよいですか?
PHP がブール式を評価する方法について興味深い質問があります。たとえば、
また
$expression1
PHP は最初に、評価結果が かどうかをチェックしtrue
ます。そうでない場合は、$expression2
不要な計算を避けるために単にスキップされます。私が書いているスクリプトには、次のものがあります。
$validator->valid("text")
最初のステートメントが false と評価された場合でも、2 番目のステートメント ( ) を評価する必要があります。PHP に両方のステートメントを常に評価させる簡単な方法があるかどうかお尋ねしたいと思います。ありがとうございました!
haskell - スペースが不足している Haskell スクリプト
プロジェクト Euler を使用して Haskell を独学していますが、自分のコードが haskell によってどのように実行されているかについて推論するのに苦労しています。2 番目の問題では、400 万までのすべての偶数フィボナッチ数の合計を計算する必要があります。私のスクリプトは次のようになります。
Hugs は、「ガベージ コレクションが十分なスペースを再利用できません」というエラーを表示します。これは、foldr
.
これを修正するにはどうすればよいですか? アキュムレータを使用する末尾再帰 (と思う) バージョンを作成しようとしましたが、それも機能しませんでした。
hibernate - ハイバネートレイジーソリューション。そうですか?
休止状態での遅延初期化の問題を解決するために、次のアプローチを使用しています。うまくいくかどうか教えてください。いくつかの理由により、強制的に永続化レイヤーにトランザクションを実装する必要があります。
フィルターでは、次のコードを使用しています
このアプローチは正しいですか?問題が発生する可能性があります。
hql - HQL 実行時に lazy を true に設定する
このアプリケーションでは、アプリケーションのニーズに基づいてさまざまなオブジェクトを lazy false に設定しています。ただし、ユース ケースの 1 つで、HBM ファイル内のすべての遅延設定を無視して、ターゲット オブジェクトのみを取得する必要があります。
問題は、HBM の設定に関係なく、ターゲット オブジェクトのみを取得するように HQL で指定する方法はありますか?
〜スリ
c++ - C++ クラスでの遅延計算の処理
クラスがあるとしましょう:
insert()
に要素を追加する場所easySet_
。difficultSet_
のメンバーは のメンバーによって変わりeasySet_
ます。
私が抱えている問題は、複数の挿入difficultSet_
が常に再計算されることを意味することです。difficultSet_
そのため、遅延計算を行いたい(つまり、 difficultBegin()
、difficultEnd()
、またはdifficultSize()
が呼び出された場合のみ)。問題は、それ以外の場合は操作できないため、実際に作成する必要があることですdifficultSet_
。mutable
difficultSize()
だから今、私のクラス宣言は次のようになります
ただ、これはデザインが悪い気がします。より良い方法はありますか?
performance - Haskell スタイル/効率
そこで、私は素数を遅延生成する方法に取り組んでいました。これらの 3 つの定義を思いつきました。これらはすべて同等の方法で機能します。つまり、新しい整数のそれぞれが先行するすべての素数の因数を持っているかどうかをチェックするだけです。
したがって、すべての整数の再計算を回避
し(これまでに見つけた素数の数の順序で作業が必要だと思いますprimes2
)、新しいプライム。primes1
f_ = f (const True)
非科学的なテスト (ghci で実行) から見ると、よりも高速に実行take 1000
されるようです。primes3
primes2
このことから教訓を得て、関数を配列の操作として表現できる場合、効率のために後者の方法で実装する必要があると仮定する必要がありますか、それともここで何か他のことが起こっているのでしょうか?
recursion - 誰かがこれらの Haskell 関数を説明してくれませんか?
私は過去に Haskell に手を出していましたが、最近また真剣に取り組んでおり、現実世界の Haskell を読んでいます。彼らが輝かせた例のいくつかは、私にはまだ理解できていません。これでそのような:
これがどのように機能するのかわかりません。実際に 1 も追加されるのは何ですか? 再帰は、追加できるものをどのように返しますか? 理解できません。
そして、ここにこれがあります:
これはどのように機能しますか、実際にプレも取り付けられているのは何ですか? case 式の結果がどのように pre に連結できるのかわかりません。これらの関数の評価を詳しく説明してくれる人が必要なだけかもしれません。私は何か非常に重要なものを見逃しているに違いありません。
前もって感謝します!
編集:わかっています、それはコピーと貼り付けの失敗でした。ごめん。
編集 2: 私の混乱は、これらの関数が実際に /returning しているものにあったようです。答えてくれてありがとう、ついにクリックしました!それは有り難いです!