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

stack safe #12

Closed
wants to merge 1 commit into from
Closed

stack safe #12

wants to merge 1 commit into from

Conversation

safareli
Copy link

fix #9

updated work made in purescript-deprecated/purescript-eff#31

benchmark
bench type n mean stddev min max
>>=R build Eff 100 43.32 μs 129.40 μs 881.00 ns 411.46 μs
>>=R build Aff 100 15.08 μs 39.84 μs 1.84 μs 128.39 μs
>>=R run Eff 100 211.71 μs 198.96 μs 137.53 μs 776.26 μs
>>=R run Aff 100 354.32 μs 368.47 μs 230.62 μs 1.40 ms
>>=R build Eff 1000 2.71 μs 2.18 μs 1.51 μs 8.61 μs
>>=R build Aff 1000 2.54 μs 1.99 μs 1.35 μs 8.16 μs
>>=R run Eff 1000 1.72 ms 1.14 ms 379.97 μs 3.76 ms
>>=R run Aff 1000 1.94 ms 1.04 ms 988.37 μs 4.46 ms
>>=R build Eff 5000 1.65 μs 1.98 μs 893.00 ns 7.24 μs
>>=R build Aff 5000 1.55 μs 1.53 μs 848.00 ns 5.85 μs
>>=R run Eff 5000 4.71 ms 2.58 ms 1.33 ms 8.47 ms
>>=R run Aff 5000 5.84 ms 3.66 ms 2.15 ms 11.92 ms
>>=L build Eff 100 29.42 μs 87.50 μs 764.00 ns 278.34 μs
>>=L build Aff 100 2.08 μs 2.01 μs 1.26 μs 7.75 μs
>>=L run Eff 100 117.08 μs 155.40 μs 63.07 μs 559.29 μs
>>=L run Aff 100 168.60 μs 20.01 μs 150.76 μs 211.12 μs
>>=L build Eff 1000 2.16 μs 1.95 μs 1.30 μs 7.59 μs
>>=L build Aff 1000 1.44 μs 1.70 μs 784.00 ns 6.25 μs
>>=L run Eff 1000 597.75 μs 241.14 μs 288.23 μs 1.01 ms
>>=L run Aff 1000 1.48 ms 423.76 μs 989.80 μs 2.39 ms
>>=L build Eff 5000 1.58 μs 2.03 μs 766.00 ns 7.33 μs
>>=L build Aff 5000 1.27 μs 1.25 μs 763.00 ns 4.78 μs
>>=L run Eff 5000 3.89 ms 2.37 ms 1.32 ms 7.66 ms
>>=L run Aff 5000 4.45 ms 2.94 ms 1.81 ms 10.19 ms
map build Eff 100 13.74 μs 38.48 μs 730.00 ns 123.11 μs
map build Aff 100 1.30 μs 1.34 μs 772.00 ns 5.06 μs
map run Eff 100 143.35 μs 208.15 μs 41.52 μs 722.96 μs
map run Aff 100 125.66 μs 43.96 μs 91.94 μs 221.56 μs
map build Eff 1000 1.37 μs 1.58 μs 745.00 ns 5.84 μs
map build Aff 1000 9.88 μs 24.13 μs 1.11 μs 78.02 μs
map run Eff 1000 340.58 μs 123.69 μs 214.02 μs 561.88 μs
map run Aff 1000 712.70 μs 321.60 μs 389.96 μs 1.24 ms
map build Eff 5000 1.85 μs 1.61 μs 1.20 μs 6.41 μs
map build Aff 5000 5.35 μs 11.37 μs 1.05 μs 37.25 μs
map run Eff 5000 1.18 ms 882.39 μs 620.83 μs 3.39 ms
map run Aff 5000 3.82 ms 2.50 ms 1.63 ms 8.60 ms
apply build Eff 100 18.52 μs 52.71 μs 754.00 ns 168.43 μs
apply build Aff 100 9.30 μs 22.66 μs 1.04 μs 73.25 μs
apply run Eff 100 249.50 μs 188.70 μs 157.87 μs 764.58 μs
apply run Aff 100 956.74 μs 2.05 ms 204.81 μs 6.79 ms
apply build Eff 1000 1.95 μs 1.66 μs 1.29 μs 6.65 μs
apply build Aff 1000 9.34 μs 20.20 μs 1.76 μs 66.05 μs
apply run Eff 1000 1.00 ms 363.33 μs 569.89 μs 1.62 ms
apply run Aff 1000 3.81 ms 1.94 ms 1.70 ms 7.48 ms
apply build Eff 5000 1.32 μs 1.38 μs 741.00 ns 5.22 μs
apply build Aff 5000 4.38 μs 7.95 μs 1.03 μs 26.50 μs
apply run Eff 5000 4.23 ms 1.94 ms 2.23 ms 7.67 ms
apply run Aff 5000 11.20 ms 2.57 ms 9.25 ms 18.19 ms
- - - - - - -
>>=R build Eff 10000 3.33 μs 2.78 μs 1.36 μs 5.29 μs
>>=R build Aff 10000 34.65 μs 30.98 μs 12.75 μs 56.56 μs
>>=R run Eff 10000 7.57 ms 3.30 ms 5.24 ms 9.91 ms
>>=R run Aff 10000 17.67 ms 41.47 μs 17.64 ms 17.70 ms
>>=R build Eff 50000 8.73 μs 8.88 μs 2.46 μs 15.01 μs
>>=R build Aff 50000 24.72 μs 22.66 μs 8.70 μs 40.74 μs
>>=R run Eff 50000 109.05 ms 36.31 ms 83.38 ms 134.73 ms
>>=R run Aff 50000 204.59 ms 73.84 ms 152.38 ms 256.80 ms
>>=R build Eff 100000 19.40 μs 9.01 μs 13.03 μs 25.77 μs
>>=R build Aff 100000 81.61 μs 10.48 μs 74.20 μs 89.03 μs
>>=R run Eff 100000 306.49 ms 127.54 ms 216.31 ms 396.67 ms
>>=R run Aff 100000 419.11 ms 81.90 ms 361.20 ms 477.02 ms
>>=R build Eff 1000000 6.00 μs 5.19 μs 2.33 μs 9.67 μs
>>=R build Aff 1000000 34.99 μs 38.85 μs 7.52 μs 62.47 μs
>>=R run Eff 1000000 4.13 s 2.18 s 2.59 s 5.67 s
>>=R run Aff 1000000 4.28 s 573.69 ms 3.88 s 4.69 s
>>=L build Eff 10000 6.52 μs 6.44 μs 1.97 μs 11.08 μs
>>=L build Aff 10000 33.31 μs 35.44 μs 8.25 μs 58.36 μs
>>=L run Eff 10000 22.02 ms 4.88 ms 18.56 ms 25.47 ms
>>=L run Aff 10000 30.54 ms 18.12 ms 17.73 ms 43.36 ms
>>=L build Eff 50000 4.70 μs 3.77 μs 2.03 μs 7.36 μs
>>=L build Aff 50000 23.86 μs 19.90 μs 9.78 μs 37.93 μs
>>=L run Eff 50000 110.11 ms 31.00 ms 88.20 ms 132.03 ms
>>=L run Aff 50000 242.86 ms 92.22 ms 177.65 ms 308.07 ms
>>=L build Eff 100000 11.27 μs 7.01 μs 6.31 μs 16.22 μs
>>=L build Aff 100000 42.01 μs 48.56 μs 7.67 μs 76.34 μs
>>=L run Eff 100000 324.61 ms 107.09 ms 248.89 ms 400.34 ms
>>=L run Aff 100000 447.80 ms 86.00 ms 386.99 ms 508.62 ms
>>=L build Eff 1000000 7.66 μs 8.06 μs 1.96 μs 13.36 μs
>>=L build Aff 1000000 70.69 μs 77.81 μs 15.67 μs 125.72 μs
>>=L run Eff 1000000 3.18 s 774.65 ms 2.64 s 3.73 s
>>=L run Aff 1000000 11.36 s 8.53 s 5.33 s 17.40 s
map build Eff 10000 7.29 μs 5.64 μs 3.31 μs 11.28 μs
map build Aff 10000 46.05 μs 46.44 μs 13.21 μs 78.89 μs
map run Eff 10000 5.24 ms 217.28 μs 5.08 ms 5.39 ms
map run Aff 10000 15.01 ms 12.58 ms 6.12 ms 23.91 ms
map build Eff 50000 4.32 μs 3.01 μs 2.19 μs 6.45 μs
map build Aff 50000 16.23 μs 14.19 μs 6.20 μs 26.26 μs
map run Eff 50000 14.28 ms 2.40 ms 12.58 ms 15.97 ms
map run Aff 50000 61.19 ms 23.59 ms 44.51 ms 77.87 ms
map build Eff 100000 4.27 μs 3.30 μs 1.93 μs 6.60 μs
map build Aff 100000 40.82 μs 42.18 μs 11.00 μs 70.65 μs
map run Eff 100000 51.75 ms 1.39 ms 50.77 ms 52.73 ms
map run Aff 100000 175.20 ms 15.22 ms 164.44 ms 185.96 ms
map build Eff 1000000 5.06 μs 3.95 μs 2.27 μs 7.86 μs
map build Aff 1000000 28.48 μs 26.48 μs 9.75 μs 47.21 μs
map run Eff 1000000 1.30 s 619.66 ms 857.32 ms 1.73 s
map run Aff 1000000 2.00 s 305.70 ms 1.78 s 2.21 s
map build Eff 350000 6.09 μs 6.00 μs 1.84 μs 10.33 μs
map build Aff 350000 75.70 μs 18.64 μs 62.52 μs 88.88 μs
map run Eff 350000 324.03 ms 61.57 ms 280.49 ms 367.57 ms
map run Aff 350000 644.66 ms 69.64 ms 595.41 ms 693.90 ms
map build Eff 700000 4.85 μs 4.71 μs 1.52 μs 8.18 μs
map build Aff 700000 53.11 μs 50.24 μs 17.59 μs 88.64 μs
map run Eff 700000 607.53 ms 155.39 ms 497.65 ms 717.41 ms
map run Aff 700000 1.76 s 620.00 ms 1.32 s 2.20 s
apply build Eff 10000 5.55 μs 5.87 μs 1.40 μs 9.70 μs
apply build Aff 10000 114.71 μs 118.45 μs 30.95 μs 198.46 μs
apply run Eff 10000 9.93 ms 2.98 ms 7.82 ms 12.03 ms
apply run Aff 10000 59.19 ms 131.00 μs 59.10 ms 59.28 ms
apply build Eff 50000 5.21 μs 4.50 μs 2.03 μs 8.39 μs
apply build Aff 50000 43.94 μs 46.97 μs 10.73 μs 77.15 μs
apply run Eff 50000 143.75 ms 57.67 ms 102.97 ms 184.52 ms
apply run Aff 50000 384.62 ms 41.34 ms 355.39 ms 413.86 ms
apply build Eff 100000 6.90 μs 7.03 μs 1.93 μs 11.86 μs
apply build Aff 100000 59.84 μs 25.76 μs 41.62 μs 78.05 μs
apply run Eff 100000 335.42 ms 67.59 ms 287.63 ms 383.21 ms
apply run Aff 100000 846.18 ms 192.05 ms 710.38 ms 981.98 ms
apply build Eff 1000000 7.54 μs 7.68 μs 2.11 μs 12.97 μs
apply build Aff 1000000 55.95 μs 62.42 μs 11.81 μs 100.09 μs
apply run Eff 1000000 7.13 s 4.00 s 4.30 s 9.95 s
apply run Aff 1000000 25.64 s 1.79 s 24.37 s 26.90 s

@safareli safareli force-pushed the fast branch 4 times, most recently from cfd2003 to 63b5f83 Compare May 25, 2019 22:38
@safareli
Copy link
Author

This is worth to still have in mind purescript-deprecated/purescript-eff#31 (comment)

"name": "purescript-eff-aff-bench",
"dependencies": {
"purescript-minibench": "^2.0.0",
"purescript-effect": "safareli/purescript-effect#fast",
Copy link
Author

Choose a reason for hiding this comment

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

💀 this should be updated before merge

@safareli
Copy link
Author

In this PR I have added some explanation of how FFI part works.
If something needs more clarification, or if you spot a typo let me know/comment.

@safareli
Copy link
Author

safareli commented Aug 1, 2019

There might be concern about portability of code relying on stack safety of Effect. For that to not be an issue other backends should make there Effect implementation stack safe too. The implementation here is not too complex, but it preserves original Eff runtime representation by using JS function as an object. I'm not sure if functions can have properties in c++ or Go or rlang like in JS. If all this languages support similar feature then this implementation can be ported and runtime representation preserved. otherwise if stack safety is desired in other backends, just a regular tree like representation should be used with some unsafePerformEffect like function which interprets the tree.

@safareli
Copy link
Author

ping

@natefaubion
Copy link

natefaubion commented Mar 25, 2020

While I do think this is really cool and useful, I don't think this is something that we can merge as part of core Effect and say that it is stack safe. It is only stack safe if the compiler does not optimize it, which is a very strange/unintuitive condition, and I think is a showstopper for including it as part of the core library. I'm inclined to say that this should exist as a separate library with a separate opaque type with a MonadEffect instance.

@safareli
Copy link
Author

That strange/unintuitive condition can be "fixed" by removing that compiler optimization. So choice is between having compiler optimization and no stack safety OR removing compiler optimization and having library level stack safety. But as this PR was hanging around for over 2 years, I guess stack safety at the cost of the compiler optimization is not acceptable so closing.

@safareli safareli closed this Mar 25, 2020
@natefaubion
Copy link

I do not consider removing the optimization acceptable. It's the only reason why things like halogen-vdom can even be written with acceptable performance.

@hdgarrood hdgarrood mentioned this pull request May 14, 2020
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.

Stack safety?
2 participants