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

ByteBuffer: provide multi read/write int methods #1987

Merged
merged 1 commit into from
Nov 22, 2021

Conversation

weissi
Copy link
Member

@weissi weissi commented Nov 18, 2021

Motivation:

Many network protocols (especially for example NFS) have quite a number
of integer values next to each other. In NIO, you'd normally parse/write
them with multiple read/writeInteger calls.

Unfortunately, that's a bit wasteful because we're checking the bounds
as well as the CoW state every time.

Modifications:

  • Provide read/writeMultipleIntegers for up to 15 FixedWidthIntegers.
  • Benchmarks

Result:

Faster code. For 10 UInt32s, this is a 5x performance win on my machine,
see benchmarks.

@weissi weissi requested a review from Lukasa November 18, 2021 16:52
@weissi
Copy link
Member Author

weissi commented Nov 18, 2021

The generated code (10 UInt32s) looks pretty awesome, lots of vector stuff haha.

Screenshot 2021-11-18 at 4 55 39 pm

@weissi
Copy link
Member Author

weissi commented Nov 18, 2021

@swift-nio-bot perf test this please

@weissi
Copy link
Member Author

weissi commented Nov 18, 2021

@Lukasa we should probably make this @_alwaysEmitIntoClient to not incur huge code sizes because of the (unnecessary) generic impls.

@glbrntt glbrntt added the semver/minor Adds new public API. label Nov 19, 2021
Copy link
Contributor

@glbrntt glbrntt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left a couple of nits but otherwise looks good and I think this is a useful change, thanks jw!

Sources/NIOCore/ByteBuffer-multi-int.swift Outdated Show resolved Hide resolved
Sources/NIOCore/ByteBuffer-multi-int.swift Outdated Show resolved Hide resolved
@weissi
Copy link
Member Author

weissi commented Nov 19, 2021

@swift-nio-bot test perf please

@weissi
Copy link
Member Author

weissi commented Nov 19, 2021

@swift-nio-bot test perf please

@swift-server-bot
Copy link

performance report

build id: 83

timestamp: Fri Nov 19 11:01:40 UTC 2021

results

nameminmaxmeanstd
write_http_headers 0.004330054 0.00459438 0.0043682271 8.026678966830288e-05
http_headers_canonical_form 0.088902819 0.089531593 0.0891618758 0.00026802932101080196
http_headers_canonical_form_trimming_whitespace 0.168483688 0.170534029 0.1692217118 0.000511065334999746
http_headers_canonical_form_trimming_whitespace_from_short_string 0.154304751 0.154857394 0.1546703459 0.00021787190565990245
http_headers_canonical_form_trimming_whitespace_from_long_string 0.239806437 0.240556647 0.2400302902 0.00024313916966160065
bytebuffer_write_12MB_short_string_literals 0.522834001 0.52938039 0.5242767677 0.001851013711828334
bytebuffer_write_12MB_short_calculated_strings 0.52358651 0.524922439 0.5242713544 0.0005065528443560178
bytebuffer_write_12MB_medium_string_literals 0.174359745 0.177404822 0.1758037645 0.0009734078346212609
bytebuffer_write_12MB_medium_calculated_strings 0.228486401 0.231790865 0.2292688908 0.0009498588819714022
bytebuffer_write_12MB_large_calculated_strings 0.144923049 0.146462268 0.1455371293 0.0004540142066162093
bytebuffer_lots_of_rw 0.455103153 0.465588258 0.4588660129 0.003234142182348594
bytebuffer_write_http_response_ascii_only_as_string 0.041048481 0.041678352 0.041284262 0.0002232519326212231
bytebuffer_write_http_response_ascii_only_as_staticstring 0.032527615 0.033109864 0.0326859139 0.00021201277982992264
bytebuffer_write_http_response_some_nonascii_as_string 0.040460134 0.041081908 0.0406395995 0.0002082316716214842
bytebuffer_write_http_response_some_nonascii_as_staticstring 0.031779385 0.032475598 0.0319921511 0.00022657567111254582
no-net_http1_10k_reqs_1_conn 0.10969235 0.112621177 0.11073686769999999 0.0009126932594193789
http1_10k_reqs_1_conn 0.61115705 0.618380872 0.6146177371 0.002304819540728362
http1_10k_reqs_100_conns 0.60611703 0.610759884 0.6085557458 0.0012154460239762993
future_whenallsucceed_100k_immediately_succeeded_off_loop 0.078386567 0.079202914 0.0787619859 0.00029696916657998446
future_whenallsucceed_100k_immediately_succeeded_on_loop 0.078378944 0.085854079 0.0795226277 0.002255863339078709
future_whenallsucceed_100k_deferred_off_loop 0.2966325 0.356801501 0.3087382179 0.01930567793484142
future_whenallsucceed_100k_deferred_on_loop 0.135191721 0.137867458 0.1361753752 0.0007743902516077207
future_whenallcomplete_100k_immediately_succeeded_off_loop 0.036173936 0.03685639 0.036456122 0.0001740107479828646
future_whenallcomplete_100k_immediately_succeeded_on_loop 0.036056134 0.036804754 0.0362300143 0.00023086556780326235
future_whenallcomplete_100k_deferred_off_loop 0.215555215 0.221156415 0.2188871907 0.0018761624426878564
future_whenallcomplete_100k_deferred_on_loop 0.070318731 0.075397323 0.0715588531 0.0014258831100814892
future_reduce_10k_futures 0.039413036 0.04044871 0.0397580235 0.0003471629792386189
future_reduce_into_10k_futures 0.037881384 0.038941079 0.0382512432 0.00032818356078363075
channel_pipeline_1m_events 0.097160625 0.09740014 0.0972344887 8.058360450840271e-05
websocket_encode_50b_space_at_front_1m_frames_cow 0.514627103 0.515248545 0.5149232958 0.00023511342303699008
websocket_encode_50b_space_at_front_1m_frames_cow_masking 0.066253067 0.066725413 0.0664144949 0.00019987840379449178
websocket_encode_1kb_space_at_front_100k_frames_cow 0.054163966 0.054619676 0.0543210957 0.00019832371760334416
websocket_encode_50b_no_space_at_front_1m_frames_cow 0.514854995 0.515688505 0.5152382708000001 0.0002774832853736056
websocket_encode_1kb_no_space_at_front_100k_frames_cow 0.054227466 0.054655978 0.0543353555 0.00017087017730185326
websocket_encode_50b_space_at_front_10k_frames 0.006703054 0.007083275 0.006772094000000001 0.00011212239963936233
websocket_encode_50b_space_at_front_10k_frames_masking 0.081368101 0.081920535 0.0815838831 0.0002387064794551616
websocket_encode_1kb_space_at_front_1k_frames 0.000783742 0.000794531 0.0007890862 3.2666323399556953e-06
websocket_encode_50b_no_space_at_front_10k_frames 0.00668052 0.007173132 0.0067563731 0.00015016823350751197
websocket_encode_1kb_no_space_at_front_1k_frames 0.000718144 0.000725433 0.0007221797 2.256001184495373e-06
websocket_decode_125b_100k_frames 0.113367529 0.113961226 0.11368250049999999 0.0002544448423194014
websocket_decode_125b_with_a_masking_key_100k_frames 0.117549846 0.118607358 0.1182075824 0.00031626178483837666
websocket_decode_64kb_100k_frames 0.117700094 0.1181794 0.117975538 0.00021716716137881728
websocket_decode_64kb_with_a_masking_key_100k_frames 0.12186672 0.12285553 0.1224046738 0.00037222986723462945
websocket_decode_64kb_+1_100k_frames 0.117038569 0.117706554 0.11734049319999999 0.00023796761738186317
websocket_decode_64kb_+1_with_a_masking_key_100k_frames 0.121378879 0.122625316 0.12189397090000001 0.00036521648470779833
circular_buffer_into_byte_buffer_1kb 0.041366614 0.04182226 0.0414666667 0.00018702555817204911
circular_buffer_into_byte_buffer_1mb 0.082296484 0.082756008 0.0825414386 0.00020630832319085571
byte_buffer_view_iterator_1mb 0.020488812 0.020931459 0.0205488773 0.0001353289974888766
byte_to_message_decoder_decode_many_small 0.174415277 0.175422028 0.17488863810000002 0.00029500428059698306
generate_10k_random_request_keys 0.091714569 0.091952152 0.0918045424 8.690926186699795e-05
bytebuffer_rw_10_uint32s 0.313729695 0.324809296 0.3172899293 0.0033218670448922826
bytebuffer_multi_rw_10_uint32s 0.057226966 0.059060831 0.05810525800000001 0.0005500489801529809

comparison

name current previous winner diff
write_http_headers 0.004330054 0.004175102 previous 3%
http_headers_canonical_form 0.088902819 0.088059761 previous 0%
http_headers_canonical_form_trimming_whitespace 0.168483688 0.16698189 previous 0%
http_headers_canonical_form_trimming_whitespace_from_short_string 0.154304751 0.152750786 previous 1%
http_headers_canonical_form_trimming_whitespace_from_long_string 0.239806437 0.235655713 previous 1%
bytebuffer_write_12MB_short_string_literals 0.522834001 0.539448787 current -3%
bytebuffer_write_12MB_short_calculated_strings 0.52358651 0.539717126 current -2%
bytebuffer_write_12MB_medium_string_literals 0.174359745 0.18082417 current -3%
bytebuffer_write_12MB_medium_calculated_strings 0.228486401 0.228508259 current 0%
bytebuffer_write_12MB_large_calculated_strings 0.144923049 0.145885759 current 0%
bytebuffer_lots_of_rw 0.455103153 0.463096884 current -1%
bytebuffer_write_http_response_ascii_only_as_string 0.041048481 0.042932384 current -4%
bytebuffer_write_http_response_ascii_only_as_staticstring 0.032527615 0.033698394 current -3%
bytebuffer_write_http_response_some_nonascii_as_string 0.040460134 0.041556957 current -2%
bytebuffer_write_http_response_some_nonascii_as_staticstring 0.031779385 0.032677643 current -2%
no-net_http1_10k_reqs_1_conn 0.10969235 0.111062414 current -1%
http1_10k_reqs_1_conn 0.61115705 0.605744245 previous 0%
http1_10k_reqs_100_conns 0.60611703 0.597381352 previous 1%
future_whenallsucceed_100k_immediately_succeeded_off_loop 0.078386567 0.079366604 current -1%
future_whenallsucceed_100k_immediately_succeeded_on_loop 0.078378944 0.079750735 current -1%
future_whenallsucceed_100k_deferred_off_loop 0.2966325 0.288999001 previous 2%
future_whenallsucceed_100k_deferred_on_loop 0.135191721 0.135494369 current 0%
future_whenallcomplete_100k_immediately_succeeded_off_loop 0.036173936 0.037378585 current -3%
future_whenallcomplete_100k_immediately_succeeded_on_loop 0.036056134 0.037100577 current -2%
future_whenallcomplete_100k_deferred_off_loop 0.215555215 0.211372723 previous 1%
future_whenallcomplete_100k_deferred_on_loop 0.070318731 0.070480548 current 0%
future_reduce_10k_futures 0.039413036 0.039844123 current -1%
future_reduce_into_10k_futures 0.037881384 0.038831031 current -2%
channel_pipeline_1m_events 0.097160625 0.095736569 previous 1%
websocket_encode_50b_space_at_front_1m_frames_cow 0.514627103 0.515327817 current 0%
websocket_encode_50b_space_at_front_1m_frames_cow_masking 0.066253067 0.066062855 previous 0%
websocket_encode_1kb_space_at_front_100k_frames_cow 0.054163966 0.054330299 current 0%
websocket_encode_50b_no_space_at_front_1m_frames_cow 0.514854995 0.518345432 current 0%
websocket_encode_1kb_no_space_at_front_100k_frames_cow 0.054227466 0.054299883 current 0%
websocket_encode_50b_space_at_front_10k_frames 0.006703054 0.006910809 current -3%
websocket_encode_50b_space_at_front_10k_frames_masking 0.081368101 0.084560048 current -3%
websocket_encode_1kb_space_at_front_1k_frames 0.000783742 0.000802178 current -2%
websocket_encode_50b_no_space_at_front_10k_frames 0.00668052 0.006701823 current 0%
websocket_encode_1kb_no_space_at_front_1k_frames 0.000718144 0.000716887 previous 0%
websocket_decode_125b_100k_frames 0.113367529 0.115969424 current -2%
websocket_decode_125b_with_a_masking_key_100k_frames 0.117549846 0.118936777 current -1%
websocket_decode_64kb_100k_frames 0.117700094 0.120350358 current -2%
websocket_decode_64kb_with_a_masking_key_100k_frames 0.12186672 0.123842985 current -1%
websocket_decode_64kb_+1_100k_frames 0.117038569 0.11904283 current -1%
websocket_decode_64kb_+1_with_a_masking_key_100k_frames 0.121378879 0.122135949 current 0%
circular_buffer_into_byte_buffer_1kb 0.041366614 0.041226785 previous 0%
circular_buffer_into_byte_buffer_1mb 0.082296484 0.082249707 previous 0%
byte_buffer_view_iterator_1mb 0.020488812 0.020484587 previous 0%
byte_to_message_decoder_decode_many_small 0.174415277 0.177113281 current -1%
generate_10k_random_request_keys 0.091714569 0.090424123 previous 1%
bytebuffer_rw_10_uint32s 0.313729695 n/a n/a n/a%
bytebuffer_multi_rw_10_uint32s 0.057226966 n/a n/a n/a%

significant differences found

@weissi
Copy link
Member Author

weissi commented Nov 19, 2021

here's the perf proof:

Screenshot 2021-11-19 at 11 03 16 am

@swift-server-bot
Copy link

performance report

build id: 84

timestamp: Fri Nov 19 11:04:53 UTC 2021

results

nameminmaxmeanstd
write_http_headers 0.004328505 0.00435536 0.0043403375 9.395664617849635e-06
http_headers_canonical_form 0.0884335 0.088978244 0.0886680237 0.0002560964274014541
http_headers_canonical_form_trimming_whitespace 0.16848228 0.170462408 0.16907072750000002 0.0005373123356778726
http_headers_canonical_form_trimming_whitespace_from_short_string 0.15406876 0.154749575 0.154531989 0.000228182050889198
http_headers_canonical_form_trimming_whitespace_from_long_string 0.239075385 0.240106519 0.23951844630000002 0.00038534872553572724
bytebuffer_write_12MB_short_string_literals 0.521779604 0.528387305 0.5230180752 0.0020630137702789607
bytebuffer_write_12MB_short_calculated_strings 0.523303317 0.524784337 0.5239199738 0.0004637168219815266
bytebuffer_write_12MB_medium_string_literals 0.175026383 0.177075321 0.175744909 0.0005998485699413356
bytebuffer_write_12MB_medium_calculated_strings 0.228085932 0.230082752 0.2290222165 0.0006881352984949435
bytebuffer_write_12MB_large_calculated_strings 0.145149372 0.146145665 0.1455315667 0.00032406949648598353
bytebuffer_lots_of_rw 0.456126683 0.470366017 0.4596506707 0.005081874593466224
bytebuffer_write_http_response_ascii_only_as_string 0.040914405 0.041650865 0.041172348000000004 0.00024923826676451216
bytebuffer_write_http_response_ascii_only_as_staticstring 0.0326643 0.0334324 0.0329423252 0.0002066889406189358
bytebuffer_write_http_response_some_nonascii_as_string 0.040801654 0.041679788 0.0410464315 0.00027038639557790557
bytebuffer_write_http_response_some_nonascii_as_staticstring 0.032311641 0.032970905 0.0326305995 0.00023524011868219063
no-net_http1_10k_reqs_1_conn 0.110079039 0.113541394 0.11131401199999999 0.0010773535479265853
http1_10k_reqs_1_conn 0.604780079 0.608723649 0.6067380603 0.0013760592803806638
http1_10k_reqs_100_conns 0.59684099 0.600631932 0.5988161997 0.001364310491973049
future_whenallsucceed_100k_immediately_succeeded_off_loop 0.07754563 0.079337581 0.07802622570000001 0.0005155573559714129
future_whenallsucceed_100k_immediately_succeeded_on_loop 0.07741793 0.086995956 0.0791076845 0.0028752097965568913
future_whenallsucceed_100k_deferred_off_loop 0.289351722 0.296591555 0.2914770355 0.0021795224216422234
future_whenallsucceed_100k_deferred_on_loop 0.134285305 0.13811556 0.135552115 0.001111511410486939
future_whenallcomplete_100k_immediately_succeeded_off_loop 0.036161893 0.036973075 0.0364337226 0.000292790798678359
future_whenallcomplete_100k_immediately_succeeded_on_loop 0.035932722 0.037000092 0.036185979 0.0003416112596797705
future_whenallcomplete_100k_deferred_off_loop 0.212020112 0.22305205 0.21544960890000003 0.0033776206707224273
future_whenallcomplete_100k_deferred_on_loop 0.071153294 0.075556986 0.0724545258 0.0012554792244494459
future_reduce_10k_futures 0.039523995 0.040355135 0.039838983 0.0002544401492505985
future_reduce_into_10k_futures 0.037722014 0.040840884 0.0385987044 0.0010717578893471341
channel_pipeline_1m_events 0.097149846 0.097273685 0.0972130303 4.7486149924769796e-05
websocket_encode_50b_space_at_front_1m_frames_cow 0.520405467 0.52804037 0.5230352274000001 0.002147887288883267
websocket_encode_50b_space_at_front_1m_frames_cow_masking 0.065879426 0.066340401 0.0660736918 0.0002165318879096856
websocket_encode_1kb_space_at_front_100k_frames_cow 0.054726762 0.05517691 0.054884339299999994 0.00019505003253356547
websocket_encode_50b_no_space_at_front_1m_frames_cow 0.521200372 0.527432748 0.5239881936999999 0.0017740299187765673
websocket_encode_1kb_no_space_at_front_100k_frames_cow 0.055107203 0.055561862 0.0552547688 0.00019733945333798086
websocket_encode_50b_space_at_front_10k_frames 0.006738534 0.007124163 0.0068242066 0.00012574978829600042
websocket_encode_50b_space_at_front_10k_frames_masking 0.081621776 0.082354019 0.08200490540000001 0.000262985136901605
websocket_encode_1kb_space_at_front_1k_frames 0.000780965 0.000792456 0.0007855663 3.1227202546640118e-06
websocket_encode_50b_no_space_at_front_10k_frames 0.006841602 0.006853794 0.0068468643 4.889266294649925e-06
websocket_encode_1kb_no_space_at_front_1k_frames 0.000714856 0.000720547 0.0007190075 2.00903195317767e-06
websocket_decode_125b_100k_frames 0.115822169 0.11648851 0.11608826409999999 0.00023292896753419263
websocket_decode_125b_with_a_masking_key_100k_frames 0.118678475 0.119512368 0.11909086259999999 0.0002799439720750468
websocket_decode_64kb_100k_frames 0.119813742 0.120763794 0.1202945932 0.0003081928285652768
websocket_decode_64kb_with_a_masking_key_100k_frames 0.122751736 0.1234883 0.1231371037 0.00026420726893610784
websocket_decode_64kb_+1_100k_frames 0.119006376 0.11971143 0.1193653877 0.0002857993670283188
websocket_decode_64kb_+1_with_a_masking_key_100k_frames 0.121916435 0.122497482 0.12220091390000001 0.0002305845182513598
circular_buffer_into_byte_buffer_1kb 0.041330402 0.041782809 0.0414432284 0.00017798218729923952
circular_buffer_into_byte_buffer_1mb 0.082304794 0.082830774 0.0825381263 0.00023761515027691794
byte_buffer_view_iterator_1mb 0.020484608 0.020920599 0.0205501098 0.00013165051300216576
byte_to_message_decoder_decode_many_small 0.17443269 0.175039096 0.1748750185 0.00022781348173950757
generate_10k_random_request_keys 0.090338636 0.091868463 0.0912780853 0.0006525504951041547
bytebuffer_rw_10_uint32s 0.314545377 0.31862103 0.3157021686 0.0012090212193638567
bytebuffer_multi_rw_10_uint32s 0.057329431 0.059118265 0.058030593799999995 0.000593226973962618

comparison

name current previous winner diff
write_http_headers 0.004328505 0.004175102 previous 3%
http_headers_canonical_form 0.0884335 0.088059761 previous 0%
http_headers_canonical_form_trimming_whitespace 0.16848228 0.16698189 previous 0%
http_headers_canonical_form_trimming_whitespace_from_short_string 0.15406876 0.152750786 previous 0%
http_headers_canonical_form_trimming_whitespace_from_long_string 0.239075385 0.235655713 previous 1%
bytebuffer_write_12MB_short_string_literals 0.521779604 0.539448787 current -3%
bytebuffer_write_12MB_short_calculated_strings 0.523303317 0.539717126 current -3%
bytebuffer_write_12MB_medium_string_literals 0.175026383 0.18082417 current -3%
bytebuffer_write_12MB_medium_calculated_strings 0.228085932 0.228508259 current 0%
bytebuffer_write_12MB_large_calculated_strings 0.145149372 0.145885759 current 0%
bytebuffer_lots_of_rw 0.456126683 0.463096884 current -1%
bytebuffer_write_http_response_ascii_only_as_string 0.040914405 0.042932384 current -4%
bytebuffer_write_http_response_ascii_only_as_staticstring 0.0326643 0.033698394 current -3%
bytebuffer_write_http_response_some_nonascii_as_string 0.040801654 0.041556957 current -1%
bytebuffer_write_http_response_some_nonascii_as_staticstring 0.032311641 0.032677643 current -1%
no-net_http1_10k_reqs_1_conn 0.110079039 0.111062414 current 0%
http1_10k_reqs_1_conn 0.604780079 0.605744245 current 0%
http1_10k_reqs_100_conns 0.59684099 0.597381352 current 0%
future_whenallsucceed_100k_immediately_succeeded_off_loop 0.07754563 0.079366604 current -2%
future_whenallsucceed_100k_immediately_succeeded_on_loop 0.07741793 0.079750735 current -2%
future_whenallsucceed_100k_deferred_off_loop 0.289351722 0.288999001 previous 0%
future_whenallsucceed_100k_deferred_on_loop 0.134285305 0.135494369 current 0%
future_whenallcomplete_100k_immediately_succeeded_off_loop 0.036161893 0.037378585 current -3%
future_whenallcomplete_100k_immediately_succeeded_on_loop 0.035932722 0.037100577 current -3%
future_whenallcomplete_100k_deferred_off_loop 0.212020112 0.211372723 previous 0%
future_whenallcomplete_100k_deferred_on_loop 0.071153294 0.070480548 previous 0%
future_reduce_10k_futures 0.039523995 0.039844123 current 0%
future_reduce_into_10k_futures 0.037722014 0.038831031 current -2%
channel_pipeline_1m_events 0.097149846 0.095736569 previous 1%
websocket_encode_50b_space_at_front_1m_frames_cow 0.520405467 0.515327817 previous 0%
websocket_encode_50b_space_at_front_1m_frames_cow_masking 0.065879426 0.066062855 current 0%
websocket_encode_1kb_space_at_front_100k_frames_cow 0.054726762 0.054330299 previous 0%
websocket_encode_50b_no_space_at_front_1m_frames_cow 0.521200372 0.518345432 previous 0%
websocket_encode_1kb_no_space_at_front_100k_frames_cow 0.055107203 0.054299883 previous 1%
websocket_encode_50b_space_at_front_10k_frames 0.006738534 0.006910809 current -2%
websocket_encode_50b_space_at_front_10k_frames_masking 0.081621776 0.084560048 current -3%
websocket_encode_1kb_space_at_front_1k_frames 0.000780965 0.000802178 current -2%
websocket_encode_50b_no_space_at_front_10k_frames 0.006841602 0.006701823 previous 2%
websocket_encode_1kb_no_space_at_front_1k_frames 0.000714856 0.000716887 current 0%
websocket_decode_125b_100k_frames 0.115822169 0.115969424 current 0%
websocket_decode_125b_with_a_masking_key_100k_frames 0.118678475 0.118936777 current 0%
websocket_decode_64kb_100k_frames 0.119813742 0.120350358 current 0%
websocket_decode_64kb_with_a_masking_key_100k_frames 0.122751736 0.123842985 current 0%
websocket_decode_64kb_+1_100k_frames 0.119006376 0.11904283 current 0%
websocket_decode_64kb_+1_with_a_masking_key_100k_frames 0.121916435 0.122135949 current 0%
circular_buffer_into_byte_buffer_1kb 0.041330402 0.041226785 previous 0%
circular_buffer_into_byte_buffer_1mb 0.082304794 0.082249707 previous 0%
byte_buffer_view_iterator_1mb 0.020484608 0.020484587 previous 0%
byte_to_message_decoder_decode_many_small 0.17443269 0.177113281 current -1%
generate_10k_random_request_keys 0.090338636 0.090424123 current 0%
bytebuffer_rw_10_uint32s 0.314545377 n/a n/a n/a%
bytebuffer_multi_rw_10_uint32s 0.057329431 n/a n/a n/a%

significant differences found

@fabianfett
Copy link
Member

Nice, this will unlock some nice perf gains in postgres :)

Copy link
Contributor

@Lukasa Lukasa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM except for a minor nit around the asserts.

dev/generate-bytebuffer-multi-int.sh Outdated Show resolved Hide resolved
Motivation:

Many network protocols (especially for example NFS) have quite a number
of integer values next to each other. In NIO, you'd normally parse/write
them with multiple read/writeInteger calls.

Unfortunately, that's a bit wasteful because we're checking the bounds
as well as the CoW state every time.

Modifications:

- Provide read/writeMultipleIntegers for up to 15 FixedWidthIntegers.
- Benchmarks

Result:

Faster code. For 10 UInt32s, this is a 5x performance win on my machine,
see benchmarks.
Copy link
Member

@dnadoba dnadoba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. A good example for what we might use TypeSequences aka Variadic Generics if we get the same performance out of it. Maybe worth posting this use case on the pitch thread.

@weissi
Copy link
Member Author

weissi commented Nov 22, 2021

LGTM. A good example for what we might use TypeSequences aka Variadic Generics if we get the same performance out of it. Maybe worth posting this use case on the pitch thread.

We could, however the variadics would only really if the types are all the same. Ie (UInt32, UInt32, UInt32, ...) and not mixed like supported by this patch (eg. (UInt32, UInt16, UInt64, ...))

@Lukasa Lukasa merged commit b262990 into apple:main Nov 22, 2021
@fabianfett
Copy link
Member

fabianfett commented Nov 22, 2021

@weissi Not sure I can follow you here, the pitch for TypeSequences contains this code example:

func debugPrint<T...>(_ items: T...) 
  where T: CustomDebugStringConvertible
{   
  for (item: T) in items {
    stdout.write(item.debugDescription)
  }
}

If I read this correctly, the new script generated code could be implemented as this, couldn't it?

func readMultipleIntegers<T...>(endianness: Endianness = .big, as types: T.Type...) 
  where T: FixedWidthInteger
{   
  // implementation
}

@weissi
Copy link
Member Author

weissi commented Nov 22, 2021

@weissi Not sure I can follow you here, the pitch for TypeSequences contains this code example:

func debugPrint<T...>(_ items: T...) 

Thank you! yes, I missed the ellipsis in the generic arguments. That's cool if this would be supported, very nice!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
semver/minor Adds new public API.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants