Skip to content

io::Read / io::Write fns can cause a lot of allocations via io::Error::new #36658

Closed
@carllerche

Description

@carllerche
Member

io::Error::new will always allocate. This isn't a huge deal when the error represents an actual error case, however I/O "errors" are used often to signal termination in hot paths and the allocation can cause significant bottleneck.

One example is with non-blocking I/O, io::ErrorKind::WouldBlock is used to signal that the source is not read to process the op. Suffering an allocation for this very common case is not acceptable.

To work around this, Mio provide a helper to construct a WouldBlock error without the allocation: https://github.com/carllerche/mio/blob/master/src/io.rs#L40-L49.

However, WouldBlock is not the only case. Another common case that I am hitting is using io::ErrorKind::WriteZero being triggered when calling write_all to io::Write implementations that are backed by memory (vs. an I/O type).

In general, there should be a way to construct I/O errors without allocating.

/cc @alexcrichton

Activity

added
I-slowIssue: Problems and improvements with respect to performance of generated code.
on Sep 22, 2016
arthurprs

arthurprs commented on Sep 24, 2016

@arthurprs
Contributor

One option on top of my head is to provide a from_kind that constructs an opaque-ish error with that kind, otherwise there's always from_raw_os_error

added a commit that references this issue on Nov 4, 2016

Auto merge of #37037 - Mark-Simulacrum:stack-error, r=alexcrichton

d2bc30b
Mark-Simulacrum

Mark-Simulacrum commented on Nov 4, 2016

@Mark-Simulacrum
Member

@carllerche Do you (or others) know if std::io should now be examined for instances where Error::new is used in non-optimal ways?

carllerche

carllerche commented on Nov 10, 2016

@carllerche
MemberAuthor

I haven't looked much in std. I mostly needed this for mio (https://github.com/carllerche/mio)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    I-slowIssue: Problems and improvements with respect to performance of generated code.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @carllerche@arthurprs@bluss@Mark-Simulacrum

      Issue actions

        io::Read / io::Write fns can cause a lot of allocations via io::Error::new · Issue #36658 · rust-lang/rust