私はライブラリを書いています:
- さまざまなプラットフォーム/Java 実装で実行する必要があります(一般的なケースは、Windows または Linux を搭載した Intel 64 ビット マシン上の OpenJDK または Oracle Java である可能性があります)。
- オブジェクトアクセスのCPUキャッシュライン効率を気にするほど、高性能化が優先
- 一部の領域では、小さなオブジェクトの非常に大きなグラフがトラバース/処理されます (約 1 GB スケールとしましょう)。
- 主なワークロードはほぼ独占的に読み取りです
- 読み取りはオブジェクト グラフ全体に分散されますが、完全にランダムではありません (つまり、頻繁にアクセスされない領域への読み取りが時折行われる大きなホットスポットが存在します)。
- オブジェクト グラフは、複数のスレッドによって同時にアクセスされます (変更はされません)。同時変更が発生しないという前提で、ロックはありません。
この種の環境で CPU キャッシュ ラインを効果的に利用できるように、小さなオブジェクトを設計するための経験則やガイドラインはありますか?
オブジェクトのサイズと構造を正しく設定することに特に関心があります。たとえば、最も頻繁にアクセスされるフィールドが最初のキャッシュ ラインに収まるようにするなどです。
注:これは実装に依存すること、ベンチマークを行う必要があること、時期尚早の最適化の一般的なリスクを十分に認識しています。これを指摘するために帯域幅を無駄にする必要はありません。:-)