与其他系统编程语言(例如C)通常使用的功能相比,Rust样式的方法调用方法是否有任何开销?

时间:2019-06-13 00:46:48

标签: performance rust systems-programming

在其所有权范例的印象下,我才开始使用Rust。读tutorial,发现以下代码

let secret_number = rand::thread_rng().gen_range(1, 101);

我假设在通过实例化rand::ThreadRng结构的方法后生成了一个随机整数。

仅使用C语言中的函数是否对性能更好?由于Rust将自己定位为一种系统编程语言,并且如果我猜对了,那么选择创建结构并使用其方法的选择似乎不是最佳选择。

1 个答案:

答案 0 :(得分:5)

  

与[...] C相比,Rust风格的方法调用方法是否有开销?

否。

两种语言都可以生成完全相同的机器指令。表达这些概念的语法并不要求结果代码效率低下(在许多情况下相反)。

  

仅使用C语言中的函数对性能是否更好?

方法功能。

Rust方法在概念上与使用指针的C函数相同:

铁锈

struct Foo {
    a: i32,
}

impl Foo {
    fn add(&self, b: i32) -> i32 {
        self.a + b
    }
}

C

struct Foo {
    int a;
};

int Foo_add(struct Foo *self, int b) {
    return self->a + b;
}

这两种语言之间没有重要区别。

Rust具有 free 功能和 associated 功能;如果您不需要引用数据,则无需:

铁锈

struct Foo {
    a: i32,
}

// Free function
fn foo() -> Foo { 
    Foo { a: 42 }
}

impl Foo {
    // Associated function
    fn new() -> Foo {
        Foo { a: 99 }
    }
}

C

struct Foo {
    int a;
};

struct Foo foo() {
    struct Foo foo = { 42 };
    return foo;
}

struct Foo Foo_new() {
    struct Foo foo = { 99 };
    return foo;
}

Rust也具有大小为零的类型,看起来它们具有关联的数据,但是在已编译的代码中消失了:

铁锈

// Zero size
struct Foo;

impl Foo {
    fn add_one(&self, b: i32) -> i32 {
        b + 1
    }
}

C

int Foo_add_one(int b) {
    return b + 1;
}
  

创建结构并使用其方法似乎不是很理想

在C代码中常见创建结构和使用相关方法。我会说这很可能是主要编码风格。我不知道为什么你会说它不是最理想的。


您的示例案例没有用做比较,因为您没有提供任何 C代码,更不用说等效的代码了。 ThreadRng做了很多工作,为生成随机数提供了更好的体验:

  

ThreadRng使用ReseedingRng包装与StdRng相同的PRNG,在生成32 MiB随机数据后重新播种。每个线程缓存一个实例,并且返回的ThreadRng是对此实例的引用-因此ThreadRng既不是Send也不是Sync,但是可以在单个线程中使用。根据需要,通过EntropyRng播种并重新播种该RNG。

“传统”随机数生成器(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);
}

请注意,它仍使用指向数据的指针