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 {

我是个新手,因为这是我写的第一个代码。我正在尝试为一个我们将根据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 {
        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没有像这样的重型优化器

  • Rust对
    []
    访问的缓存没有任何好处,因此每次重复
    数据[“tl”]
    时,它都会搜索
    数据
    ,查找
    “tl”
    。最好将该搜索缓存在变量中

  • 0..len{arr[i]}中i的
    形式的循环是Rust中最慢的循环形式。对arr{item}中的item使用迭代器:
    更快
    。这是因为
    [i]
    执行额外的边界检查,迭代器不必这样做。在您的例子中,这可能是一个小问题,这与繁重的数字代码更相关

  • 使用
    --release
    标志构建。如果没有它,您将得到带有调试检查的未优化的构建,这实际上会慢100倍。添加该标志通常是您需要做的所有事情,以击败Go-on执行速度,因为Go没有像这样的重型优化器

  • Rust对
    []
    访问的缓存没有任何好处,因此每次重复
    数据[“tl”]
    时,它都会搜索
    数据
    ,查找
    “tl”
    。最好将该搜索缓存在变量中

  • 0..len{arr[i]}中i的
    形式的循环是Rust中最慢的循环形式。对arr{item}中的item使用迭代器:
    更快
    。这是因为
    [i]
    执行额外的边界检查,迭代器不必这样做。在您的例子中,这可能是一个小问题,这与繁重的数字代码更相关


  • 1.你是怎么编译的?2.如果您的目标是速度,那么您可能不应该在值中反复查找相同的项。使用变量。具体来说,使用迭代而不是索引。最有可能的原因是您没有在发布模式下运行。下面是其他评论所谈论的一个例子:谢谢大家的帮助。我已经重写了代码,以匹配提供的操场,这是一个很大的帮助!一个后续步骤:如果在执行第一个for循环时,我想保存
    tli[“eu”]
    的值,以便将第二个for循环移到第一个for循环之外(之后运行)。我该怎么做?我似乎无法确定变量的作用域。如果要测试性能,则应使用--release标志进行编译<代码>货物运行-释放
    1。你是怎么编译的?2.如果您的目标是速度,那么您可能不应该在值中反复查找相同的项。使用变量。具体来说,使用迭代而不是索引。最有可能的原因是您没有在发布模式下运行。下面是其他评论所谈论的一个例子:谢谢大家的帮助。我已经重写了代码,以匹配提供的操场,这是一个很大的帮助!一个后续步骤:如果在执行第一个for循环时,我想保存
    tli[“eu”]
    的值,以便将第二个for循环移到第一个for循环之外(之后运行)。我该怎么做?我似乎无法确定变量的作用域。如果要测试性能,则应使用--release标志进行编译<代码>货物运行-放行