問題タブ [low-latency]
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.
c++ - 仮想ではなく実装する必要がある関数を宣言するにはどうすればよいですか?
クラスを使用してインターフェイスを宣言しています。メソッドシグネチャを定義したいだけです。このメソッドは、非抽象サブクラスで実装する必要があります。仮想化する方法は必要ありません。これはC#BTWのデフォルトの動作です(私はC#/ Javaの世界から来ました)
ただし、C++では不可能のようです。私は通常の方法でメソッドを宣言します
そして、それを実装したり、メソッドを「純粋な仮想」として宣言したりすることは必須ではありません
その後、メソッドは仮想になりますが、パフォーマンスを少し節約するために、これを避けたいと思います。
そんなものが欲しいようです
しかし、それはコンパイルエラーになります
windows - 遅延の少ないシリアル通信
シリアル通信 (つまり、物理またはエミュレートされたシリアル ポートの RS-232/RS-422) を介して外部デバイスに接続されているコンピュータを使用しています。それらは頻繁なデータ交換 (30Hz) によって相互に通信しますが、小さなデータ パケット (各パケットが 16 バイト未満) しか使用しません。
通信の最も重要な要件は、送信と受信の間の低レイテンシーまたは遅延です。
データ交換パターンはハンドシェイクに似ています。1 つのホスト デバイスが通信を開始し、クライアント デバイスで通知を送信し続けます。クライアント デバイスは、ホスト デバイスからのすべての通知に可能な限り迅速に応答する必要があります (これはまさに、低遅延を達成する必要がある場所です)。通知と応答のデータ パケットは明確に定義されています。つまり、データ長はわかっています。そして、基本的にデータの損失は許されません。
次の一般的な Win API 関数を使用して、I/O の読み取り/書き込みを同期的に実行しました: CreateFile、ReadFile、WriteFile
クライアント デバイスは ReadFile を使用して、ホスト デバイスからデータを読み取ります。クライアントは、長さがわかっている完全なデータ パケットを読み取ると、WriteFile を使用して、ホスト デバイスに対応するデータ パケットで応答します。読み取りと書き込みは、同時実行なしで常にシーケンシャルです。
なんというか通信速度が遅い。つまり、データの送信と受信の間の時間が長すぎます。シリアルポートのバッファリングまたは割り込みに問題がある可能性があると思います。
ここでは、遅延を改善するために考えられるアクションをいくつかまとめます。いくつかの提案と修正をお願いします:)
- FILE_FLAG_NO_BUFFERING フラグを指定して CreateFile を呼び出しますか? このフラグがこのコンテキストに関連しているかどうかはわかりません。
- 各 WriteFile の後に FlushFileBuffers を呼び出しますか? またはシリアルポートに通知/割り込みしてデータをすぐに送信できるアクションはありますか?
- シリアル通信を扱うスレッドやプロセスの優先度を高くする
- エミュレートされたデバイスのレイテンシタイマーまたは転送サイズを設定します (ドライバーを使用)。しかし、物理シリアル ポートはどうでしょうか。
- Linux での setserial/low_latency のような Windows での同等のものはありますか?
- FIFO を無効にしますか?
前もって感謝します!
c++ - FAST金融プロトコルでフィードAとフィードBの調停を実装する方法?
FASTプロトコルのフィード アービトレーションを実装する必要があります。問題はかなり一般的で、ハードウェアの解決策もあります問題は広く知られているので、それを実装する方法について少なくとも一般的な提案が必要だと思います (使用するクエリの数、リングバッファの数、リーダーの数、いつ実行するか)パケットをドロップするなど)、おそらく誰かが実装を教えてくれるでしょう。FAST に慣れていない人のために、説明を追加します。
すべての UDP フィードのデータは、2 つの異なるマルチキャスト IP 上の 2 つの同一のフィード (A と B) で配布されます。UDP パケット損失の可能性があるため、クライアントが両方のフィードを受信して処理することを強くお勧めします。2 つの同一のフィードを処理することで、統計的にパケット損失の可能性を減らすことができます。どの特定のフィード (A または B) でメッセージが最初に表示されるかは指定されていません。これらのフィードを調停するには、プリアンブルまたはタグ 34-MsgSeqNum にあるメッセージ シーケンス番号を使用する必要があります。プリアンブルを利用すると、FAST メッセージをデコードせずにメッセージ シーケンス番号を決定できます。フィード A および B からのメッセージの処理は、次のアルゴリズムを使用して実行する必要があります。
- フィード A と B を聞く
- シーケンス番号に従ってメッセージを処理します。
同じシーケンス番号を持つメッセージが以前に処理された場合、メッセージを無視します。
// tcp 回復アルゴリズムの詳細
だから私はその解決策は次のようになるべきだと思います:
2 つのフィードのそれぞれについて、専用スレッドと専用バッファーを作成します。データが到着すると、バッファにデータを追加します。(リングバッファかキューか、それとも何ですか?)
「スピン」する「リーダー」を作成し、最後の利用可能な「シーケンス番号」について両方のスレッドをチェックします。「シーケンス番号」が利用可能になるとすぐに、次のパケットを処理する必要があり、その後両方のスレッドがそれをドロップする必要があります。
アルゴリズム自体を実装する方法の提案と、おそらくどの構造を使用するかの提案を歓迎します。特に、おそらく誰かがロックフリー キュー/リング バッファの実装を提案できます。
c++ - 使用頻度の低いコードをプリフェッチするにはどうすればよいですか?
一部のコードを命令キャッシュにプリフェッチしたいと考えています。コードパスはめったに使用されませんが、まれに使用される場合に備えて、命令キャッシュまたは少なくとも L2 にある必要があります。これらのまれなケースについて、事前に通知があります。_mm_prefetch はコードで機能しますか? この使用頻度の低いコードをキャッシュに入れる方法はありますか? この問題については、移植性は気にしないので、asm でも構いません。
java - スレッド プールと最小限のスケジュール レイテンシを備えた ExecutorService を探す
タスクをワーク キューに追加し、実行のためにデキューするための遅延を最小限に抑えたいExecutorService
場合ThreadPoolExecutor
。ForkJoinPool
CPU キャッシュを認識し、調整可能なバックオフ戦略とスレッド ファクトリを備えていることが強く望まれます。
または、少なくともそれを調理するための部品の最良の例。
hadoop - HDFS での高スループットと低レイテンシ
私自身の言葉で、HDFS における高スループットと低レイテンシの意味を定義しようとしましたが、次の定義を思いつきました。
HDFS は、データ セット内の特定のレコードにアクセスするのではなく (低レイテンシー)、データ セットのバッチにすばやくアクセスするように最適化されています (高スループット)。
それは理にかなっていますか?:)
ありがとう!
language-agnostic - 最新の PC で外部ハードウェアに信号を出力する絶対最速の方法は何ですか?
私は、PCから外部信号(たとえば、他のデバイスに接続された電線のCMOS状態が0から1に変化するなど)を生成するための絶対的に最速の方法(最小のレイテンシ)は何かと思っていました.CPUアセンブラプログラム信号を生成する必要があることを知っています。
ネットワーク デバイス、USB、VGA モニタ出力には、他のインターフェイス (SATA、PCI-E) に比べて遅延が大きいことがわかっています。アセンブラプログラムを想定してみましょうからの出力で、どのインターフェイスまたはどのハードウェアの変更がほぼ0のレイテンシを提供できますか?
android - Android のスレッド化された低遅延オーディオ
短いバージョン: 私はシンセアプリを開発しており、低レイテンシーで Opensl を使用しています。Openslコールバック関数ですべてのオーディオ計算を行っていました(すべきではないことはわかっていますが、とにかく行いました)。現在、計算には nexus 4 で約 75% の CPU 時間がかかるため、次のステップでは、代わりに複数のスレッドですべての計算を実行します。
私が遭遇した問題は、コールバックスレッドが明らかに高い優先度で実行されているのに、新しいスレッドが実行されていないため、オーディオが途切れ始めたことです。より多くの/より大きなバッファーを使用すると、問題は解消されますが、リアルタイムも解消されます。新しいスレッドに高い優先度を設定してもうまくいかないようです。それで、スレッド化された低遅延オーディオを実行することさえ可能ですか、またはそれが機能するためにコールバックですべてを実行する必要がありますか?
256 サンプルのバッファがあり、それは約 5 ミリ秒であり、スレッド スケジューラが私の計算スレッドを実行するのに十分な時間であるはずです。