ChaosBot avatar

【Rust日报】 2019-09-03

blackanger

Published: 06 Sept 2019 › Updated: 06 Sept 2019

【Rust日报】 2019-09-03

Rocket和Actix-Web的异步性能测试

Rust目前最火的两个web框架就是Actix-Web和Rocket, 众所周知,Rocket的优势在于易用性,Actix-web在于性能,最近,Rocket的人员正在迁移到异步后端。因此,作者想看看异步分支和主分支如何的性能如何同时和Actix-Web进行比较是很有趣的。

测试使用的项目

用Rocket编写的hello world应用程序

#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;

#[get("/")]
fn index() -> String {
    "Hello, world!".to_string()
}

fn main() {
    rocket::ignite().mount("/", routes![index]).launch();
}

Cargo.toml的差异(同步和异步)

[dependencies]
rocket = { git = "https://github.com/SergioBenitez/Rocket.git", branch = "async" }

同步

[dependencies]
rocket = { git = "https://github.com/SergioBenitez/Rocket.git", branch = "master" }

下面的程序用于测试Actix-Web

use actix_web::{web, App, HttpServer, Responder};

fn index() -> impl Responder {
    "Hello, World".to_string()
}

fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(web::resource("/").to(index)))
        .bind("127.0.0.1:8000")?
        .run()
}

我还引入了Wrap

use warp::{self, path, Filter};

fn main() {
    let hello = path!("hello")
        .map(|| "Hello, world!");

    warp::serve(hello)
        .run(([127, 0, 0, 1], 8000));
}

结果

我运行了二个应用程序使用了 cargo run --release 并用了wrk -t20 -c1000 -d30s http://localhost:8000

Rocket 同步

Running 30s test @ http://localhost:8000
  20 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     7.14ms   61.41ms   1.66s    97.97%
    Req/Sec     5.15k     1.45k   14.87k    74.03%
  3076813 requests in 30.10s, 428.40MB read
Requests/sec: 102230.30
Transfer/sec:     14.23MB

Rocket 异步

Running 30s test @ http://localhost:8000
  20 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     4.34ms    3.06ms 211.14ms   79.00%
    Req/Sec    11.15k     1.81k   34.11k    79.08%
  6669116 requests in 30.10s, 0.91GB read
Requests/sec: 221568.27
Transfer/sec:     31.06MB

Actix-Web

Running 30s test @ http://localhost:8000
  20 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     3.82ms    5.58ms 249.57ms   86.55%
    Req/Sec    24.09k     5.27k   69.99k    72.52%
  14385279 requests in 30.10s, 1.71GB read
Requests/sec: 477955.05
Transfer/sec:     58.34MB

Warp

  20 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     4.23ms    8.50ms 428.96ms   93.33%
    Req/Sec    20.38k     6.09k   76.63k    74.57%
  12156483 requests in 30.10s, 1.47GB read
Requests/sec: 403896.10
Transfer/sec:     50.07MB

结论

虽然async Rocket的性能仍然不如Actix-Web,但是async极大地提高了它的性能。

我非常希望看到Rocket的性能提高到这样的程度:作为一名开发人员,从此就不需要在易用性和性能之间做出选择。

rustversion - 根据rustc编译器版本进行条件编译

这个类库提供了宏的扩展,能够根据rustc编译器版本进行条件编译的宏。

使用案例

#[rustversion::since(1.33)]
use std::pin::Pin;

#[rustversion::since(1.33)]
impl<P: MyTrait> MyTrait for Pin<P> {
    /* ... */
}


#[rustversion::attr(before(1.33), repr(packed))]
#[rustversion::attr(since(1.33), repr(packed(2)))]
struct Six(i16, i32);

fn main() {
    println!("{}", std::mem::align_of::<Six>());
}

更多信息可以前往GitHub了解一哈

mobi-rs - 用于解析和操作.mobi格式的Rust库

一个用rust编写的从.mobi格式电子书中提取数据的库

使用案例

访问基本信息

use mobi::Mobi;
fn main() {
    let m = Mobi::init(Path::new("/home/wojtek/Downloads/lotr.mobi")).unwrap();
    let title = m.title().unwrap();
    let author = m.author().unwrap();
    let publisher = m.publisher().unwrap();
    let desc = m.description().unwrap();
    let isbn = m.isbn().unwrap();
    let pub_date = m.publish_date().unwrap();
    let contributor = m.contributor().unwrap();
    println!("{}\n{}\n{}\n{}\n{}\n{}\n{}\n", title, author, publisher, isbn, pub_date, desc, contributor);
    // Access Headers
    let header = m.header; // Normal Header
    let pdheader = m.palmdoc; // PalmDOC Header
    let mheader = m.mobi; // MOBI Header
    let exth = m.exth // Extra Header
}

输出

The Fellowship of the Ring
J. R. R. Tolkien
Houghton Mifflin
9780618574940
2005-07-15T07:00:00+00:00
SUMMARY: For over fifty years, J.R.R.............
calibre (0.7.23) [http://calibre-ebook.com]

更多信息可以前往GitHub了解一哈

persy - 用Rust编写的简单事务性存储引擎

Persy是一个用rust编写的事务性存储引擎。

示例

use persy::{Persy,Config};
//...
Persy::create("./open.persy")?;
let persy = Persy::open("./open.persy",Config::new())?;
let mut tx = persy.begin()?;
persy.create_segment(&mut tx, "seg")?;
let data = vec![1;20];
persy.insert_record(&mut tx, "seg", &data)?;
let prepared = persy.prepare_commit(tx)?;
persy.commit(prepared)?;
for (_id, content) in persy.scan("seg")? {
    assert_eq!(content[0], 20);
    //....
}

更多信息可以前往GitLab了解一哈


From 日报小组 月泉

日报订阅地址:

独立日报订阅地址:

社区学习交流平台订阅:

Leave 【Rust日报】 2019-09-03 to:

Written by

Read more #rust posts


Best Posts From ChaosBot

We have not curated any of blackanger's posts yet. But you can encourage our curation team to review posts by visiting them regularly and by referring other readers. Because we give priority to frequently read content.

More Posts From ChaosBot