And*_*nin 0 performance systems-programming rust
在其所有权范例的印象下,我才开始使用Rust。阅读该教程,我发现以下代码
let secret_number = rand::thread_rng().gen_range(1, 101);
Run Code Online (Sandbox Code Playgroud)
我假设rand::ThreadRng通过调用结构的方法实例化结构后会生成一个随机整数。
仅使用C语言中的函数来提高性能是否更好?由于Rust将自己定位为系统编程语言,并且如果我猜对了,那么选择创建结构并使用其方法的选择似乎不是最佳选择。
与C相比,Rust风格的方法调用方法是否有开销?
没有。
两种语言都可以生成完全相同的机器指令。表达这些概念的语法并不要求结果代码效率低下(在许多情况下相反)。
仅使用C语言中的函数来提高性能是否更好?
方法就是功能。
Rust方法在概念上与使用指针的C函数相同:
锈
struct Foo {
a: i32,
}
impl Foo {
fn add(&self, b: i32) -> i32 {
self.a + b
}
}
Run Code Online (Sandbox Code Playgroud)
C
struct Foo {
int a;
};
int Foo_add(struct Foo *self, int b) {
return self->a + b;
}
Run Code Online (Sandbox Code Playgroud)
这两种语言之间没有重要区别。
Rust具有免费功能和相关功能;如果您不需要引用数据,则无需:
锈
struct Foo {
a: i32,
}
// Free function
fn foo() -> Foo {
Foo { a: 42 }
}
impl Foo {
// Associated function
fn new() -> Foo {
Foo { a: 99 }
}
}
Run Code Online (Sandbox Code Playgroud)
C
struct Foo {
int a;
};
struct Foo foo() {
struct Foo foo = { 42 };
return foo;
}
struct Foo Foo_new() {
struct Foo foo = { 99 };
return foo;
}
Run Code Online (Sandbox Code Playgroud)
Rust还具有零大小的类型,看起来像它们具有关联的数据,但是在编译后的代码中消失了:
锈
// Zero size
struct Foo;
impl Foo {
fn add_one(&self, b: i32) -> i32 {
b + 1
}
}
Run Code Online (Sandbox Code Playgroud)
C
int Foo_add_one(int b) {
return b + 1;
}
Run Code Online (Sandbox Code Playgroud)
创建结构并使用其方法似乎不太理想
创建结构和使用相关方法在C代码中很常见。我会说这很可能是主要的编码风格。我不知道为什么你会说它不是最理想的。
您的示例案例没有用做比较,因为您没有提供任何 C代码,更不用说等效的代码了。ThreadRng做了很多工作来提供用于生成随机数了更好的体验:
ThreadRng使用ReseedingRng包装与相同的PRNGStdRng,在生成32 MiB随机数据后重新播种。每个线程都会缓存一个实例,并且返回的ThreadRng是对该实例的引用-因此,在单个线程中使用ThreadRng它既不是Send也不Sync安全。该RNG可以EntropyRng根据需要播种和重新播种。
“传统的”随机数生成器(rand)具有全局状态(通常是一件坏事),但从概念上讲看起来像这样:
struct RngState {
int whatever_goes_here;
};
static struct RngState GLOBAL_STATE = { 0 };
int rand_with_state(struct RngState *state) {
return state->whatever_goes_here++;
}
int rand() {
return rand_with_state(&GLOBAL_STATE);
}
Run Code Online (Sandbox Code Playgroud)
注意,它仍然使用指向数据的指针。