Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

algorithm improvement #29

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

vbs100
Copy link

@vbs100 vbs100 commented Jun 11, 2020

Hi @wahern ,
recently I am learning your timeout module and found some problems, such as some slot will be check twice during carry, bit operation has redundancy, so i made some optimization based on your code. hash optimized method is more consistent with the description in your mentioned paper, These are the main changes:

  • optimize timeout_wheel hash function.
  • optimize timeout_slot hash function, unify operation for all wheels.
  • simplify timeout_update function bit manipulation

At the same time, the performance is also improved, in "Time spent expiring timeouts" the new algorithm for the first 400,000 timeout significantly better than the legacy algorithm.

legacy.png
new.png

@vbs100 vbs100 force-pushed the algorithm-improvement branch from a868d6a to 2af7852 Compare June 11, 2020 13:46
@lpereira
Copy link

These are nice improvements! However, I ported over your changes to my fork of the library, and it doesn't seem to work as expected: timeouts aren't expiring when they're supposed to.

I haven't investigated yet what is the cause, but in my program, I usually have a timeout of 1000 units, and the library would tell me I'd have to wait in fractions of that value until that expires (e.g. 800, 150, 49, and 1); with these changes, it tells me values way above 1000 (e.g. 3500) before expiring.

@vbs100
Copy link
Author

vbs100 commented Jun 15, 2020

hi lpereira,
Thanks for your verification
you might have called this function timeouts_timeout to get the timeout, but it seems returns a longer timeout than the real one. You can call timeouts_check to check if timeouts_timeout return the correct value, otherwise there will be an error print.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants