Comments (6)
I doubt this was a problem with Duration. After looking at the code it uses f64 in the buf vector instead of Durations. Duration supports addition and there is no need to convert to f64 before summing it up.
Floats are imprecise by construction. The time API works on nanoseconds internally and so should we. conversion to f64 should be the last step.
from indicatif.
Perhaps I've made a mistake by suggesting a solution in the issue's title instead of just describing it.
After looking at the code it uses f64 in the buf vector instead of Durations. Duration supports addition and there is no need to convert to f64 before summing it up.
I think storing actual durations as Duration
would be perfectly fine. It's different here though — what we store here is not a duration, but rather speed^−1 — duration divided by number of steps. So the loss of precision happens anyway, in the moment of division itself and by rounding the time_per_step
to nanoseconds. And exactly this rounding to nanoseconds makes the indicatif unusable with transfer rates of the order of GB/s.
By the way, f64
is able to store a number of nanoseconds losslessly up to about 7 months (and µs to about 500 years), so I wouldn't worry too much about the loss of precision.
from indicatif.
I mean why store the result of a lossy calculation instead of both values for each step. Then sum the components separately and divide afterwards.
Although I'm wondering why its not just using 0.9*last + 0.1*current
for estimating instead of this buffer construction.
from indicatif.
Encountered this issue also. The nanosecond precision used by Duration
is really not enough when dealing with time per step calculations. Rates of >1e9/s can be relatively easy to achieve when dealing with things like reading bytes from modern SSDs. Using f64
specifically to compute Estimate::time_per_step()
is quite reasonable, as it is not dealing with precise durations.
from indicatif.
I'm happy to review a PR for this.
from indicatif.
Incoming!
from indicatif.
Related Issues (20)
- Width-filling progress bars wrap around on >1 character wide emojis HOT 3
- indicatif crashes with assertion failed: self.orphan_lines_count <= self.lines.len() if number of terminal columns is less than 135 HOT 11
- Finished progress bars are not preserved in `MultiProgress::println` HOT 6
- `{msg}` `.set_message(Cow<'static, str>)` design unnecessarily requires allocation HOT 3
- Question: How to get latest progress bar state string HOT 3
- Git repo is missing tag for v0.17.7 HOT 1
- Add gifs/videos in readme for each example HOT 1
- Hidden as an attribute on Style not ProgressBar HOT 3
- Use with Zenity HOT 7
- Intermittent `style::tests::wide_element_style` failure HOT 2
- ‘percent_precise’ do not work HOT 4
- examples/fastbar.rs rendering is different on Windows git-bash than CMD or PowerShell HOT 3
- [Meta] missing release entries for 0.17.6 and up HOT 3
- MultiProgress falls apart if the number of ProgressBars excedes the number of lines in a terminal HOT 1
- Feature Req.: Human readable `per_sec` rate HOT 3
- Using ⚙️ emoji in ProgressBar spinner message causes unnessecary line breaks HOT 23
- How do I get the progress bar to align under my design? HOT 1
- MultiProgress second ProgressBar extremely delayed HOT 3
- Stacked progress bar HOT 2
- Adding/removing progress bar spinners leaves newlines HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from indicatif.