c语言250行学生选课系统,为什么rustc需要一分钟来编译这个250行程序并进行优化?...

背景:我为各种编程语言制作了一个愚蠢的代码生成程序,目的是比较各种编译器编译由简单函数构成的荒谬的长100K LOC程序需要多长时间 . 但是在编译时,程序的Rust版本从未在 rustc 给出优化标志时完成编译 .

我发现使用 -C opt-level=2 或 -C opt-level=3 标志为 rustc 编译一个非常小的Rust程序(下面的示例)很容易(对我的敏感性)太长了 . 我尝试在1.16稳定,1.30稳定,1.32.0夜间在Linux上和1.30稳定在macOS和Windows上 - 所有看起来对我来说太长时间无法编译 . 我这样说是因为相比之下,大致等效的C需要一秒钟才能用 clang++ -O3 进行编译 . 这引出了几个问题:

是否有 rustc 正在(缓慢地)对此代码执行 clang 不是?

如果我想亲自调查一下,有没有很好的资源来描述 rustc ?很高兴看到 opt-level=2 中的特定优化是否是罪魁祸首 .

rustc guide讲述了如何打开调试日志 . 使用它得到:

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::rt::lang_start::)

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::rt::lang_start::{{closure}}:: i32, fn()>)

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::sys::unix::process::process_common::ExitCode::as_i32)

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(>::call_once - shim)

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(>::call_once - shim(vtable))

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::ptr::real_drop_in_place:: - shim(None))

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(::report)

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(<:process::exitcode as std::process::termination>::report)

INFO 2018-12-09T19:37:54Z: rustc_codegen_ssa::base: codegen_instance(std::fmt::ArgumentV1::new::)

INFO 2018-12-09T19:39:12Z: rustc_codegen_llvm::back::lto: 5 symbols to preserve in this crate

INFO 2018-12-09T19:39:12Z: rustc_codegen_llvm::back::lto: going for that thin, thin LTO

注意最后一个 rustc_codegen_ssa::base 和 rustc_codegen_llvm::back::lto 之间的微小差距 - 我应该怎么解释这个?

//$ rustc -C opt-level=2 test_20.rs

// takes over a minute to compile, rustc 1.32.0-nightly

// see https://gist.github.com/johnsabr/5e92cab52ffab5ea2a52edbd47aa348a

#![allow(unused_parens)]

fn f0(p: i32) -> i32 {

let x1: i32 = (p - ((((21 | 1) | p) ^ 84) & ((48 ^ (52 | (p & (2 ^ 61)))) - 67)));

let x2: i32 = x1;

let mut x3: i32 = 54;

let x4: i32 = 75;

let x5: i32 = (77 & 39);

let x6: i32 = (x2 * x5);

let x7: i32 = (88 * (8 + x1));

x3 = (x3 + 60);

((((((((32 * p) & x1) ^ x2) - x3) ^ x4) & x5) | x6) | x7)

}

fn f1(p: i32) -> i32 {

let mut x1: i32 = f0(78);

x1 = (x1 ^ p);

let mut x2: i32 = f0(x1);

x2 = (x2 * 3);

let x3: i32 = f0(x1);

let x4: i32 = ((21 & (x3 - ((93 * (x3 - (f0(x3) - (x2 - (f0(x1) | 43))))) | (f0(p) - f0(x1))))) * 41);

((((((f0(p) | x2) ^ p) & x1) ^ x2) | x3) - x4)

}

fn f2(p: i32) -> i32 {

let mut x1: i32 = f1(50);

x1 = (x1 * p);

x1 = (x1 | f0(p));

let mut x2: i32 = f1(x1);

x2 = (x2 | f1(x2));

let mut x3: i32 = (24 * f0(x1));

x2 = (x2 & f0(p));

x3 = (x3 ^ x1);

let x4: i32 = x1;

(((((x4 ^ p) | x1) * x2) + x3) | x4)

}

fn f3(p: i32) -> i32 {

let mut x1: i32 = f2(75);

let x2: i32 = x1;

x1 = (x1 & x2);

let x3: i32 = f0(p);

let x4: i32 = ((f1(x3) ^ f1(x2)) + 92);

x1 = (x1 | (x2 ^ 94));

x1 = (x1 * x2);

let x5: i32 = (f0(x1) & (3 ^ (f0(x1) * f2(x4))));

x1 = (x1 + x2);

(((((((x1 * x5) * p) - x1) | x2) * x3) - x4) - x5)

}

fn f4(p: i32) -> i32 {

let mut x1: i32 = f3(14);

x1 = (x1 + f0(p));

let mut x2: i32 = f1(x1);

x1 = (x1 - 41);

x2 = (x2 ^ 61);

let x3: i32 = f2(p);

x2 = (x2 ^ p);

let x4: i32 = x2;

x1 = (x1 - p);

x1 = (x1 * x4);

((((((88 & 11) & p) - x1) * x2) ^ x3) | x4)

}

fn f5(p: i32) -> i32 {

let mut x1: i32 = f4(50);

x1 = (x1 ^ 13);

((35 + p) | x1)

}

fn f6(p: i32) -> i32 {

let mut x1: i32 = f5(51);

x1 = (x1 + 27);

let x2: i32 = (p + (p | f1(x1)));

x1 = (x1 + f0(x2));

let x3: i32 = f0(x1);

let mut x4: i32 = 48;

x1 = (x1 ^ f0(p));

x1 = (x1 & 26);

x4 = (x4 * f1(x4));

(((((99 - p) * x1) ^ x2) & x3) + x4)

}

fn f7(p: i32) -> i32 {

let mut x1: i32 = f6(71);

x1 = (x1 & 66);

x1 = (x1 & p);

let x2: i32 = 57;

x1 = (x1 * 26);

let x3: i32 = (21 & p);

let x4: i32 = (f0(x1) & (f3(p) * f2(p)));

let x5: i32 = f6(x3);

((((((x5 + p) | x1) + x2) - x3) & x4) * x5)

}

fn f8(p: i32) -> i32 {

let mut x1: i32 = f7(57);

x1 = (x1 & f5(p));

x1 = (x1 ^ (x1 & f1(p)));

let x2: i32 = 25;

let x3: i32 = f5(x1);

((((x1 - p) * x1) & x2) ^ x3)

}

fn f9(p: i32) -> i32 {

let mut x1: i32 = f8(23);

x1 = (x1 | (((26 | f4(x1)) - f0(p)) | f8(p)));

let x2: i32 = x1;

let mut x3: i32 = 58;

x3 = (x3 - p);

let x4: i32 = f7(x1);

let x5: i32 = f7(x2);

let x6: i32 = (f7(x1) & 79);

(((((((33 | p) - x1) + x2) + x3) * x4) ^ x5) + x6)

}

fn f10(p: i32) -> i32 {

let mut x1: i32 = f9(75);

x1 = (x1 | 37);

(((f8(x1) + f3(x1)) | p) * x1)

}

fn f11(p: i32) -> i32 {

let mut x1: i32 = f10(8);

x1 = (x1 ^ f6(x1));

let mut x2: i32 = p;

x2 = (x2 ^ 84);

let x3: i32 = (f5(p) ^ f5(p));

x1 = (x1 * f5(p));

x1 = (x1 | f1(x2));

x1 = (x1 * f8(p));

((((((f0(x3) | f9(p)) - f4(x1)) + p) & x1) & x2) - x3)

}

fn f12(p: i32) -> i32 {

let mut x1: i32 = f11(33);

x1 = (x1 * 84);

let mut x2: i32 = (67 - f0(p));

x2 = (x2 | x1);

x1 = (x1 - 67);

x2 = (x2 - f6(p));

(((p - p) * x1) | x2)

}

fn f13(p: i32) -> i32 {

let mut x1: i32 = f12(90);

x1 = (x1 + (f6(x1) - f4(p)));

x1 = (x1 - 19);

let x2: i32 = 92;

let mut x3: i32 = f9(x1);

let mut x4: i32 = x3;

x4 = (x4 - (87 | f5(x3)));

x3 = (x3 | 49);

let x5: i32 = 25;

let x6: i32 = x3;

(((((((2 & p) - x1) ^ x2) ^ x3) ^ x4) | x5) | x6)

}

fn f14(p: i32) -> i32 {

let mut x1: i32 = f13(66);

let x2: i32 = f2(p);

x1 = (x1 - 11);

let mut x3: i32 = 69;

x3 = (x3 * x2);

let x4: i32 = 91;

(((((19 * p) + x1) | x2) ^ x3) & x4)

}

fn f15(p: i32) -> i32 {

let mut x1: i32 = f14(79);

x1 = (x1 + (f8(p) & p));

let x2: i32 = p;

x1 = (x1 | ((f5(p) & x2) ^ x2));

let mut x3: i32 = x1;

x1 = (x1 - p);

x3 = (x3 * p);

((((40 * p) ^ x1) + x2) + x3)

}

fn f16(p: i32) -> i32 {

let x1: i32 = f15(77);

let mut x2: i32 = 5;

let mut x3: i32 = x1;

let x4: i32 = p;

x2 = (x2 + p);

let x5: i32 = x4;

x3 = (x3 | f9(x4));

let x6: i32 = (68 ^ (61 ^ (24 * f14(x4))));

(((((((88 + p) - x1) & x2) | x3) & x4) ^ x5) | x6)

}

fn f17(p: i32) -> i32 {

let mut x1: i32 = f16(41);

x1 = (x1 | 4);

let mut x2: i32 = x1;

x1 = (x1 | 52);

x1 = (x1 & 49);

x2 = (x2 & (f8(x2) ^ p));

let mut x3: i32 = x2;

x3 = (x3 ^ ((x1 ^ x2) + f15(x2)));

let mut x4: i32 = (f13(x2) ^ 73);

x4 = (x4 - f12(x1));

(((((x3 - p) + x1) ^ x2) + x3) | x4)

}

fn f18(p: i32) -> i32 {

let mut x1: i32 = f17(3);

x1 = (x1 & (p - ((33 * (95 | 87)) | (9 - f1(x1)))));

x1 = (x1 & (80 - f16(x1)));

x1 = (x1 & p);

x1 = (x1 + p);

x1 = (x1 | (82 - ((81 ^ p) - 97)));

((20 - p) * x1)

}

fn f19(p: i32) -> i32 {

let x1: i32 = f18(24);

let x2: i32 = (p & p);

let mut x3: i32 = 82;

let x4: i32 = (4 + x1);

x3 = (x3 | ((f10(p) + (f16(x3) - 34)) - f10(x1)));

let x5: i32 = (x4 | (x1 * (((f16(x1) + f4(x4)) - 43) & f7(x3))));

(((((((f14(x3) | f9(x5)) - p) & x1) * x2) & x3) * x4) + x5)

}

fn f20(p: i32) -> i32 {

let x1: i32 = f19(78);

let x2: i32 = 81;

let x3: i32 = (x2 + (59 & x1));

(((((f9(x3) ^ f11(x3)) * p) * x1) - x2) ^ x3)

}

fn main() {

let mut x0: i32 = f20(65);

x0 = (x0 * (53 + 37));

let mut x1: i32 = (x0 - ((41 | ((f20(x0) * f9(x0)) + ((((f20(x0) + (77 + (f14(x0) ^ 60))) * 27) & 62) + x0))) & f20(x0)));

let x2: i32 = f15(x1);

x1 = (x1 | (x0 * (4 ^ 37)));

let m: i32 = (((x2 | x0) | x1) | x2);

println!("{}", m);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值