Skip to content

Commit

Permalink
perf: remove unnecessary allocation when writing http dates (#3261)
Browse files Browse the repository at this point in the history
  • Loading branch information
robjtede committed Feb 7, 2024
1 parent 7e4e12b commit 1e2ef6f
Show file tree
Hide file tree
Showing 29 changed files with 75 additions and 61 deletions.
14 changes: 5 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
- { name: macOS, os: macos-latest, triple: x86_64-apple-darwin }
- { name: Windows, os: windows-latest, triple: x86_64-pc-windows-msvc }
version:
- { name: msrv, version: 1.68.0 }
- { name: msrv, version: 1.70.0 }
- { name: stable, version: stable }

name: ${{ matrix.target.name }} / ${{ matrix.version.name }}
Expand Down Expand Up @@ -54,14 +54,10 @@ jobs:
with:
tool: cargo-hack,cargo-ci-cache-clean

- name: workaround MSRV issues
if: matrix.version.name == 'msrv'
run: |
cargo update -p=ciborium --precise=0.2.1
cargo update -p=ciborium-ll --precise=0.2.1
cargo update -p=clap --precise=4.3.24
cargo update -p=clap_lex --precise=0.5.0
cargo update -p=anstyle --precise=1.0.2
# - name: workaround MSRV issues
# if: matrix.version.name == 'msrv'
# run: |
# cargo update -p=anstyle --precise=1.0.2

- name: check minimal
run: cargo ci-check-min
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ members = [
[workspace.package]
license = "MIT OR Apache-2.0"
edition = "2021"
rust-version = "1.68"
rust-version = "1.70"

[profile.dev]
# Disabling debug info speeds up builds a bunch and we don't rely on it for debugging that much.
Expand Down
2 changes: 2 additions & 0 deletions actix-files/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 0.6.5

- Fix handling of special characters in filenames.
Expand Down
2 changes: 1 addition & 1 deletion actix-files/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![crates.io](https://img.shields.io/crates/v/actix-files?label=latest)](https://crates.io/crates/actix-files)
[![Documentation](https://docs.rs/actix-files/badge.svg?version=0.6.5)](https://docs.rs/actix-files/0.6.5)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![License](https://img.shields.io/crates/l/actix-files.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-files/0.6.5/status.svg)](https://deps.rs/crate/actix-files/0.6.5)
Expand Down
2 changes: 2 additions & 0 deletions actix-http-test/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 3.2.0

- Minimum supported Rust version (MSRV) is now 1.68 due to transitive `time` dependency.
Expand Down
7 changes: 1 addition & 6 deletions actix-http-test/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,11 @@

[![crates.io](https://img.shields.io/crates/v/actix-http-test?label=latest)](https://crates.io/crates/actix-http-test)
[![Documentation](https://docs.rs/actix-http-test/badge.svg?version=3.2.0)](https://docs.rs/actix-http-test/3.2.0)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http-test)
<br>
[![Dependency Status](https://deps.rs/crate/actix-http-test/3.2.0/status.svg)](https://deps.rs/crate/actix-http-test/3.2.0)
[![Download](https://img.shields.io/crates/d/actix-http-test.svg)](https://crates.io/crates/actix-http-test)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

<!-- prettier-ignore-end -->

## Documentation & Resources

- [API Documentation](https://docs.rs/actix-http-test)
- Minimum Supported Rust Version (MSRV): 1.68
4 changes: 4 additions & 0 deletions actix-http/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

### Changed

- Minimum supported Rust version (MSRV) is now 1.70.

## 3.6.0

### Added
Expand Down
5 changes: 5 additions & 0 deletions actix-http/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ actix-web = "4"

async-stream = "0.3"
criterion = { version = "0.5", features = ["html_reports"] }
divan = "0.1.8"
env_logger = "0.10"
futures-util = { version = "0.3.17", default-features = false, features = ["alloc"] }
memchr = "2.4"
Expand Down Expand Up @@ -153,3 +154,7 @@ required-features = ["http2", "rustls-0_22"]
name = "response-body-compression"
harness = false
required-features = ["compress-brotli", "compress-gzip", "compress-zstd"]

[[bench]]
name = "date-formatting"
harness = false
7 changes: 1 addition & 6 deletions actix-http/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

[![crates.io](https://img.shields.io/crates/v/actix-http?label=latest)](https://crates.io/crates/actix-http)
[![Documentation](https://docs.rs/actix-http/badge.svg?version=3.6.0)](https://docs.rs/actix-http/3.6.0)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-http.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-http/3.6.0/status.svg)](https://deps.rs/crate/actix-http/3.6.0)
Expand All @@ -15,11 +15,6 @@

<!-- prettier-ignore-end -->

## Documentation & Resources

- [API Documentation](https://docs.rs/actix-http)
- Minimum Supported Rust Version (MSRV): 1.68

## Examples

```rust
Expand Down
20 changes: 20 additions & 0 deletions actix-http/benches/date-formatting.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use std::time::SystemTime;

use actix_http::header::HttpDate;
use divan::{black_box, AllocProfiler, Bencher};

#[global_allocator]
static ALLOC: AllocProfiler = AllocProfiler::system();

#[divan::bench]
fn date_formatting(b: Bencher<'_, '_>) {
let now = SystemTime::now();

b.bench(|| {
black_box(HttpDate::from(black_box(now)).to_string());
})
}

fn main() {
divan::main();
}
2 changes: 1 addition & 1 deletion actix-http/src/date.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ impl Date {

fn update(&mut self) {
self.pos = 0;
write!(self, "{}", httpdate::fmt_http_date(SystemTime::now())).unwrap();
write!(self, "{}", httpdate::HttpDate::from(SystemTime::now())).unwrap();
}
}

Expand Down
5 changes: 2 additions & 3 deletions actix-http/src/header/shared/http_date.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ impl FromStr for HttpDate {

impl fmt::Display for HttpDate {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let date_str = httpdate::fmt_http_date(self.0);
f.write_str(&date_str)
httpdate::HttpDate::from(self.0).fmt(f)
}
}

Expand All @@ -37,7 +36,7 @@ impl TryIntoHeaderValue for HttpDate {
let mut wrt = MutWriter(&mut buf);

// unwrap: date output is known to be well formed and of known length
write!(wrt, "{}", httpdate::fmt_http_date(self.0)).unwrap();
write!(wrt, "{}", self).unwrap();

HeaderValue::from_maybe_shared(buf.split().freeze())
}
Expand Down
2 changes: 2 additions & 0 deletions actix-multipart-derive/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 0.6.1

- Update `syn` dependency to `2`.
Expand Down
7 changes: 1 addition & 6 deletions actix-multipart-derive/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,11 @@

[![crates.io](https://img.shields.io/crates/v/actix-multipart-derive?label=latest)](https://crates.io/crates/actix-multipart-derive)
[![Documentation](https://docs.rs/actix-multipart-derive/badge.svg?version=0.6.1)](https://docs.rs/actix-multipart-derive/0.6.1)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-multipart-derive.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-multipart-derive/0.6.1/status.svg)](https://deps.rs/crate/actix-multipart-derive/0.6.1)
[![Download](https://img.shields.io/crates/d/actix-multipart-derive.svg)](https://crates.io/crates/actix-multipart-derive)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

<!-- prettier-ignore-end -->

## Documentation & Resources

- [API Documentation](https://docs.rs/actix-multipart-derive)
- Minimum Supported Rust Version (MSRV): 1.68
2 changes: 1 addition & 1 deletion actix-multipart-derive/tests/trybuild.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#[rustversion::stable(1.68)] // MSRV
#[rustversion::stable(1.70)] // MSRV
#[test]
fn compile_macros() {
let t = trybuild::TestCases::new();
Expand Down
2 changes: 2 additions & 0 deletions actix-multipart/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 0.6.1

- Minimum supported Rust version (MSRV) is now 1.68 due to transitive `time` dependency.
Expand Down
7 changes: 1 addition & 6 deletions actix-multipart/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,11 @@

[![crates.io](https://img.shields.io/crates/v/actix-multipart?label=latest)](https://crates.io/crates/actix-multipart)
[![Documentation](https://docs.rs/actix-multipart/badge.svg?version=0.6.1)](https://docs.rs/actix-multipart/0.6.1)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-multipart.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-multipart/0.6.1/status.svg)](https://deps.rs/crate/actix-multipart/0.6.1)
[![Download](https://img.shields.io/crates/d/actix-multipart.svg)](https://crates.io/crates/actix-multipart)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

<!-- prettier-ignore-end -->

## Documentation & Resources

- [API Documentation](https://docs.rs/actix-multipart)
- Minimum Supported Rust Version (MSRV): 1.68
2 changes: 2 additions & 0 deletions actix-router/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 0.5.2

- Minimum supported Rust version (MSRV) is now 1.68 due to transitive `time` dependency.
Expand Down
2 changes: 1 addition & 1 deletion actix-router/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

[![crates.io](https://img.shields.io/crates/v/actix-router?label=latest)](https://crates.io/crates/actix-router)
[![Documentation](https://docs.rs/actix-router/badge.svg?version=0.5.2)](https://docs.rs/actix-router/0.5.2)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-router.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-router/0.5.2/status.svg)](https://deps.rs/crate/actix-router/0.5.2)
Expand Down
2 changes: 2 additions & 0 deletions actix-test/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 0.1.3

- Add `TestServerConfig::rustls_0_22()` method for Rustls v0.22 support behind new `rustls-0_22` crate feature.
Expand Down
2 changes: 2 additions & 0 deletions actix-web-actors/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 4.3.0

- Minimum supported Rust version (MSRV) is now 1.68 due to transitive `time` dependency.
Expand Down
7 changes: 1 addition & 6 deletions actix-web-actors/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,11 @@

[![crates.io](https://img.shields.io/crates/v/actix-web-actors?label=latest)](https://crates.io/crates/actix-web-actors)
[![Documentation](https://docs.rs/actix-web-actors/badge.svg?version=4.3.0)](https://docs.rs/actix-web-actors/4.3.0)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![License](https://img.shields.io/crates/l/actix-web-actors.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-web-actors/4.3.0/status.svg)](https://deps.rs/crate/actix-web-actors/4.3.0)
[![Download](https://img.shields.io/crates/d/actix-web-actors.svg)](https://crates.io/crates/actix-web-actors)
[![Chat on Discord](https://img.shields.io/discord/771444961383153695?label=chat&logo=discord)](https://discord.gg/NWpN5mmg3x)

<!-- prettier-ignore-end -->

## Documentation & Resources

- [API Documentation](https://docs.rs/actix-web-actors)
- Minimum Supported Rust Version (MSRV): 1.68
2 changes: 2 additions & 0 deletions actix-web-codegen/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 4.2.2

- Fix regression when declaring `wrap` attribute using an expression.
Expand Down
7 changes: 1 addition & 6 deletions actix-web-codegen/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

[![crates.io](https://img.shields.io/crates/v/actix-web-codegen?label=latest)](https://crates.io/crates/actix-web-codegen)
[![Documentation](https://docs.rs/actix-web-codegen/badge.svg?version=4.2.2)](https://docs.rs/actix-web-codegen/4.2.2)
![Version](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![Version](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![License](https://img.shields.io/crates/l/actix-web-codegen.svg)
<br />
[![dependency status](https://deps.rs/crate/actix-web-codegen/4.2.2/status.svg)](https://deps.rs/crate/actix-web-codegen/4.2.2)
Expand All @@ -15,11 +15,6 @@

<!-- prettier-ignore-end -->

## Documentation & Resources

- [API Documentation](https://docs.rs/actix-web-codegen)
- Minimum Supported Rust Version (MSRV): 1.68

## Compile Testing

Uses the [`trybuild`] crate. All compile fail tests should include a stderr file generated by `trybuild`. See the [workflow section](https://github.com/dtolnay/trybuild#workflow) of the trybuild docs for info on how to do this.
Expand Down
2 changes: 1 addition & 1 deletion actix-web-codegen/tests/trybuild.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#[rustversion::stable(1.68)] // MSRV
#[rustversion::stable(1.70)] // MSRV
#[test]
fn compile_macros() {
let t = trybuild::TestCases::new();
Expand Down
4 changes: 4 additions & 0 deletions actix-web/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

## Unreleased

### Changed

- Minimum supported Rust version (MSRV) is now 1.70.

## 4.5.1

### Fixed
Expand Down
4 changes: 2 additions & 2 deletions actix-web/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

[![crates.io](https://img.shields.io/crates/v/actix-web?label=latest)](https://crates.io/crates/actix-web)
[![Documentation](https://docs.rs/actix-web/badge.svg?version=4.5.1)](https://docs.rs/actix-web/4.5.1)
![MSRV](https://img.shields.io/badge/rustc-1.68+-ab6000.svg)
![MSRV](https://img.shields.io/badge/rustc-1.70+-ab6000.svg)
![MIT or Apache 2.0 licensed](https://img.shields.io/crates/l/actix-web.svg)
[![Dependency Status](https://deps.rs/crate/actix-web/4.5.1/status.svg)](https://deps.rs/crate/actix-web/4.5.1)
<br />
Expand Down Expand Up @@ -37,7 +37,7 @@
- SSL support using OpenSSL or Rustls
- Middlewares ([Logger, Session, CORS, etc](https://actix.rs/docs/middleware/))
- Integrates with the [`awc` HTTP client](https://docs.rs/awc/)
- Runs on stable Rust 1.68+
- Runs on stable Rust 1.70+

## Documentation

Expand Down
2 changes: 2 additions & 0 deletions awc/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Minimum supported Rust version (MSRV) is now 1.70.

## 3.4.0

- Add `rustls-0_22-webpki-roots` and `rustls-0_22-native-roots` crate feature.
Expand Down
8 changes: 3 additions & 5 deletions awc/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,11 @@

<!-- prettier-ignore-end -->

## Documentation & Resources
## Examples

- [API Documentation](https://docs.rs/awc)
- [Example Project](https://github.com/actix/examples/tree/master/https-tls/awc-https)
- Minimum Supported Rust Version (MSRV): 1.68
[Example project using TLS-enabled client →](https://github.com/actix/examples/tree/master/https-tls/awc-https)

## Example
Basic usage:

```rust
use actix_rt::System;
Expand Down

0 comments on commit 1e2ef6f

Please sign in to comment.