情境:有一个WCF流式服务向客户端提供文件流。 在客户端,通过调用stream.Read(buffer, 0, chunkSize)来读取WCF文件流,其中chunkSize为10240。
我想知道当调用Read时是否仅在网络(Internet)上传输数据,或者在后台有任何读取数据的内容,可能在调用stream.Read之前就已经读取了数据。我问这个问题是因为我需要测量下载速度。但是,在读取一块数据之后,我执行其他操作-发送事件,将刚刚读取的数据写入本地文件流。因此,我需要排除这些其他操作,以便我清楚地了解只下载文件所需的时间。因此,我继续测量下载10KB数据需要多长时间,并最终使用总文件大小和总经过的时间计算出每秒传输的千字节(kbsPerSecond)。
不幸的是,在循环内部放置秒表会导致性能损失,但我想如果要正确测量带宽,我必须接受这一点。
这种方法准确吗?
我想知道当调用Read时是否仅在网络(Internet)上传输数据,或者在后台有任何读取数据的内容,可能在调用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));
这种方法准确吗?