Git Product home page Git Product logo

Comments (7)

erikdubbelboer avatar erikdubbelboer commented on June 2, 2024

Are we talking about a server handler or a client response?

from fasthttp.

Jille avatar Jille commented on June 2, 2024

Server handler

Groetjes,

from fasthttp.

pisken avatar pisken commented on June 2, 2024

I think this is good feature, for some server applications that handle large of requests and the buffer was cached, using SetBodyRaw to get high performance but currently, will unsafe release the buffer.
Quick to workaround push the buffer that need release into batcher and process in the after.

If support callback or closer interface,... when write the response body completed get will helpful in this case.

from fasthttp.

Jille avatar Jille commented on June 2, 2024

I've looked at the code for a bit and I think that my use-case is satisfied by using SetBodyStream() and passing an io.Closer, which gets called when I can free my underlying data.
As far as I can see (by reading the source) both cause exactly one copy when my data gets copied into the writeBuffer to be sent to the client.

Would that work for you too @pisken?

from fasthttp.

pisken avatar pisken commented on June 2, 2024

I see SetBodyStream not resolve for large of requests when data body available (caching), and SetBodyRaw can resolve for this case.
In this case large of request and data body response was cached, I need write body direct to connection client, no copy to other buffer to keep low memory and cpu used.

from fasthttp.

Jille avatar Jille commented on June 2, 2024

AAUI it actually copies in exactly the same scenarios.

There is always a *bufio.Writer (managed by a sync.Pool): https://github.com/valyala/fasthttp/blob/master/server.go#L2407 So during the writing of the request, that memory is allocated.

Write gets that *bufio.Writer which already has the headers written to it.
bodyBytes returns the []byte that you passed to SetBodyRaw, and then writes it to the *bufio.Writer. Unless 1) the *bufio.Writer is empty, and 2) your []byte is larger than its size, it'll copy the data.

You can ensure the buffer is empty by setting ImmediateHeaderFlush on the response, but that's at the cost of an extra syscall (for non-HTTPS), which might or might not be more expensive than copying the bytes.

For SetBodyStream (assuming you've set the contentLength), you'll end up in writeBodyStream here which will call io.CopyBuffer(), which will call YourBodyStream.WriteTo, which can do a single large write, just like the SetBodyRaw case.

from fasthttp.

erikdubbelboer avatar erikdubbelboer commented on June 2, 2024

Sounds like a good idea, a pull request is welcome!

from fasthttp.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.