使用 'static 与 'a 的性能差异是什么?
What are the performance differences of using 'static vs 'a?
考虑到以下功能,您预计会有哪些性能差异?
pub fn foo<'a>(data: Request) -> Response<'a> {
//
}
对比
pub fn foo(data: Request) -> Response<'static> {
//
}
生命周期为 'static
的 Response
是否会在程序生命周期内将每个 Response
都保存在内存中?
与 'static
相比,'a
会在内存中保留多长时间?
这两个函数将生成相同的机器码。生命周期在编译期间被删除。如果您的程序签出,它们就没有进一步的意义。
特别是,将生命周期视为 "this is held in memory this long" 是错误的。生命周期都是关于 "this stays alive long enough"。这是一个微妙的区别,但要记住的关键是生命周期是 描述性的 ,而不是 规定性的 。给予某物一生的生命并不意味着它会存活一段时间。由于其他原因(例如,可以使用 'static
引用全局变量),或者程序无法编译。
其次,您的代码段中的生命周期根本不会立即生效。它们只是 Response
结构的参数。由该结构决定如何处理生命周期。它是否在内部持有对这一生的事物的引用?它是否只是转发到用于将响应与某些连接相关联的 PhantomData
?
第三,考虑到函数的定义方式(lifetime参数只在return类型中使用),对实现的要求没有区别。因为这里的生命周期是由 调用者选择的 ,函数必须准备好完成 'static
生命周期。所有这一切只会让调用者的使用更加烦人。
所以总结一下:
- 生命周期不是这样的。
- 第一个版本没有用。
考虑到以下功能,您预计会有哪些性能差异?
pub fn foo<'a>(data: Request) -> Response<'a> {
//
}
对比
pub fn foo(data: Request) -> Response<'static> {
//
}
生命周期为 'static
的 Response
是否会在程序生命周期内将每个 Response
都保存在内存中?
与 'static
相比,'a
会在内存中保留多长时间?
这两个函数将生成相同的机器码。生命周期在编译期间被删除。如果您的程序签出,它们就没有进一步的意义。
特别是,将生命周期视为 "this is held in memory this long" 是错误的。生命周期都是关于 "this stays alive long enough"。这是一个微妙的区别,但要记住的关键是生命周期是 描述性的 ,而不是 规定性的 。给予某物一生的生命并不意味着它会存活一段时间。由于其他原因(例如,可以使用 'static
引用全局变量),或者程序无法编译。
其次,您的代码段中的生命周期根本不会立即生效。它们只是 Response
结构的参数。由该结构决定如何处理生命周期。它是否在内部持有对这一生的事物的引用?它是否只是转发到用于将响应与某些连接相关联的 PhantomData
?
第三,考虑到函数的定义方式(lifetime参数只在return类型中使用),对实现的要求没有区别。因为这里的生命周期是由 调用者选择的 ,函数必须准备好完成 'static
生命周期。所有这一切只会让调用者的使用更加烦人。
所以总结一下:
- 生命周期不是这样的。
- 第一个版本没有用。