Goのガベージコレクタをハックする:アセンブリからのポインタストア

2025-06-23
Goのガベージコレクタをハックする:アセンブリからのポインタストア

この記事では、Goのアセンブリコードからポインタを操作することの複雑さを掘り下げ、Goのガベージコレクタとの重要な相互作用に焦点を当てています。ポインタを直接操作するには、`runtime.gcWriteBarrier2`や`runtime.writeBarrier`などの関数を使用して、GCに明示的に通知する必要があります。これにより、競合やクラッシュを防ぐことができます。この記事では、AVX命令を最適に使用するための128ビットアライメントされたメモリの割り当てという課題にも取り組み、巧妙な回避策を示しています。ただし、内部ランタイム関数に依存しないように警告しています。なぜなら、それらの可用性は将来のGoバージョンで変更される可能性があるからです。

続きを読む

Linuxパイプの限界に挑戦:3.5GiB/sから62.5GiB/sへの最適化

2025-06-22
Linuxパイプの限界に挑戦:3.5GiB/sから62.5GiB/sへの最適化

この記事では、パイプを通してデータの読み書きを行うテストプログラムを繰り返し最適化することで、LinuxにおけるUnixパイプの実装方法を探ります。スループットが約3.5GiB/sの単純なプログラムから始め、最適化の段階を経て、パフォーマンスを20倍以上に向上させます。主な改善点は、`vmsplice`と`splice`システムコールを使用してデータのコピーを排除すること、巨大ページを活用してページングのオーバーヘッドを削減すること、ビジーウェイトループを使用して同期コストを最小限にすることです。Linuxの`perf`ツールを使用したコード例とパフォーマンス分析によって、その過程を詳細に説明します。

続きを読む
開発 パイプ