GithubHelp home page GithubHelp logo

Comments (5)

jzelinskie avatar jzelinskie commented on June 17, 2024

We've known about this for since roughly around the time chihaya/bencode#2 was posted.

Bencode is performance-critical to the HTTP frontend, so I'm hesitant to add the sort unless you know of broken clients/behavior that are caused by the nondeterminism. This focus on performance and cutting out unnecessary functionality is why we use our own bencode implementation.

from chihaya.

cypheon avatar cypheon commented on June 17, 2024

Hi, thanks for the quick response! It's good to hear you're aware of the issue, unfortunately it did not turn up in my quick search.

I initially noticed this, because BitTornado (the Python library) was crashing/throwing exceptions regarding invalid bencoded data, so there's at least one client having trouble with keys not being in-order.

I honestly didn't really consider performance while writing the fix, since most (all) of the dicts in often-occurring messages (i.e. responses to announce messages) only have in the order of magnitude about 4 or 5 keys (interval, min_interval, peers). But then again, I didn't do any benchmarks, so it's just a hunch.

All in all, I think complying to the spec is in itself valuable. If this impacts performance too much, maybe the interface could be switched from a "Dict" to a slice of (Key, Value) tuples? That would move the responsibility of sorting the keys to the part of code where the response is generated. Of course that would require a much bigger change in the code.

from chihaya.

pushrax avatar pushrax commented on June 17, 2024

There are some cases where the dict can potentially be very large

filesDict := bencode.NewDict()
for _, scrape := range resp.Files {
filesDict[string(scrape.InfoHash[:])] = bencode.Dict{
"complete": scrape.Complete,
"incomplete": scrape.Incomplete,
}
}
return bencode.NewEncoder(w).Encode(bencode.Dict{
"files": filesDict,
})
}

I agree that the best way would be to construct the dicts in order, to avoid creating another copy of keys and sorting later. However, I also agree that in practise it's probably not much of a problem to just do the sort when marshalling. A benchmark would definitely be the important deciding factor here.

from chihaya.

Aranjedeath avatar Aranjedeath commented on June 17, 2024

I am running this patch in production and we will see if there is some performance issue with this or not.

from chihaya.

Aranjedeath avatar Aranjedeath commented on June 17, 2024

Performance of this patch is not making me scream, so if it is unoptimized... the optimized solution will be fine.

from chihaya.

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.