問題タブ [deterministic]
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.
optimization - 決定論的関数のコンパイラ最適化
私は決定論的実行について読んでいました。つまり、同じ入力に対して同じ出力があります。実行時に決定論的関数を最適化することを考えているプログラマーライターはいないかと思いました。たとえば、階乗関数を考えてみましょう。実行時に、同じ入力値で継続的に呼び出されていることが検出された場合、コンパイラーは出力値をキャッシュし、階乗関数を実行する代わりに、その出力値を直接使用できます。いい研究トピックのようです。このトピックに関する論文や作品はありますか?
sql - テーブル値関数の結果を一時テーブルに (手動で) キャッシュすると、クエリの実行速度が大幅に向上するのはなぜですか?
クエリ バージョン 2 が非常に高速なのはなぜですか?
DB エンジンがテーブル値関数の "GetUsageStatistic" を複数回呼び出していると思われます。そのため、"GetUsageStatistic" が決定論的であり、一度だけ呼び出す必要があることをエンジンに伝える方法はありますか?
クエリ バージョン 1
クエリ バージョン 2
c++ - 時間に敏感なイベントの記録は可能ですか?
基本的な質問
時間に敏感な (フレームレートに依存しない) システム内で再生をイベント記録する方法はありますか?
簡単な「申し訳ありませんが不可能です」など、どんな助けでも大歓迎です。私は過去数週末にわたってこれに取り組んでほぼ 20 時間を費やしており、自分自身を夢中にさせています。
全詳細
これは現在ゲームを対象としていますが、私が書いているライブラリはより一般的なものになるように設計されており、この概念は私の C++ コーディングだけではありません。
これと機能的に似ているコードがいくつかあります... (C++0x で書かれていますが、よりコンパクトにするために多少の自由を取っています)
そして、私はこのような別のスレッドを持っています...
ここで、テスト用の再生用に入力イベントを記録し、一部の再生機能を制限したいと思います。
//REF ALPHA をマークした場所に次のコードを挿入するだけで、正確なタイミングでイベントを簡単に記録できます。
本当の問題は、これらを再生することです。私の LoopTimer は、ハイ パフォーマンス カウンター (QueryPreformanceCounter) を使用して非常に高精度です。これは、//REF BETA の代わりに以下のようなコードを使用して同じ時差を達成することはほぼ不可能であることを意味します。
このアプローチの問題は、まったく同じ時間にヒットすることはほとんどないため、再生が録音と一致しない数マイクロ秒が発生することです。
イベントスナップもやってみました。ややこしい用語ですが、基本的に TimeSincePlaybackBegan > NextEvent.TimeSinceRecordingBegan の場合、TimeSincePlaybackBegan = NextEvent.TimeSinceRecordingBegan および ElapsedTime が適切に変更されました。
予想されるいくつかの興味深い副作用 (速度低下など) がありましたが、残念ながら、それでも再生の非同期化が発生しました。
いくつかの背景について、そしておそらく私のタイム スナップ アプローチが機能しなかった理由として、私は UpdateAll 呼び出しのどこかで BulletPhysics を使用しています。なんかこんな...
しかし、 http://www.bulletphysics.org/mediawiki-1.5.8/index.php/Stepping_the_Worldによれば、 pBulletWorkd->stepSimulation(diff, 0, 0) も試してみました.
c++ - Clang はプラットフォーム全体で GCC よりも決定論的ですか?
マルチユーザー RTS ゲームを (部分的に) C++ でプログラミングする可能性を検討しています。私がすぐに発見したことは、1 つの厳しい要件は、ゲーム シミュレーションがサーバーとすべてのクライアント全体で最後のビットまで完全に決定論的でなければならないことであり、ネットワーク通信をゲームの状態自体ではなくユーザー入力に制限できるようにすることです。 . 誰もが異なるコンピューターを持っているため、これは難しい問題のように思えます。
では、Linux (サーバー)、Windows、および Mac で完全に決定論的な実行可能ファイルを C++ コンパイラに作成させる「魔法の」方法はありますか? 2 つの主な OSS C++ コンパイラは GCC と Clang だと思うので、この点で一方のパフォーマンスが他方より優れているかどうか疑問に思っていました。
また、C++ 決定論の検証に使用できるテスト スイートにも興味があります。
[編集] 決定論的とは、コンパイルされたプログラムが、同じ初期状態と同じ順序の入力を与えられた場合、それが実行されるどのプラットフォームでも、常に同じ出力を生成することを意味しました。したがって、ネットワーク全体でも。一貫性があるというのは、この動作の適切な定義のように思えますが、私はネイティブ スピーカーではないため、正確な意味を誤解する可能性があります。
[編集#2] 決定論/一貫性が重要かどうか、ゲーム エンジンでそれを目指すべきかどうか、C++ で一般的にどれほど大きな問題であるかについての議論は非常に興味深いものですが、実際には決して答えはありません。質問。これまでのところ、Clang と GCC のどちらを使用して最も信頼性が高く、決定論的で、一貫性のある結果を得る必要があるかを誰も教えてくれませんでした。
[編集#3] C++ で Java とまったく同じ結果を得る方法があることに気付きました。JVM のオープン ソース実装を使用して、演算子と数学関数を実装するコードを抽出する必要があります。次に、それをスタンドアロン ライブラリに変換し、演算子を直接使用する代わりに、その中でインライン化可能な関数を呼び出します。手作業で行うのは面倒ですが、コードが生成されれば完璧な解決策です。多分それはクラスと演算子のオーバーロードでもできるので、自然に見えます.
oracle - DETERMINISTIC に似た PL/SQL プラグマはありますか?ただし、単一の SQL SELECT のスコープ用ですか?
SQLSELECT
ステートメントでは、そのステートメントのスコープに対して決定論的な関数を実行したいと思いますSELECT
(またはトランザクションも問題ありません)。
の多くの値はt.x
同じであるため、Oracle は同じ関数を何度も呼び出すことを省略して、処理を高速化できます。しかし、関数に というラベルを付けるとDETERMINISTIC
、このクエリを数回実行する間に結果がキャッシュされる可能性があります。使用できない理由は、時々変更される構成パラメーターを使用するDETERMINISTIC
ためです。my_function
他に使用できるキーワードはありますか?注意すべき点はありますか (メモリの問題、同時実行性など)? あるいは、t.x
値ごとに 1 回だけ関数を呼び出す分析関数などの他のトリック (パフォーマンスに大きな影響を与えずに) はありますか?
c - 浮動小数点の計算をどのように決定論的にすることができますか?
浮動小数点の計算は、プロセッサ上で結合的でも分散的でもありません。それで、
(a + b) + c
と等しくないa + (b + c)
とa * (b + c)
等しくないa * b + a * c
異なる結果をもたらさない決定論的浮動小数点計算を実行する方法はありますか?もちろん、ユニプロセッサでは決定論的ですが、たとえばスレッドが合計に加算される場合、スレッドのインターリーブが異なる可能性があるため、マルチスレッドプログラムでは決定論的ではありません。
だから私の質問は、マルチスレッドプログラムで浮動小数点計算の決定論的な結果をどのように達成できるかということです。
deterministic - 次の言語を認識する DFA の状態図を示してください。すべての部分で、アルファベットは {0,1 } です
DFA の描画のコツをつかもうとしています。私は次の試みに関連して次の問題を抱えています。誰かが私が正しいかどうか、または間違っているかどうかを教えてくれるかどうか疑問に思っていました。ありがとう!また、これらの方法について詳しく学ぶための優れたリソースを誰かが持っている場合は、大歓迎です。
次の言語を認識する DFA の状態図を示してください。すべての部分で、アルファベットは {0,1 } です
{w | w の長さは最大 5}
grammar - 決定論的有限オートマトンの構築に助けが必要ですか?
ダイアグラムの形で決定論的有限オートマトンを構築するためのルールは何ですか? 私の教授は例を挙げて説明してくれましたが、すべての図がどの規則に従わなければならないのか正確にはわかりません。どんな助けでも大歓迎です、ありがとう!
grammar - この決定性有限オートマトンの言語は何ですか?
与えられた:
受け入れられている言語が何であるかわかりません。
それを見ると、いくつかの最終結果を得ることができます。
mysql - mysqlの決定論的関数
一見シンプルなコンセプトに戸惑いました。Mysqlは、決定論的関数を次の関数として定義します。
同じ入力パラメータに対して常に同じ結果を生成します
だから私の理解では、次のような機能
決定論的ではありません(関数への2回の呼び出しの間に削除/更新/挿入が行われないという保証はありません)。同時に、ほとんど同じことを行う多くの関数、つまりクエリの結果に基づく戻り値を確認し、として宣言しましDETERMINISTIC
た。非常に基本的なものが欠けているようです。
誰かがこの問題を明確にすることができますか?
ありがとう。
更新
回答してくれた人に感謝します(+1); DETERMINISTIC
これまでのところ、キーワードの誤用が広まっているようです。多くの人がそうしているとはまだ信じられないので、他の回答を少し待ちます。