Rust 为什么这个铁锈环的速度这么慢?
我是个新手,因为这是我写的第一个代码。我正在尝试为一个我们将根据Go构建的应用程序做一些基准测试,但是我的Rust POC速度慢得离谱,我确信这是因为我还没有完全理解这种语言。它在Go中以秒为单位运行,但在Rust中已运行了许多分钟:Rust 为什么这个铁锈环的速度这么慢?,rust,Rust,我是个新手,因为这是我写的第一个代码。我正在尝试为一个我们将根据Go构建的应用程序做一些基准测试,但是我的Rust POC速度慢得离谱,我确信这是因为我还没有完全理解这种语言。它在Go中以秒为单位运行,但在Rust中已运行了许多分钟: use serde_json::{Result, Value}; use std::fs::File; use std::io::BufReader; fn rule(data: Value) { for _i in 0..1000000000 {
use serde_json::{Result, Value};
use std::fs::File;
use std::io::BufReader;
fn rule(data: Value) {
for _i in 0..1000000000 {
let ru = "589ea4b8-99d1-8d05-9358-4c172c10685b";
let s = 0 as usize;
let tl = data["tl"].as_array().unwrap().len();
for i in s..tl {
if data["tl"][i]["t"] == "my_value" && data["tl"][i]["refu"] == ru {
//println!(" t {} matched with reference/ru {}\n", data["tl"][i]["t"], data["tl"][i]["refu"]);
let el = data["el"].as_array().unwrap().len();
for j in s..el {
if data["el"][j]["is_inpatient"] == true && data["el"][j]["eu"] == data["tl"][i]["eu"] {
//println!(" e {} matched.\n", data["el"][j]["eu"]);
}
}
}
}
}
}
fn start() -> Result<()> {
let file = File::open("../../data.json").expect("File should open read only");
let reader = BufReader::new(file);
let v: Value = serde_json::from_reader(reader).expect("JSON was not well-formatted");
//println!("Running rule");
rule(v);
Ok(())
}
fn main() {
let _r = start();
}
使用serde_json::{Result,Value};
使用std::fs::File;
使用std::io::BufReader;
fn规则(数据:值){
对于0..100000000中的_i{
设ru=“589ea4b8-99d1-8d05-9358-4c172c10685b”;
设s=0为usize;
设tl=data[“tl”].as_array().unwrap().len();
对于s..tl中的i{
如果数据[“tl”][i][“t”]=“我的U值”&数据[“tl”][i][“REU”]==ru{
//println!(“t{}与引用/ru{}\n匹配,数据[“tl”][i][“t”],数据[“tl”][i][“refu”]);
设el=data[“el”].as_array().unwrap().len();
对于s..el中的j{
如果数据[“el”][j][“is_住院患者”]==真实和数据[“el”][j][“eu”]==数据[“tl”][i][“eu”]{
//println!(“e{}匹配。\n”,数据[“el”][j][“eu”]);
}
}
}
}
}
}
fn start()->结果{
让file=file::open(“../../data.json”).expect(“文件应以只读方式打开”);
让reader=BufReader::new(文件);
让v:Value=serde_json::from_reader(reader).expect(“json格式不好”);
//println!(“运行规则”);
规则(五);
好(())
}
fn main(){
让_r=start();
}
1) 我知道这太难看了。这只是一个速度POC,所以如果它赢了,我计划在以后更详细地了解该语言
2) 最大的问题:我在这里做错了什么,导致生锈的表现如此缓慢
--release
标志构建。如果没有它,您将得到带有调试检查的未优化的构建,这实际上会慢100倍。添加该标志通常是您需要做的所有事情,以击败Go-on执行速度,因为Go没有像这样的重型优化器[]
访问的缓存没有任何好处,因此每次重复数据[“tl”]
时,它都会搜索数据
,查找“tl”
。最好将该搜索缓存在变量中形式的循环是Rust中最慢的循环形式。对arr{item}中的item使用迭代器:更快
。这是因为[i]
执行额外的边界检查,迭代器不必这样做。在您的例子中,这可能是一个小问题,这与繁重的数字代码更相关
--release
标志构建。如果没有它,您将得到带有调试检查的未优化的构建,这实际上会慢100倍。添加该标志通常是您需要做的所有事情,以击败Go-on执行速度,因为Go没有像这样的重型优化器[]
访问的缓存没有任何好处,因此每次重复数据[“tl”]
时,它都会搜索数据
,查找“tl”
。最好将该搜索缓存在变量中形式的循环是Rust中最慢的循环形式。对arr{item}中的item使用迭代器:更快
。这是因为[i]
执行额外的边界检查,迭代器不必这样做。在您的例子中,这可能是一个小问题,这与繁重的数字代码更相关
1.你是怎么编译的?2.如果您的目标是速度,那么您可能不应该在值中反复查找相同的项。使用变量。具体来说,使用迭代而不是索引。最有可能的原因是您没有在发布模式下运行。下面是其他评论所谈论的一个例子:谢谢大家的帮助。我已经重写了代码,以匹配提供的操场,这是一个很大的帮助!一个后续步骤:如果在执行第一个for循环时,我想保存
tli[“eu”]
的值,以便将第二个for循环移到第一个for循环之外(之后运行)。我该怎么做?我似乎无法确定变量的作用域。如果要测试性能,则应使用--release标志进行编译<代码>货物运行-释放1。你是怎么编译的?2.如果您的目标是速度,那么您可能不应该在值中反复查找相同的项。使用变量。具体来说,使用迭代而不是索引。最有可能的原因是您没有在发布模式下运行。下面是其他评论所谈论的一个例子:谢谢大家的帮助。我已经重写了代码,以匹配提供的操场,这是一个很大的帮助!一个后续步骤:如果在执行第一个for循环时,我想保存tli[“eu”]
的值,以便将第二个for循环移到第一个for循环之外(之后运行)。我该怎么做?我似乎无法确定变量的作用域。如果要测试性能,则应使用--release标志进行编译<代码>货物运行-放行