小编Mat*_*ahl的帖子

零成本抽象:for-loop与迭代器的性能

阅读零成本抽象并查看生锈简介:一种具有高级抽象的低级语言我试图比较两种计算向量点积的方法:一种使用for循环,一种使用迭代器.

#![feature(test)]

extern crate rand;
extern crate test;

use std::cmp::min;

fn dot_product_1(x: &[f64], y: &[f64]) -> f64 {
    let mut result: f64 = 0.0;
    for i in 0..min(x.len(), y.len()) {
        result += x[i] * y[i];
    }
    return result;
}

fn dot_product_2(x: &[f64], y: &[f64]) -> f64 {
    x.iter().zip(y).map(|(&a, &b)| a * b).sum::<f64>()
}

#[cfg(test)]
mod bench {
    use test::Bencher;
    use rand::{Rng,thread_rng};
    use super::*;

    const LEN: usize = 30;

    #[test]
    fn test_1() {
        let x = [1.0, …
Run Code Online (Sandbox Code Playgroud)

performance rust

8
推荐指数
1
解决办法
536
查看次数

使用 Tokio 期货的多播 UDP 数据包

我正在玩 Tokio 和 Rust,作为一个例子,我正在尝试编写一个简单的 UDP 代理,它只会在一个套接字上接受 UDP 数据包并将其发送到多个其他目的地。但是,我偶然发现需要将接收到的数据包发送到多个地址的情况,并且不确定如何以惯用的方式做到这一点。

我有这么远的代码:

extern crate bytes;
extern crate futures;

use std::net::SocketAddr;
use tokio::codec::BytesCodec;
use tokio::net::{UdpFramed, UdpSocket};
use tokio::prelude::*;

fn main() {
    let listen_address = "127.0.0.1:4711".parse::<SocketAddr>().unwrap();
    let forwarder = {
        let socket = UdpSocket::bind(&listen_address).unwrap();
        let peers = vec![
            "192.168.1.136:4711".parse::<SocketAddr>().unwrap(),
            "192.168.1.136:4712".parse::<SocketAddr>().unwrap(),
        ];
        UdpFramed::new(UdpSocket::bind(&listen_address).unwrap(), BytesCodec::new()).for_each(
            move |(bytes, _from)| {
                // These are the problematic lines
                for peer in peers.iter() {
                    socket.send_dgram(&bytes, &peer);
                }
                Ok(())
            },
        )
    };

    tokio::run({
        forwarder
            .map_err(|err| println!("Error: {}", err))
            .map(|_| ())
    });
} …
Run Code Online (Sandbox Code Playgroud)

sockets udp rust rust-tokio

5
推荐指数
1
解决办法
1192
查看次数

扫描仪提前终止

我正在尝试在Go中编写一个扫描器来扫描延续线,并在返回之前清理该线,以便您可以返回逻辑线.因此,给定以下SplitLine函数(Play):

func ScanLogicalLines(data []byte, atEOF bool) (int, []byte, error) {
    if atEOF && len(data) == 0 {
        return 0, nil, nil
    }

    i := bytes.IndexByte(data, '\n')
    for i > 0 && data[i-1] == '\\' {
        fmt.Printf("i: %d, data[i] = %q\n", i, data[i])
        i = i + bytes.IndexByte(data[i+1:], '\n')
    }

    var match []byte = nil
    advance := 0
    switch {
    case i >= 0:
        advance, match = i + 1, data[0:i]
    case atEOF: 
        advance, match = len(data), data
    } …
Run Code Online (Sandbox Code Playgroud)

go

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

递归宏来解析Rust中的匹配臂

我正在尝试编写一个宏来将一组规则扩展为执行令牌匹配的代码,但是在不导致宏扩展错误的情况下无法生成正确的代码.我知道我可以处理其他方式,但这里的关键问题不是如何解析令牌,而是如何编写一个可以递归扩展带有匹配臂的令牌树的宏.

我们的想法是,我们想要从字符串中读取一个令牌并将其打印出来.需要添加更多代码才能将其转换为更有用的代码,但此示例用于说明这种情况:

#[derive(Debug, PartialEq)]
enum Digit {
    One,
    Two,
    Three,
    Ten,
    Eleven,
}

#[test]
fn test1(buf: &str) {
    let buf = "111";
    let token = parse!(buf, {
        '1' => Digit::One,
        '2' => Digit::Two,
        '3' => Digit::Three,
    });
    assert_eq!(token, Some(Digit::One));
}
Run Code Online (Sandbox Code Playgroud)

我们想从这个例子中生成的代码是:

fn test1(buf: &str) {
    let token = {
        let mut chars = buf.chars().peekable();
        match chars.peek() {
            Some(&'1') => {
                chars.next().unwrap();
                Digit::One
            }
            Some(&'2') => {
                chars.next().unwrap();
                Digit::Two
            }
            Some(&'3') => {
                chars.next().unwrap();
                Digit::Three
            }
            Some(_) | None => None, …
Run Code Online (Sandbox Code Playgroud)

macros rust

2
推荐指数
1
解决办法
719
查看次数

是否有可能避免对"FnOnce"的无意义定义?

在尝试重载调用语法时,我引入了一个简单的缓存,可以缓存昂贵的计算结果.我对使用一段语法感到有点困惑.我将在问题之前逐步介绍代码.

缓存旨在使用如下:

fn fib(x: i32) -> i32 {
    if x < 2 { x } else { fib(x-1) + fib(x-2) }
}

fn main() {
    let mut cfib = Cache::new(fib);

    // Loop that repeats computation and extracts it from the cache
    // the second time.
    for x in 1..200 {
        let val = 5 * x % 40;
        println!("fibc({}) = {}", val, cfib(val));
    }
}
Run Code Online (Sandbox Code Playgroud)

我们首先使用序言来启用尚未稳定的功能:

#![feature(fn_traits, unboxed_closures)]

use std::collections::HashMap;
use std::hash::Hash;
Run Code Online (Sandbox Code Playgroud)

我们将缓存作为具有a HashMap和函数的结构引入以计算新值.

struct Cache<T, R> {
    cache: …
Run Code Online (Sandbox Code Playgroud)

overloading rust

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

标签 统计

rust ×4

go ×1

macros ×1

overloading ×1

performance ×1

rust-tokio ×1

sockets ×1

udp ×1