< 返回版块

12101111 发表于 2019-09-28 18:38

大家好,我在写一个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的方法呢.

评论区

写评论
xcaptain 2019-09-30 10:22

看来rust的iterator真是挺懒的,不用就不会有消耗

作者 12101111 2019-09-29 02:15

已基本解决问题,详情见commit

作者 12101111 2019-09-29 00:19

重新在Linux上进行了一次测试:

https://github.com/12101111/speedtestr/pull/1

作者 12101111 2019-09-28 22:52

在localhost上启动的服务器,测速2GB的数据包,read_line的速度是4383MB/s,而for+if的速度是705MB/s,因此判断for+if存在一些优化空间

Mike Tang 2019-09-28 22:43

大小多少本来就是相对的,你第二个cpu占用率高,是多高?没有具体的数值,也就不成为一个合格的问题呢。

1 共 5 条评论, 1 页