C# (NetMQ) で次のコードを使用してラージ オブジェクトを送信しています。
var client = new DealerSocket("<connection String>");
var serializedData = new string('*', 500000);
var message = new List<byte[]>();
message.Add(Encoding.UTF8.GetBytes("BulkSend"));
message.Add(Encoding.UTF8.GetBytes(serializedData));
client.TrySendMultipartBytes(TimeSpan.FromMilliseconds(3000), message);
このコードは、高トラフィック (たとえば、1 秒あたり 10MB のメッセージ) で使用される場合、CPU 使用率の 90% を占めています。いくつかの調査の後、次の2つのコードを試しました。まず、最初のフレーム (「一括送信」) を削除しました。
var client = new DealerSocket("<connection String>");
var serializedData = new string('*', 500000);
var message = new List<byte[]>();
message.Add(Encoding.UTF8.GetBytes(serializedData));
client.TrySendMultipartBytes(TimeSpan.FromMilliseconds(3000), message);
驚いたことに、パフォーマンスが向上しました。次に、2 つのフレームを並べ替えます。大きなフレームを最初に移動することを意味します。次のように:
var client = new DealerSocket("<connection String>");
var serializedData = new string('*', 500000);
var message = new List<byte[]>();
// change the order of two following codes
message.Add(Encoding.UTF8.GetBytes(serializedData));
message.Add(Encoding.UTF8.GetBytes("BulkSend"));
client.TrySendMultipartBytes(TimeSpan.FromMilliseconds(3000), message);
ここでも驚くべきことに、パフォーマンスが向上しました。
どうしたの?どうすればパフォーマンスを向上させることができますか? netmq で zproto を使用するのはどうですか? それに関する適切な文書はありますか?