场景:有一个 WCF 流服务可以向客户端提供文件流。在客户端,通过调用 stream.Read(buffer, 0, chunkSize) 来读取 WCF 文件流,其中 chunkSize 为 10240。
我想知道数据是否仅在调用 Read 时才通过网络(互联网)传输,或者在后台有一些读取数据的东西,并且在调用 stream.Read 时可能已经读取了数据。我问这个是因为我需要测量下载速度。但是,在我读取了一大块数据之后,我会执行其他操作——发送事件,将刚刚读取的数据写入本地文件流。因此,我需要对这些其他操作进行折扣,以便我清楚地了解仅下载文件需要多长时间。所以我一直在测量下载 10KB 数据需要多长时间,最后 kbsPerSecond 是使用总文件大小和总时间来计算的。
不幸的是,在循环中使用秒表会导致性能下降,但我想如果我想正确测量带宽,我将不得不忍受它。
long totalBytesRead = 0;
Stopwatch stopwatch = new Stopwatch();
do
{
int bytesRead;
stopwatch.Start();
bytesRead = stream.Read(buffer, 0, chunkSize);
stopwatch.Stop();
if (bytesRead == 0)
break;
totalBytesRead += bytesRead;
// 1. write to local file stream
// 2. raise file download progress events
} while (true);
long elapsedTime = stopwatch.ElapsedMilliseconds;
int kbsPerSecond = Convert.ToInt32(((double)totalBytesRead / 1024) / ((double)elapsedTime / 1000));
这种方法会准确吗?
最佳答案
您是否测量过秒表的实际性能影响?我只是在我的机器上进行了一个快速测试(所以 YMMV),用一个外部秒表来测量总时间,并在一个循环内用一个秒表来模拟你正在使用的那个。循环迭代了 100 万次,内部秒表的总性能影响仅为 49 毫秒(分布在所有 100 万次迭代中),因此您说的是每次迭代的单位数较低的滴答声。
除非您看到更大的影响,否则您似乎无需担心。
关于.net - WCF 流读取行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24562069/