小编poi*_*idl的帖子

Vec和盒装切片的性能比较

我想要一个功能

  • 在堆上分配一个基本的可变长度"数组"(在一般意义上的单词,不一定是Rust类型)浮点数
  • 用值初始化它
  • 实现Drop,所以我不必担心释放内存
  • 实现索引或迭代的东西

显而易见的选择是Vec,但它与堆上的盒装切片相比如何?Vec更强大,但我需要数组数学,在我的情况下,不需要像push/pop这样的东西.我们的想法是拥有功能较少但速度更快的东西.

下面我有两个版本的"linspace"函数(la Matlab和numpy),

  1. "linspace_vec"(见下面的清单)使用 Vec
  2. "linspace_boxed_slice"(参见下面的清单)使用盒装切片

两者都用得像

let y = linspace_*(start, stop, len);
Run Code Online (Sandbox Code Playgroud)

其中y是长度为线性间隔的"阵列"(即Vec(1)中的(1)和(2)中的盒装切片)len.

对于长度为1000的小"阵列",(1)更快.对于长度为4*10 ^ 6的大型阵列,(1)为SLOWER.这是为什么?我在(2)做错了吗?

当参数len= 1000时,仅通过调用函数进行基准测试就会产生

  • (1) ... bench: 879 ns/iter (+/- 12)
  • (2) ... bench: 1,295 ns/iter (+/- 38)

当参数len= 4000000时,基准测试结果为

  • (1) ... bench: 5,802,836 ns/iter (+/- 90,209)
  • (2) ... bench: 4,767,234 ns/iter (+/- 121,596)

(1)的清单:

pub fn linspace_vec<'a, T: 'a>(start: T, stop: T, len: …
Run Code Online (Sandbox Code Playgroud)

performance rust

12
推荐指数
1
解决办法
6132
查看次数

带有C字符串的静态结构,用于lv2插件

我正在尝试学习Rust(低级编程中的新手),并希望将一个小的lv2放大器(音频)插件"amp.c"(C代码)从C转换为Rust.我实际上让它工作(这里),但是当主机终止时,valgrind说"1个块中的64个字节肯定会丢失".我想我知道为什么会这样,但我不知道如何解决它.

在你厌倦阅读之前,这是最后一个问题:

如何静态分配包含C字符串的结构?

以下是介绍:

为什么会发生(我认为): 主机加载库并调用lv2_descriptor()

const LV2_Descriptor*
lv2_descriptor()
{
    return &descriptor;
}
Run Code Online (Sandbox Code Playgroud)

它返回一个指向STATICALLY分配的LV2_Descriptor类型结构的指针,

static const LV2_Descriptor descriptor = {
    AMP_URI,
    ...
};
Run Code Online (Sandbox Code Playgroud)

被定义为

typedef struct _LV2_Descriptor {
    const char * URI;
    ...
} LV2_Descriptor;
Run Code Online (Sandbox Code Playgroud)

为什么静态分配?在amp.c中它说:

最好静态定义描述符,以避免泄漏内存和非可移植共享库构造函数和析构函数以正确清理.

但是,我将lv2_descriptor()翻译为Rust:

#[no_mangle]
pub extern fn lv2_descriptor(index:i32) -> *const LV2Descriptor {
     let s = "http://example.org/eg-amp_rust";
     let cstr = CString::new(s).unwrap();
     let ptr = cstr.as_ptr();
     mem::forget(cstr);

     let mybox = Box::new(LV2Descriptor{amp_uri: ptr}, ...);
     let bxptr = &*mybox as *const LV2Descriptor; 
     mem::forget(mybox);
     return  bxptr …
Run Code Online (Sandbox Code Playgroud)

audio static rust

6
推荐指数
1
解决办法
149
查看次数

Jack音频客户端名称超过4个字符会破坏客户端

尝试使用Rust(文档)中的JACK-AUDIO-CONNECTION-KIT ,我遇到了调用问题

jack_client_t* jack_client_open (   const char *    client_name,
                                    jack_options_t  options,
                                    jack_status_t *     status,
                                    ... )   
Run Code Online (Sandbox Code Playgroud)

在Rust我用

#[link(name = "jack")]
extern "C" {
    pub fn jack_client_open(name: *const libc::c_char,
                        options: JackOptions,
                        status: &JackStatus)
                        -> *mut JackClientT;
}
Run Code Online (Sandbox Code Playgroud)

(完整代码)

当我使用name带有四个字符时,它可以工作,例如

let name = CString::new("yass").unwrap().as_ptr();
Run Code Online (Sandbox Code Playgroud)

但如果我使用5个或更多字符,它就不起作用.在上面链接的JACK文档中,它表示名称最多可以是int jack_client_name_size()字符长,在我的情况下是64.为什么会这样?

ffi jack rust

4
推荐指数
1
解决办法
75
查看次数

标签 统计

rust ×3

audio ×1

ffi ×1

jack ×1

performance ×1

static ×1