-
Notifications
You must be signed in to change notification settings - Fork 195
Wasm runtime: make resuming continuations more efficient #1892
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
Conversation
@OlivierNicole, Would you be able to review this PR ? |
I used the deep_state benchmarks and show the following improvement compile the bench with:
before:
after:
stack switching is however very slow
|
Yes, that's expected. It goes through the JavaScript event loop for each stack switch. |
Should the doc/readme say something about this ? |
We have this at the moment: js_of_ocaml/manual/wasm_overview.wiki Line 56 in 55c6228
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I didn't review the wat diff but the CI is happy. @vouillon, I'll let you decide whether to merge now or wait for more review
I am swamped for now, but maybe I can start on Friday. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From a high level point of view, I’m not sure to understand why this change affects %perform
and %reperform
, while ocaml/ocaml#12735 only affected %resume
. There was also code shared between perform and reperform (in line with the native and bytecode backends) that this PR seems to remove, and I’m not sure to understand why.
I’m happy to review this PR but I reiterate that to do that I would need a high-level description of the change, otherwise I don’t have enough context, and figuring it out by myself is going to take forever. Visibly ocaml/ocaml#12735 is not the whole story. |
You can have a look at #1765 and #1891. We have some changes to make in perform/reperform since we were storing the fibers in reversed order in the continuation. They were already stored in the right order in the OCaml runtime. Also, we need to store the tail of the stack in the continuation. Separating perform and reperform also allows some simplifications regarding unhandled effects: for perform, we can just raise the exception right away, and for reperform, we can resume the continuation with an exception. One no longer needs to put a default handler at the top of the current stack. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, this looks good to me.
Do we have an effects benchmark to assess the impact of this PR?
|
Oh, sorry, I had scanned through this message but for some reason thought it was on the other PR (the Javascript runtime one). |
This was done in #1765 for the JavaScript runtime. See corresponding OCaml PR ocaml/ocaml#12735
CHANGES: ## Features/Changes * Misc: drop support for OCaml 4.12 and bellow * Misc: switch to dune.3.19 * Misc: initial support for ocaml 5.4 (ocsigen/js_of_ocaml#2030, ocsigen/js_of_ocaml#2058) * Compiler: support for OCaml 4.14.3+trunk (ocsigen/js_of_ocaml#1844) * Compiler: add the `--empty-sourcemap` flag * Compiler: improve debug/sourcemap location of closures (ocsigen/js_of_ocaml#1947) * Compiler: optimize compilation of switches (ocsigen/js_of_ocaml#1921, ocsigen/js_of_ocaml#2057) * Compiler: evaluate statically more primitives (ocsigen/js_of_ocaml#1912, ocsigen/js_of_ocaml#1915, ocsigen/js_of_ocaml#1965, ocsigen/js_of_ocaml#1969) * Compiler: rewrote inlining pass (ocsigen/js_of_ocaml#1935, ocsigen/js_of_ocaml#2018, ocsigen/js_of_ocaml#2027) * Compiler: improve tailcall optimization (ocsigen/js_of_ocaml#1943) * Compiler: improve deadcode optimization (ocsigen/js_of_ocaml#1963, ocsigen/js_of_ocaml#1962, ocsigen/js_of_ocaml#1967) * Compiler: deadcode elimination of cyclic values (ocsigen/js_of_ocaml#1978) * Compiler: remove empty blocks (ocsigen/js_of_ocaml#1934) * Compiler: improve coloring optimization (ocsigen/js_of_ocaml#1971, ocsigen/js_of_ocaml#1984, ocsigen/js_of_ocaml#1986, ocsigen/js_of_ocaml#1989) * Compiler: faster constant sharing (ocsigen/js_of_ocaml#1988) * Compiler: faster js code generation (ocsigen/js_of_ocaml#1985) * Compiler: improve performance of Javascript linking * Compiler: more efficient code generation from bytecode (ocsigen/js_of_ocaml#1972) * Compiler: faster compilation by improving the scheduling of optimization passes (ocsigen/js_of_ocaml#1962, ocsigen/js_of_ocaml#2001, ocsigen/js_of_ocaml#2012, ocsigen/js_of_ocaml#2027) * Compiler: faster compilation by stopping sooner when optimizations become unproductive (ocsigen/js_of_ocaml#1939) * Compiler: Propagate arity between compilation units (ocsigen/js_of_ocaml#1594) * Compiler: Add flags to enable/disable warnings (ocsigen/js_of_ocaml#2052) * Compiler/wasm: directly write Wasm binary modules (ocsigen/js_of_ocaml#2000, ocsigen/js_of_ocaml#2003) * Compiler/wasm: faster wat output (ocsigen/js_of_ocaml#1992) * Compiler/wasm: use a Wasm text files preprocessor (ocsigen/js_of_ocaml#1822) * Compiler/wasm: optimize integer operations (ocsigen/js_of_ocaml#2032) * Compiler/wasm: use type analysis to remove some unnecessary uses of JavasScript strict equality (ocsigen/js_of_ocaml#2040) * Compiler/wasm: use more precise environment types (ocsigen/js_of_ocaml#2041) * Compiler/wasm: optimize calls to statically known function (ocsigen/js_of_ocaml#2044) * Runtime: use es6 class (ocsigen/js_of_ocaml#1840) * Runtime: support more Unix functions (ocsigen/js_of_ocaml#1829) * Runtime: remove polyfill for Map to simplify MlObjectTable implementation (ocsigen/js_of_ocaml#1846) * Runtime: refactor caml_xmlhttprequest_create implementation (ocsigen/js_of_ocaml#1846) * Runtime: update constant imports to use `node:fs` module (ocsigen/js_of_ocaml#1850) * Runtime: make Obj.dup work with floats and boxed numbers (ocsigen/js_of_ocaml#1871) * Runtime: delete BigStringReader, one should use UInt8ArrayReader instead * Runtime: less conversion during un-marshalling (ocsigen/js_of_ocaml#1889) * Runtime: use TextEncoder/TextDecoder for utf8-utf16 conversions * Runtime: use Dataview to convert between floats and bit representation * Runtime: optimize Str.search_forward/search_backward (ocsigen/js_of_ocaml#2056) * Runtime: deprecate caml_ba_create_from (ocsigen/js_of_ocaml#2056) * Runtime: check for unused variable in the runtime (ocsigen/js_of_ocaml#2056) * Runtime/wasm: implement BLAKE2b primitives for Wasm (ocsigen/js_of_ocaml#1873) * Runtime/wasm: support jsoo_env and keep track of backtrace status (ocsigen/js_of_ocaml#1881) * Runtime/wasm: support unmarshaling compressed data (ocsigen/js_of_ocaml#1898) * Runtime/wasm: make resuming a continuation more efficient in Wasm (ocsigen/js_of_ocaml#1892) * Runtime/wasm: use imported string constants for JavaScript strings (ocsigen/js_of_ocaml#2022) * Runtime/wasm: use DataView primitives to implement bigarrays (ocsigen/js_of_ocaml#1979) * Ppx: explicitly disallow polymorphic method (ocsigen/js_of_ocaml#1897) * Ppx: allow "function" in object literals (ocsigen/js_of_ocaml#1897) * Lib: add Dom_html.window.matchMedia & Dom_html.mediaQueryList (ocsigen/js_of_ocaml#2017) * Lib: make the Wasm version of Json.output work with native ints and JavaScript objects (ocsigen/js_of_ocaml#1872) ## Bug fixes * Compiler: fix stack overflow issues with double translation (ocsigen/js_of_ocaml#1869) * Compiler: minifier fix (ocsigen/js_of_ocaml#1867) * Compiler: fix shortvar with --enable es6 (AssignTarget was not properly handled) * Compiler: fix assert failure with double translation (ocsigen/js_of_ocaml#1870) * Compiler: fix path rewriting of Wasm source maps (ocsigen/js_of_ocaml#1882) * Compiler: fix global dead code in presence of dead tailcall (ocsigen/js_of_ocaml#2010) * Compiler/wasm: fix bound check for empty float array (ocsigen/js_of_ocaml#1904) * Runtime: fix path normalization (ocsigen/js_of_ocaml#1848) * Runtime: fix reading from the pseudo-filesystem (ocsigen/js_of_ocaml#1859) * Runtime: fix initialization of standard streams under Windows (ocsigen/js_of_ocaml#1849) * Runtime: fix Int64.of_string overflow check (ocsigen/js_of_ocaml#1874) * Runtime: fix caml_string_concat when not using JS strings (ocsigen/js_of_ocaml#1874) * Runtime: consistent bigarray hashing across all architectures (ocsigen/js_of_ocaml#1977) * Runtime: fix caml_utf8_of_utf16 bug in high surrogate case (ocsigen/js_of_ocaml#2008) * Runtime: fix method lookup (ocsigen/js_of_ocaml#2034, ocsigen/js_of_ocaml#2038, ocsigen/js_of_ocaml#2039) * Lib: fix Dom_html.Keyboard_code.of_event (ocsigen/js_of_ocaml#1878) * Tools: fix jsoo_mktop and jsoo_mkcmis (ocsigen/js_of_ocaml#1877) * Toplevel: fix for when use-js-strings is disabled (ocsigen/js_of_ocaml#1997)
CHANGES: ## Features/Changes * Misc: drop support for OCaml 4.12 and bellow * Misc: switch to dune.3.19 * Misc: initial support for ocaml 5.4 (ocsigen/js_of_ocaml#2030, ocsigen/js_of_ocaml#2058) * Compiler: support for OCaml 4.14.3+trunk (ocsigen/js_of_ocaml#1844) * Compiler: add the `--empty-sourcemap` flag * Compiler: improve debug/sourcemap location of closures (ocsigen/js_of_ocaml#1947) * Compiler: optimize compilation of switches (ocsigen/js_of_ocaml#1921, ocsigen/js_of_ocaml#2057) * Compiler: evaluate statically more primitives (ocsigen/js_of_ocaml#1912, ocsigen/js_of_ocaml#1915, ocsigen/js_of_ocaml#1965, ocsigen/js_of_ocaml#1969) * Compiler: rewrote inlining pass (ocsigen/js_of_ocaml#1935, ocsigen/js_of_ocaml#2018, ocsigen/js_of_ocaml#2027) * Compiler: improve tailcall optimization (ocsigen/js_of_ocaml#1943) * Compiler: improve deadcode optimization (ocsigen/js_of_ocaml#1963, ocsigen/js_of_ocaml#1962, ocsigen/js_of_ocaml#1967) * Compiler: deadcode elimination of cyclic values (ocsigen/js_of_ocaml#1978) * Compiler: remove empty blocks (ocsigen/js_of_ocaml#1934) * Compiler: improve coloring optimization (ocsigen/js_of_ocaml#1971, ocsigen/js_of_ocaml#1984, ocsigen/js_of_ocaml#1986, ocsigen/js_of_ocaml#1989) * Compiler: faster constant sharing (ocsigen/js_of_ocaml#1988) * Compiler: faster js code generation (ocsigen/js_of_ocaml#1985, ocsigen/js_of_ocaml#2066) * Compiler: improve performance of Javascript linking * Compiler: more efficient code generation from bytecode (ocsigen/js_of_ocaml#1972) * Compiler: faster compilation by improving the scheduling of optimization passes (ocsigen/js_of_ocaml#1962, ocsigen/js_of_ocaml#2001, ocsigen/js_of_ocaml#2012, ocsigen/js_of_ocaml#2027) * Compiler: faster compilation by stopping sooner when optimizations become unproductive (ocsigen/js_of_ocaml#1939) * Compiler: Propagate arity between compilation units (ocsigen/js_of_ocaml#1594) * Compiler: Add flags to enable/disable warnings (ocsigen/js_of_ocaml#2052) * Compiler/wasm: directly write Wasm binary modules (ocsigen/js_of_ocaml#2000, ocsigen/js_of_ocaml#2003) * Compiler/wasm: faster wat output (ocsigen/js_of_ocaml#1992) * Compiler/wasm: use a Wasm text files preprocessor (ocsigen/js_of_ocaml#1822) * Compiler/wasm: optimize integer operations (ocsigen/js_of_ocaml#2032) * Compiler/wasm: use type analysis to remove some unnecessary uses of JavasScript strict equality (ocsigen/js_of_ocaml#2040) * Compiler/wasm: use more precise environment types (ocsigen/js_of_ocaml#2041) * Compiler/wasm: optimize calls to statically known function (ocsigen/js_of_ocaml#2044) * Runtime: use es6 class (ocsigen/js_of_ocaml#1840) * Runtime: support more Unix functions (ocsigen/js_of_ocaml#1829) * Runtime: remove polyfill for Map to simplify MlObjectTable implementation (ocsigen/js_of_ocaml#1846) * Runtime: refactor caml_xmlhttprequest_create implementation (ocsigen/js_of_ocaml#1846) * Runtime: update constant imports to use `node:fs` module (ocsigen/js_of_ocaml#1850) * Runtime: make Obj.dup work with floats and boxed numbers (ocsigen/js_of_ocaml#1871) * Runtime: delete BigStringReader, one should use UInt8ArrayReader instead * Runtime: less conversion during un-marshalling (ocsigen/js_of_ocaml#1889) * Runtime: use TextEncoder/TextDecoder for utf8-utf16 conversions * Runtime: use Dataview to convert between floats and bit representation * Runtime: optimize Str.search_forward/search_backward (ocsigen/js_of_ocaml#2056) * Runtime: deprecate caml_ba_create_from (ocsigen/js_of_ocaml#2056) * Runtime: check for unused variable in the runtime (ocsigen/js_of_ocaml#2056) * Runtime/wasm: implement BLAKE2b primitives for Wasm (ocsigen/js_of_ocaml#1873) * Runtime/wasm: support jsoo_env and keep track of backtrace status (ocsigen/js_of_ocaml#1881) * Runtime/wasm: support unmarshaling compressed data (ocsigen/js_of_ocaml#1898) * Runtime/wasm: make resuming a continuation more efficient in Wasm (ocsigen/js_of_ocaml#1892) * Runtime/wasm: use imported string constants for JavaScript strings (ocsigen/js_of_ocaml#2022) * Runtime/wasm: use DataView primitives to implement bigarrays (ocsigen/js_of_ocaml#1979) * Ppx: explicitly disallow polymorphic method (ocsigen/js_of_ocaml#1897) * Ppx: allow "function" in object literals (ocsigen/js_of_ocaml#1897) * Lib: add Dom_html.window.matchMedia & Dom_html.mediaQueryList (ocsigen/js_of_ocaml#2017) * Lib: make the Wasm version of Json.output work with native ints and JavaScript objects (ocsigen/js_of_ocaml#1872) ## Bug fixes * Compiler: fix stack overflow issues with double translation (ocsigen/js_of_ocaml#1869) * Compiler: minifier fix (ocsigen/js_of_ocaml#1867) * Compiler: fix shortvar with --enable es6 (AssignTarget was not properly handled) * Compiler: fix assert failure with double translation (ocsigen/js_of_ocaml#1870) * Compiler: fix path rewriting of Wasm source maps (ocsigen/js_of_ocaml#1882) * Compiler: fix global dead code in presence of dead tailcall (ocsigen/js_of_ocaml#2010) * Compiler/wasm: fix bound check for empty float array (ocsigen/js_of_ocaml#1904) * Runtime: fix path normalization (ocsigen/js_of_ocaml#1848) * Runtime: fix reading from the pseudo-filesystem (ocsigen/js_of_ocaml#1859) * Runtime: fix initialization of standard streams under Windows (ocsigen/js_of_ocaml#1849) * Runtime: fix Int64.of_string overflow check (ocsigen/js_of_ocaml#1874) * Runtime: fix caml_string_concat when not using JS strings (ocsigen/js_of_ocaml#1874) * Runtime: consistent bigarray hashing across all architectures (ocsigen/js_of_ocaml#1977) * Runtime: fix caml_utf8_of_utf16 bug in high surrogate case (ocsigen/js_of_ocaml#2008) * Runtime: fix method lookup (ocsigen/js_of_ocaml#2034, ocsigen/js_of_ocaml#2038, ocsigen/js_of_ocaml#2039) * Lib: fix Dom_html.Keyboard_code.of_event (ocsigen/js_of_ocaml#1878) * Tools: fix jsoo_mktop and jsoo_mkcmis (ocsigen/js_of_ocaml#1877) * Toplevel: fix for when use-js-strings is disabled (ocsigen/js_of_ocaml#1997)
CHANGES: ## Features/Changes * Misc: drop support for OCaml 4.12 and bellow * Misc: switch to dune.3.19 * Misc: initial support for ocaml 5.4 (ocsigen/js_of_ocaml#2030, ocsigen/js_of_ocaml#2058) * Compiler: support for OCaml 4.14.3+trunk (ocsigen/js_of_ocaml#1844) * Compiler: add the `--empty-sourcemap` flag * Compiler: improve debug/sourcemap location of closures (ocsigen/js_of_ocaml#1947) * Compiler: optimize compilation of switches (ocsigen/js_of_ocaml#1921, ocsigen/js_of_ocaml#2057) * Compiler: evaluate statically more primitives (ocsigen/js_of_ocaml#1912, ocsigen/js_of_ocaml#1915, ocsigen/js_of_ocaml#1965, ocsigen/js_of_ocaml#1969) * Compiler: rewrote inlining pass (ocsigen/js_of_ocaml#1935, ocsigen/js_of_ocaml#2018, ocsigen/js_of_ocaml#2027) * Compiler: improve tailcall optimization (ocsigen/js_of_ocaml#1943) * Compiler: improve deadcode optimization (ocsigen/js_of_ocaml#1963, ocsigen/js_of_ocaml#1962, ocsigen/js_of_ocaml#1967) * Compiler: deadcode elimination of cyclic values (ocsigen/js_of_ocaml#1978) * Compiler: remove empty blocks (ocsigen/js_of_ocaml#1934) * Compiler: improve coloring optimization (ocsigen/js_of_ocaml#1971, ocsigen/js_of_ocaml#1984, ocsigen/js_of_ocaml#1986, ocsigen/js_of_ocaml#1989) * Compiler: faster constant sharing (ocsigen/js_of_ocaml#1988) * Compiler: faster js code generation (ocsigen/js_of_ocaml#1985, ocsigen/js_of_ocaml#2066) * Compiler: improve performance of Javascript linking * Compiler: more efficient code generation from bytecode (ocsigen/js_of_ocaml#1972) * Compiler: faster compilation by improving the scheduling of optimization passes (ocsigen/js_of_ocaml#1962, ocsigen/js_of_ocaml#2001, ocsigen/js_of_ocaml#2012, ocsigen/js_of_ocaml#2027) * Compiler: faster compilation by stopping sooner when optimizations become unproductive (ocsigen/js_of_ocaml#1939) * Compiler: Propagate arity between compilation units (ocsigen/js_of_ocaml#1594) * Compiler: Add flags to enable/disable warnings (ocsigen/js_of_ocaml#2052) * Compiler/wasm: directly write Wasm binary modules (ocsigen/js_of_ocaml#2000, ocsigen/js_of_ocaml#2003) * Compiler/wasm: faster wat output (ocsigen/js_of_ocaml#1992) * Compiler/wasm: use a Wasm text files preprocessor (ocsigen/js_of_ocaml#1822) * Compiler/wasm: optimize integer operations (ocsigen/js_of_ocaml#2032) * Compiler/wasm: use type analysis to remove some unnecessary uses of JavasScript strict equality (ocsigen/js_of_ocaml#2040) * Compiler/wasm: use more precise environment types (ocsigen/js_of_ocaml#2041) * Compiler/wasm: optimize calls to statically known function (ocsigen/js_of_ocaml#2044) * Runtime: use es6 class (ocsigen/js_of_ocaml#1840) * Runtime: support more Unix functions (ocsigen/js_of_ocaml#1829) * Runtime: remove polyfill for Map to simplify MlObjectTable implementation (ocsigen/js_of_ocaml#1846) * Runtime: refactor caml_xmlhttprequest_create implementation (ocsigen/js_of_ocaml#1846) * Runtime: update constant imports to use `node:fs` module (ocsigen/js_of_ocaml#1850) * Runtime: make Obj.dup work with floats and boxed numbers (ocsigen/js_of_ocaml#1871) * Runtime: delete BigStringReader, one should use UInt8ArrayReader instead * Runtime: less conversion during un-marshalling (ocsigen/js_of_ocaml#1889) * Runtime: use TextEncoder/TextDecoder for utf8-utf16 conversions * Runtime: use Dataview to convert between floats and bit representation * Runtime: optimize Str.search_forward/search_backward (ocsigen/js_of_ocaml#2056) * Runtime: deprecate caml_ba_create_from (ocsigen/js_of_ocaml#2056) * Runtime: check for unused variable in the runtime (ocsigen/js_of_ocaml#2056) * Runtime/wasm: implement BLAKE2b primitives for Wasm (ocsigen/js_of_ocaml#1873) * Runtime/wasm: support jsoo_env and keep track of backtrace status (ocsigen/js_of_ocaml#1881) * Runtime/wasm: support unmarshaling compressed data (ocsigen/js_of_ocaml#1898) * Runtime/wasm: make resuming a continuation more efficient in Wasm (ocsigen/js_of_ocaml#1892) * Runtime/wasm: use imported string constants for JavaScript strings (ocsigen/js_of_ocaml#2022) * Runtime/wasm: use DataView primitives to implement bigarrays (ocsigen/js_of_ocaml#1979) * Ppx: explicitly disallow polymorphic method (ocsigen/js_of_ocaml#1897) * Ppx: allow "function" in object literals (ocsigen/js_of_ocaml#1897) * Lib: add Dom_html.window.matchMedia & Dom_html.mediaQueryList (ocsigen/js_of_ocaml#2017) * Lib: make the Wasm version of Json.output work with native ints and JavaScript objects (ocsigen/js_of_ocaml#1872) ## Bug fixes * Compiler: fix stack overflow issues with double translation (ocsigen/js_of_ocaml#1869) * Compiler: minifier fix (ocsigen/js_of_ocaml#1867) * Compiler: fix shortvar with --enable es6 (AssignTarget was not properly handled) * Compiler: fix assert failure with double translation (ocsigen/js_of_ocaml#1870) * Compiler: fix path rewriting of Wasm source maps (ocsigen/js_of_ocaml#1882) * Compiler: fix global dead code in presence of dead tailcall (ocsigen/js_of_ocaml#2010) * Compiler/wasm: fix bound check for empty float array (ocsigen/js_of_ocaml#1904) * Runtime: fix path normalization (ocsigen/js_of_ocaml#1848) * Runtime: fix reading from the pseudo-filesystem (ocsigen/js_of_ocaml#1859) * Runtime: fix initialization of standard streams under Windows (ocsigen/js_of_ocaml#1849) * Runtime: fix Int64.of_string overflow check (ocsigen/js_of_ocaml#1874) * Runtime: fix caml_string_concat when not using JS strings (ocsigen/js_of_ocaml#1874) * Runtime: consistent bigarray hashing across all architectures (ocsigen/js_of_ocaml#1977) * Runtime: fix caml_utf8_of_utf16 bug in high surrogate case (ocsigen/js_of_ocaml#2008) * Runtime: fix method lookup (ocsigen/js_of_ocaml#2034, ocsigen/js_of_ocaml#2038, ocsigen/js_of_ocaml#2039) * Lib: fix Dom_html.Keyboard_code.of_event (ocsigen/js_of_ocaml#1878) * Tools: fix jsoo_mktop and jsoo_mkcmis (ocsigen/js_of_ocaml#1877) * Toplevel: fix for when use-js-strings is disabled (ocsigen/js_of_ocaml#1997)
This was done in #1765 for the JavaScript runtime.
See corresponding OCaml PR ocaml/ocaml#12735
fix #1779