大家好,我在写一个Speedtest.net的命令行客户端,打算在5G设备上批量跑来测网速,地址在https://github.com/12101111/speedtestr
其中下载部分是用一个TcpStream读取几百兆服务端随机生成的ASCII字符串,最后以\n结尾
目前的代码是
let mut stream = TcpStream::connect(host)?; //建立TCP链接
// 省去请求代码
let mut line = String::new();
let mut reader = BufReader::new(stream); // 使用BufReader
let now = Instant::now();
reader.read_line(&mut line)?; // 使用read_line下载直到遇到/n
let elapsed = now.elapsed().as_millis(); // 使用时间差来计算速度
let speed = line.len() as f64 / elapsed as f64 * 0.008; // Mbps
这里有一个问题,read_line会把下载的内容保存到内存,但是实际上字符串是不需要保存的.大多数情况下需要下载数百兆的内容测速才比较准确,非常占用内存. 于是打算换一种写法:
let bytes_reader = BufReader::new(stream).bytes();
let now = Instant::now();
for c in bytes_reader{
if c? == b'\n'{
break;
}
}
let elapsed = now.elapsed().as_millis();
这样写内存占用大幅度下降(只有几百KB vs 原来的数百MB),但是CPU占有率比较高.
有没有不占用内存也不占用CPU的方法呢.
1
共 5 条评论, 1 页
评论区
写评论看来rust的iterator真是挺懒的,不用就不会有消耗
已基本解决问题,详情见commit
重新在Linux上进行了一次测试:
https://github.com/12101111/speedtestr/pull/1
在localhost上启动的服务器,测速2GB的数据包,read_line的速度是4383MB/s,而for+if的速度是705MB/s,因此判断for+if存在一些优化空间
大小多少本来就是相对的,你第二个cpu占用率高,是多高?没有具体的数值,也就不成为一个合格的问题呢。