問題タブ [mappedbytebuffer]
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.
java - 最初の実行で MappedByteBuffer が遅い
長年の読者、初めてのポスター。
一連のバイナリ ファイルからデータをすばやく読み取るのに少し問題があります。ByteBuffers と MappedBytBuffers は私が必要とするパフォーマンスを提供しますが、ウォームアップするために最初の実行が必要なようです。それが理にかなっているのかどうかわからないので、ここにいくつかのコードがあります:
したがって、これを実行するには約 7 秒かかりますが、もう一度実行すると 10 ミリ秒で完了します。正しい動作を設定するには、何らかの初期実行を行う必要があるようです。次のような単純なことを行うことで、次のように機能することがわかりました。
これには約 2 秒かかります。その後、MappedByteBuffer プロシージャを実行すると、10 ミリ秒でデータが返されます。その初期化ステップを取り除き、最初に10ミリ秒でデータを読み取る方法がわかりません。「ウォーミングアップ」、JIT、および JVM についてあらゆる種類のことを読みましたが、すべて役に立ちませんでした。
それで、私の質問は、10ミリ秒のパフォーマンスをすぐに得ることは可能ですか、それとも何らかの初期化を行う必要がありますか? もしそうなら、これを行うための最速の方法は何ですか?
このコードは約 1000 個の非常に大きなファイルを処理することを目的としているため、速度が非常に重要です。
どうもありがとう。
android - Androidでnio.ByteBufferでUriコンテンツをラップする方法は?
Android で Uri からコンテンツを読み込もうとしていますが、nio.ByteBuffer によって基礎となる SDK に渡される最終的なオブジェクト型が必要です。
ContentResolver を介して InputStream を取得できますが、nio.ByteBuffer でラップする方法が見つかりませんでした。
AndroidでUriコンテンツをnio.ByteBufferに変換する方法はありますか?
java - 2 つのメモリ マップト バッファが同じファイルにマップされている場合、挿入順序はどうなりますか?
私の質問は、OS が挿入順序 (つまり、最後に書き込まれ、最後にディスクに書き込まれる) を尊重するのか、それとも順序が予測不能になるのかということです。例えば:
それは常に最後に書かれていますか、最後に書かれていますか、それともここに何かが欠けていますか?
java - ByteBuffer の一部から FloatBuffer を効率的に埋める
現在、次の方法で Mapped Byte Buffer から FloatBuffer を埋めています。
しかし、すべての位置をループするのではなく、これを行うためのより良い方法があるのではないかと私は疑っています。バッファーにはかなりの数の頂点が存在する可能性があります (最大 65536)。
これはうまくいくようです:
ただし、OpenGL のこの関数は GPU に大量のデータを送信しますか? それとも現在位置から限界まで?
java - mmap() 対 Java MappedByteBuffer のパフォーマンス?
私は既存の Java コードから C++ プロジェクトを開発しています。何百万もの整数で構成される同じテスト ファイルから読み取る次の C++ コードと Java コードがあります。
C++:
ジャワ:
void swapElem(arr)
C++ と Java では同じです。配列内の値を比較して変更しますが、元のコードをここに投稿するには長いです。テスト目的で、ループがデッドコードにならないように、次の関数に置き換えました。
私は、C++ バージョンが Java バージョンよりも優れているはずだと思っていましたが、テストの結果は逆で、Java コードは C++ コードよりもほぼ 2 倍高速です。C++ コードを改善する方法はありますか?
C ++ のmmapFile+offset
は何度も繰り返されるので、それは O(n) 個の追加であり、 は O(n) 個の追加ですoffset+=sizeof(int)
。ここで、n は読み取る整数の数です。Java のIntBuffer.get()
場合、バッファのインデックスから直接読み取るだけなので、バッファ インデックスを 1 ずつインクリメントする O(n) 回を除いて加算操作は必要ありません。したがって、バッファ インデックスのインクリメントを含めて、C++ は O(2n) 回の加算を行いますが、Java は O を取得します。 (n) 追加。何百万ものデータになると、パフォーマンスに大きな違いが生じる可能性があります。
この考えに従って、C++ コードを次のように変更しました。
わずかなパフォーマンスの向上があると想定していましたが、そうではありません。
C++ コードの動作が Java コードよりも遅い理由を誰か説明できますか? ありがとう。
アップデート:
-O2 が機能しないと言ったとき、私の側に問題があったことをお詫びしなければなりません。Makefile を台無しにして、C++ コードが -O2 を使用して再コンパイルされないようにしました。パフォーマンスを更新したところ、-O2 を使用した C++ バージョンが Java バージョンよりもパフォーマンスが向上しました。これで問題は解決しますが、誰かが C++ コードを改善する方法を共有したい場合は、フォローします。一般的には、Java コードよりも 2 倍高速になると予想されますが、現在はそうではありません。ご意見をお寄せいただきありがとうございます。
コンパイラ: g++
フラグ: -Wall -c -O2
Java バージョン: 1.8.0_05
ファイルのサイズ: 552MB、すべて 4 バイト整数
プロセッサー: 2.53 GHz Intel Core 2 Duo
メモリ 4GB 1067 MHz DDR3
更新されたベンチマーク:
バージョン時間(ミリ秒)
C++: ~1100
ジャワ: ~1400
C++ (while ループなし): ~35
Java (while ループなし): ~40
これらのコードの前に、〜 35 ミリ秒のパフォーマンスを引き起こすものがあります (ほとんどの場合、配列は -1 で埋められます) が、ここでは重要ではありません。