尽可能快地从 WCF 消费流
Consume Stream from WCF as fast as possible
设置:
App A
运行3D 模型渲染图
App B
生成模型并通过 WCF 的流操作将它们(纯文本 OBJ 格式)发送到 App A
[OperationContract(IsOneWay = true)]
void VisualizeModel(Stream model);
我通过本地主机发送模型,因此带宽应该足够大以发送非常大的模型,但是我使用的渲染库从流中读取它们的方法很慢。
问题
我需要防止 App B
等待很长时间直到 App A
完全消耗它(最多需要 10 秒)。所以我尝试将输入流复制到中间流
modelDrain = new MemoryStream(1024*1024*300);
model.CopyTo(modelDrain);
modelDrain.Position = 0;
然后我开始 Task
到 运行 异步渲染,但是 我不 await
这个 Task
- 这样,WCF 操作几乎在我制作副本后立即完成。以这种方式完成 WCF 操作大约需要 4 秒。但问题是我 生成 这些模型 2 秒 ,所以我怀疑构建 3D 模型比仅仅复制它轻两倍HTTP.
问题
我可以通过任何其他方式(可能通过另一个 Stream
class)使用 WCF 流来加快处理速度吗?
本地主机上的 HTTP 有那么慢吗? (例如发送大约 100 Mb 的文本需要 4 秒,而生成此类数据仅需 2 秒)
在WCF中,可以通过压缩来提高传输速率encoder.The下面将比较使用压缩编码器和不使用压缩编码器的效果。
public Stream Echo()
{
Bitmap bitmap = new Bitmap(1000, 40000);
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow);
}
}
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms;
}
这是要传输的流。
static void Main()
{
DateTime afterDT = System.DateTime.Now;
Console.WriteLine(afterDT);
SampleServerClient client = new SampleServerClient();
client.Echo();
afterDT = System.DateTime.Now;
Console.WriteLine(afterDT);
Console.WriteLine("OK");
Console.ReadLine();
}
这是客户端的代码。我会记录客户端接收流所需的时间。
这是不使用压缩编码器的时间。
这是使用压缩编码器所花费的时间。
由于gzip图片压缩效率低,传输性能没有太大提升,但如果是其他大文件,性能会提升很多。
下面link是关于WCF压缩编码器的使用方法:
设置:
App A
运行3D 模型渲染图
App B
生成模型并通过 WCF 的流操作将它们(纯文本 OBJ 格式)发送到 App A
[OperationContract(IsOneWay = true)]
void VisualizeModel(Stream model);
我通过本地主机发送模型,因此带宽应该足够大以发送非常大的模型,但是我使用的渲染库从流中读取它们的方法很慢。
问题
我需要防止 App B
等待很长时间直到 App A
完全消耗它(最多需要 10 秒)。所以我尝试将输入流复制到中间流
modelDrain = new MemoryStream(1024*1024*300);
model.CopyTo(modelDrain);
modelDrain.Position = 0;
然后我开始 Task
到 运行 异步渲染,但是 我不 await
这个 Task
- 这样,WCF 操作几乎在我制作副本后立即完成。以这种方式完成 WCF 操作大约需要 4 秒。但问题是我 生成 这些模型 2 秒 ,所以我怀疑构建 3D 模型比仅仅复制它轻两倍HTTP.
问题
我可以通过任何其他方式(可能通过另一个 Stream
class)使用 WCF 流来加快处理速度吗?
本地主机上的 HTTP 有那么慢吗? (例如发送大约 100 Mb 的文本需要 4 秒,而生成此类数据仅需 2 秒)
在WCF中,可以通过压缩来提高传输速率encoder.The下面将比较使用压缩编码器和不使用压缩编码器的效果。
public Stream Echo()
{
Bitmap bitmap = new Bitmap(1000, 40000);
for (int i = 0; i < bitmap.Width; i++)
{
for (int j = 0; j < bitmap.Height; j++)
{
bitmap.SetPixel(i, j, (Math.Abs(i - j) < 2) ? Color.Blue : Color.Yellow);
}
}
MemoryStream ms = new MemoryStream();
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms;
}
这是要传输的流。
static void Main()
{
DateTime afterDT = System.DateTime.Now;
Console.WriteLine(afterDT);
SampleServerClient client = new SampleServerClient();
client.Echo();
afterDT = System.DateTime.Now;
Console.WriteLine(afterDT);
Console.WriteLine("OK");
Console.ReadLine();
}
这是客户端的代码。我会记录客户端接收流所需的时间。
这是不使用压缩编码器的时间。
这是使用压缩编码器所花费的时间。
由于gzip图片压缩效率低,传输性能没有太大提升,但如果是其他大文件,性能会提升很多。
下面link是关于WCF压缩编码器的使用方法: