是否对克隆语句进行了优化?

蒂利奥

我有类似下面的代码

let x = Arc::new(Mutex::new(Thing::new()));

work_on_data(x.clone());
do_more_work_on_data(x.clone());

x在第二个功能之后不使用,因此不需要第二个克隆。我应该clone()手动删除还是对其进行优化?

马修M.

为什么不?

优化编译器的首要原则是as-if规则,该规则指定只要编译器可以证明优化是不可观察的,就可以优化任何东西。

注意:这是某些语言的基础,允许进行特定的优化。

因此,例如:

#[derive(Clone, Debug)]
struct MyDummyType(u64);

extern {
    fn print_c(_: *const ());
}

#[inline(never)]
fn print(dummy: MyDummyType) {
    unsafe { print_c(&dummy as *const _ as *const _) }
}

fn main() {
    let x = MyDummyType(42);
    print(x.clone());
    print(x.clone());
}

产生以下内容main

; Function Attrs: nounwind uwtable
define internal void @_ZN8rust_out4main17h0c6f2596c7f28a79E() unnamed_addr #1 {
entry-block:
  tail call fastcc void @_ZN8rust_out5print17h1f2d1a86beea10d7E(i64 42)
  tail call fastcc void @_ZN8rust_out5print17h1f2d1a86beea10d7E(i64 42)
  ret void
}

编译器完全浏览了我们的代码(实际上,我不得不使用extern函数来强制其在中发出一些代码main)。


那么,您的情况如何?

老实说,这要困难得多。

具体来说,由于以下原因,语义可能会发生变化Drop

  • 使用do_more_work_on_data(x.clone())x可以确保在执行结束后将丢弃,因此在当前函数结束时Drop执行的任何副作用
  • do_more_work_on_data(x)x 可能会在do_more_work_on_dataOR的末尾删除也可能会在其中的更早位置删除。

因此,为了证明优化是不可观察的,编译器必须证明:

  • 要么Drop没有效果,
  • Drop将在的最后执行do_more_work_on_data,该操作与紧随其后的执行相同,
  • 要么 ...?

这有多大可能?

Drop实施Mutex需要调用FFI,所以从优化的角度来看它具有可观察到的效果。

因此,这全都取决于是否do_more_work_on_data内联。如果确实如此,那么确实可以将多余的部分clone进行优化。如果没有,我不会屏住呼吸。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

检查是否对numpy数组进行了排序

是否对JavaScript引擎尾部调用(TCO)进行了优化?

如何找出JVM对我的代码进行了哪些优化?

是否针对C标准进行了有条件的移动优化?

内核是否进行了碎片整理

“ constexpr if”与“ if”进行了优化-为什么需要“ constexpr”?

ML系列编译器是否对尾部调用进行了任何复杂的优化?

如何确定Swift是否使用优化进行了编译

微观优化,是否已通过现代浏览器进行了优化?

检查ConcurrentHashMap的computeIfAbsent是否进行了更改

确定是否对小标题进行了分组

检查用户是否对某项投票进行了投票

Kotlin的Float,Int等是否已针对JVM中的内置类型进行了优化?

Node.js:异步函数中是否对尾部调用进行了优化?

如何检查我的应用程序是否已针对Android进行了电池优化配置?

将数据框投射到数据集后的选择是否进行了优化?

如何确定给定的表是否对内存进行了优化?

Visual Studio是否针对超线程微处理器进行了优化?

是否对if(0)和if(1)语句进行了优化?

Ubuntu是否针对多核CPU进行了优化?

针对循环python进行了优化

是否仅对Azure表存储分区键查询进行了优化?

苹果是否已删除“针对iPhone 6和iPhone 6 Plus进行了优化”?

在XML文件中具有所有参数是否进行了优化?

OpenCV是否在调试模式下进行了优化?

是否对不使用模板参数的模板化类的方法进行了编译器优化?

Saxon XSLT 处理器是否针对将隧道参数设置为其当前值进行了优化?

数组是否在 jOOQ 和 PostgreSQL 中进行了优化?

SoX 中的 noiseprof 是否对声音进行了平均测量?