Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么我的Rust程序比同等的Java程序慢?_Performance_File Io_Rust - Fatal编程技术网

Performance 为什么我的Rust程序比同等的Java程序慢?

Performance 为什么我的Rust程序比同等的Java程序慢?,performance,file-io,rust,Performance,File Io,Rust,我在中研究了二进制序列化和反序列化,发现二进制反序列化比Java慢几个数量级。为了消除由于分配和开销而产生的开销,我只是从每个程序中读取一个二进制流。每个程序都从磁盘上的二进制文件中读取数据,该文件包含一个包含输入值数量的4字节整数和一个连续的8字节big-endian编码浮点数块。以下是Java实现: import java.io.*; 公共类ReadBinary{ 公共静态void main(字符串[]args)引发异常{ DataInputStream输入=新的DataInputStrea

我在中研究了二进制序列化和反序列化,发现二进制反序列化比Java慢几个数量级。为了消除由于分配和开销而产生的开销,我只是从每个程序中读取一个二进制流。每个程序都从磁盘上的二进制文件中读取数据,该文件包含一个包含输入值数量的4字节整数和一个连续的8字节big-endian编码浮点数块。以下是Java实现:

import java.io.*;
公共类ReadBinary{
公共静态void main(字符串[]args)引发异常{
DataInputStream输入=新的DataInputStream(新的BufferedInputStream(新的FileInputStream(args[0]));
int inputLength=input.readInt();
System.out.println(“输入长度:“+inputLength”);
试一试{
for(int i=0;i
以下是Rust实现:

使用std::fs::File;
使用std::io::{BufReader,Read};
使用std::path::path;
fn main(){
设args=std::env::args_os();
让fname=args.skip(1.next().unwrap();
让path=path::new(&fname);
让mut file=BufReader::new(file::open(&path).unwrap());
let input_length:i32=read_int(&mut file);
对于0中的i..输入长度{
设d=读双慢(&mut文件);
如果i==输入_长度-1{
println!(“{}”,d);
}
}
}
fn read_int(输入:&mut R)->i32{
让mut bytes=[0;std::mem::size_of::()];
input.read_exact(&mut字节)。unwrap();
i32::from_be_字节(字节)
}
fn读取速度慢(输入:&mut R)->f64{
让mut bytes=[0;std::mem::size_of::()];
input.read_exact(&mut字节)。unwrap();
f64::从字节(字节)
}
我正在输出最后一个值,以确保所有输入都被读取。在我的机器上,当文件包含(相同的)3000万个随机生成的double时,Java版本在0.8秒内运行,而Rust版本在40.8秒内运行

由于怀疑Rust的字节解释本身效率低下,我使用自定义浮点反序列化实现重试了它。在没有
IoResult
包装的情况下,内部构件包括:

fn read_double(输入:&mut R,缓冲区:&mut[u8])->f64{
使用std::mem::transmute;
匹配输入。至少读取(8,缓冲区){
Ok(n)=>如果n>8{fail!(“n>8”)},
错误(e)=>失败!(e)
};
设mut val=0u64;
设muti=8;
当i>0时{
i-=1;

val+=buffer[7-i]as u64当您在没有优化的情况下构建时,它通常会比Java中的速度慢。但是在构建时要进行优化(
rustc-O
cargo--release
)而且速度应该快得多。如果标准版本的速度仍然较慢,那么就应该仔细检查一下,找出缓慢的原因可能是内联了一些不应该内联的东西,也可能是不应该内联的东西,或者可能是一些预期的优化没有发生。

当您在没有优化后,它通常会比Java中的速度慢。但要用优化来构建它(
rustc-O
cargo-release
)而且速度应该快得多。如果标准版本的速度仍然较慢,那么就应该仔细检查一下,找出缓慢的原因可能是内联了一些不应该内联的东西,也可能是不应该内联的东西,或者可能是一些预期的优化没有发生。

您是否在进行优化ed构建?(
rustc-O
货物-发布
)我会尝试比较所有这些,但我没有安装Java。哦!我甚至没有想到要启用优化。使用
rustc-O
,慢速版本运行在1.5s,快速版本运行在0.4s。仍然有点奇怪的是,朴素的Rust版本如何比Java版本运行得慢,但我想这可以归因于
IoResult
wrappers。我不知道我是否应该结束这个问题,或者您是否希望添加这个作为答案。您是否正在进行优化构建?(
rustc-O
货物-发布
)我会尝试比较所有这些,但我没有安装Java。哦!我甚至没有想到要启用优化。使用
rustc-O
,慢速版本运行在1.5s,快速版本运行在0.4s。仍然有点奇怪的是,朴素的Rust版本如何比Java版本运行得慢,但我想这可以归因于
IoResult
wrappers。我不知道我是否应该结束这个问题,或者您是否想添加这个作为答案。