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

HTTP Header Creation Performance #10

Open
nemasu opened this issue Feb 6, 2014 · 11 comments
Open

HTTP Header Creation Performance #10

nemasu opened this issue Feb 6, 2014 · 11 comments

Comments

@nemasu
Copy link
Owner

nemasu commented Feb 6, 2014

Need to improve performance of header creation.

Make a concat function that takes in an offset of destination string.

This way it wont need to calculate the length every time it adds a header.

It returns the new length already, so we can easily keep track of the length as creation happens.

@triforce
Copy link
Contributor

triforce commented Oct 5, 2016

Is this still applicable? If so whereabouts does it calculate the length?

@nemasu
Copy link
Owner Author

nemasu commented Oct 5, 2016

Ah yeah I think so.
Basically any function in string.asm that calls get_string_length at the beginning can probably be done away with if the length is passed as a parameter. I'm pretty sure it's still possible to do it this way, and would speed it up a bit.

@triforce
Copy link
Contributor

Is there something we can use to test the performance increase / benefit?

@nemasu
Copy link
Owner Author

nemasu commented Oct 12, 2016

Could do some math and calculate how many instructions you would save given an average string length or something...but the performance increase would be minimal, just trying to save some useless cycles.

@scher200
Copy link

scher200 commented May 29, 2017

Did some ab testing:

asmttpd

Document Length:        100996 bytes

Concurrency Level:      10
Time taken for tests:   0.013 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      10110700 bytes
HTML transferred:       10099600 bytes
Requests per second:    7738.74 [#/sec] (mean)
Time per request:       1.292 [ms] (mean)
Time per request:       0.129 [ms] (mean, across all concurrent requests)
Transfer rate:          764102.34 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       1
Processing:     0    1   0.6      1       3
Waiting:        0    0   0.4      0       2
Total:          0    1   0.8      1       4

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      3
  95%      3
  98%      4
  99%      4
 100%      4 (longest request)

nginx

Document Length:        100996 bytes

Concurrency Level:      10
Time taken for tests:   0.038 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      10123400 bytes
HTML transferred:       10099600 bytes
Requests per second:    2605.18 [#/sec] (mean)
Time per request:       3.839 [ms] (mean)
Time per request:       0.384 [ms] (mean, across all concurrent requests)
Transfer rate:          257551.98 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       1
Processing:     1    3   1.5      3       9
Waiting:        1    3   1.3      3       8
Total:          1    4   1.5      4       9

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      5
  80%      5
  90%      6
  95%      6
  98%      8
  99%      9
 100%      9 (longest request)

But got disappointed after testing the same website in the browser. I saw firefox load asmttpd in 17 seconds vs nginx with 5 seconds.
I think we need some really awesome tricks to make it win.

@triforce
Copy link
Contributor

Thanks for those stats - very interesting!

@nemasu
Copy link
Owner Author

nemasu commented May 30, 2017

Interesting! I think it would need to use asynchronous i/o (epoll) to compete with things like nginx. I have an old issue [ #9 ] for it, but it's a ton of work.

@triforce
Copy link
Contributor

I am very slowly working on this ;)

@scher200
Copy link

awesome you work on it anyway, I thought maybe we can use some other asm multi-tasking example. But did not find any.

@triforce
Copy link
Contributor

triforce commented Oct 19, 2017

The only way I can figure out to improve the concat function is to add two new concat functions, one for when you have a dest length already (removes need to use get_string_length at beginning), the other for when you have the src length (removing need to calculate the string length obviously). In httpd.asm we would make use of the server_header_len, content_length_len etc.

Each new function would only use get_string_length once instead of twice compared to the regular concat. I might be missing something really obvious here so please tell me if I am!

The method I described above would save 1 call to get_string_length in the add_content_type_header, 3-4 on average in each create_httpXXX_response.

Thoughts @nemasu?

@nemasu
Copy link
Owner Author

nemasu commented Oct 31, 2017

@triforce Yeah, I believe that's what I had in mind, string_concat doesn't need to calculate the length of the string if we pass the length as a parameter.

Might even be able to get rid of the last get_string_length in the create_httpxxx_repsonse functions too if we're keeping a running total.

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

No branches or pull requests

3 participants