为什么此代码在进行优化编译时运行得如此之快?

西瓜49998

我已经在 Rust 中编写了一个遗传算法来熟悉 Rust。当我运行代码时,我发现 ( cargo run) 和 ( cargo run --release) 版本之间存在极端的性能差异我发现创建随机初始化基因的代码对此负责。

我搜索了是否有办法查看由 Rust 编译器优化的代码,并发现在 Rust Playground 上是可能的。所以我去了,看到一堆汇编代码,我不知道如何阅读。

以下代码是我提供给 Rust 游乐场的代码。(对不起,代码很脏。我对编程很陌生。)

在没有优化(cargo run)的情况下编译时,平均需要 160 秒才能运行。

使用 optimizations( cargo run --release)编译时,平均需要 3 秒才能运行。

编译器可能正在执行哪些确切的优化方法来导致这种巨大的性能差异?

extern crate rand;

use rand::Rng;
use std::time::Instant;

fn make_genepool(position_list: &Vec<Vec<i8>>, size: i32) -> Vec<Vec<i8>>{
    let mut genelist:Vec<Vec<i8>> = Vec::new();
    let position_len = position_list.len();
    let mut rand = rand::thread_rng();
    let mut gene_rand:Vec<Vec<i8>> = Vec::new();
    for i in 0..position_len{
        let mut gene_insert:Vec<i8> = Vec::new();
        let avail_move_len = position_list[i].len();
        for _ in 0..size{
            gene_insert.push(position_list[i][rand.gen_range(0, avail_move_len)]);
        }
        gene_rand.push(gene_insert);
    }
    
    for i in 0..size as usize{
        let mut genelist_insert:Vec<i8> = Vec::new();
        for j in 0..position_len{
            genelist_insert.push(gene_rand[j][i]);
        }
        genelist.push(genelist_insert);
    }

return genelist;
}

fn main(){
    let mut rand = rand::thread_rng();

    let mut test_data:Vec<Vec<i8>> = Vec::new();
    for i in 0..4520{
        let mut temp:Vec<i8> = Vec::new();
        for j in 0..rand.gen_range(1, 9){
            temp.push(rand.gen_range(1, 9));
        }
        test_data.push(temp);
    }

    let now = Instant::now();
    let ans = make_genepool(&test_data, 16384);
    println!("Time passed: {}", now.elapsed().as_secs_f64());
}
拉胡尔·艾尔

您必须比较优化和未优化代码的汇编代码,才能确定它真正在做什么。

但它可能是:

范围检查:如果您使用常量(例如代码中的 4520),则不需要范围检查。

循环展开:如果编译器知道每个循环运行的多种类型,它可能会简单地将循环体多次转换为相同的代码。

其他诸如内联函数等。

为了让你的代码运行得更快,你可以完全按照编译器在做的事情,但最好让编译器来做。编译器旨在优化您的代码是有原因的。

如果您只是想编写更高效的代码,请关注:

  1. 确保您的用例的算法是最佳的。算法的性能因输入的数据而异,因此即使理论上一种算法可能是最佳的,但对于您的数据,您的性能可能最差,而另一种算法可能更合适。

  2. 了解创建对象、销毁对象等(内存管理)时发生的事情。这将要求您学习该语言以了解它为您做什么。但是编写最有效的代码以便编译器不必猜测的努力可能不值得您花时间。例如,编译器使用了许多技术,例如分支预测等,这会让您自己做起来非常乏味。最好在您的代码已经正常工作之后才真正需要优化。

最后,这真的值得你花时间吗?也许你的时间专注于让你的代码工作会更好,然后让编译器为你优化它。随着时间的推移,无论如何你都会通过经验学习东西并编写更有效的代码(希望如此)。

如果此答案有帮助,请将其标记为正确。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通过ID和Xpath进行点击的Javascript代码执行得如此之快

是什么使Java编译器如此之快?

为什么C ++模板计算如此之快?

为什么MATLAB在矩阵乘法中如此之快?

为什么这个C ++程序如此之快?

为什么从内存映射文件读取如此之快?

为什么列表乘法如此之快?

为什么Dask的执行速度如此之慢,而多处理的执行速度却如此之快?

为什么三元运算符如此之快?

为什么Spark从S3读取和写入如此之快

为什么在Python 3中“范围(10000000000000001)”如此之快?

为什么 Pandas 的速度如此之快?如何定义这样的函数?

当今计算机如此之快,为什么查看PDF文件仍然很慢?

为什么随后用youtube-dl下载的速度如此之快?

为什么USB串行在Linux中如此之快?

为什么在Python 3中复数求幂如此之快?

为什么使用JavaScript对32位数字进行排序比对33位数字进行排序如此之快?

是什么使Python的列表附加方法如此之快?

与较新的libstdc ++。so链接时,为什么C ++可执行文件的运行速度如此之快?

为什么在摩托罗拉68k中dbra对于这么大的循环计数如此之快?

为什么查询在Entity Framework中花费这么长时间,而在SQL中却如此之快呢?

为什么只有1个预配置读取容量单位的DynamoDB扫描速度如此之快?

Python Pandas MySQL - 为什么在将数据帧写入数据库时 SQLite 速度如此之快

是什么导致此 VBA 代码运行时间如此之长?

Celery:任务执行得如此之快,以至于无法检索更新的数据库

为什么默认的最大堆大小如此之小

为什么此JavaScript页面重定向如此之慢?

是什么让gcc std :: list排序实现如此之快?

扩展c宏后,为什么代码如此之大?