stackblitz/alien-signals

I've ported to Go

Closed this issue · 4 comments

Was a challenge cause of the dynamic usage within the library and crazy mutations during tesing... (propagate is silly) but here are the results with a port of the benchmarks. I extended to 10k WxH

TS

| benchmark                |              avg |         min |         p75 |         p99 |         max |
| ------------------------ | ---------------- | ----------- | ----------- | ----------- | ----------- |
| propagate: 1 * 1         | `879.40 ns/iter` | `863.08 ns` | `881.93 ns` | `931.41 ns` | `942.93 ns` |
| propagate: 1 * 10        | `  4.13 µs/iter` | `  4.09 µs` | `  4.15 µs` | `  4.19 µs` | `  4.19 µs` |
| propagate: 1 * 100       | ` 36.05 µs/iter` | ` 35.21 µs` | ` 36.56 µs` | ` 36.85 µs` | ` 37.08 µs` |
| propagate: 1 * 1000      | `363.06 µs/iter` | `337.79 µs` | `360.45 µs` | `602.32 µs` | `828.24 µs` |
| propagate: 1 * 10000     | error: Maximum call stack size exceeded |
| propagate: 10 * 1        | `  7.59 µs/iter` | `  7.50 µs` | `  7.64 µs` | `  7.68 µs` | `  7.75 µs` |
| propagate: 10 * 10       | ` 40.17 µs/iter` | ` 39.45 µs` | ` 40.42 µs` | ` 40.67 µs` | ` 40.90 µs` |
| propagate: 10 * 100      | `377.55 µs/iter` | `345.79 µs` | `364.73 µs` | `721.62 µs` | `825.40 µs` |
| propagate: 10 * 1000     | `  3.77 ms/iter` | `  3.52 ms` | `  3.88 ms` | `  4.55 ms` | `  4.90 ms` |
| propagate: 10 * 10000    | error: Maximum call stack size exceeded |
| propagate: 100 * 1       | ` 72.93 µs/iter` | ` 70.33 µs` | ` 72.41 µs` | ` 84.55 µs` | `269.86 µs` |
| propagate: 100 * 10      | `396.95 µs/iter` | `383.79 µs` | `397.78 µs` | `470.70 µs` | `667.30 µs` |
| propagate: 100 * 100     | `  3.61 ms/iter` | `  3.54 ms` | `  3.62 ms` | `  3.81 ms` | `  3.83 ms` |
| propagate: 100 * 1000    | ` 61.82 ms/iter` | ` 60.57 ms` | ` 62.03 ms` | ` 62.65 ms` | ` 64.07 ms` |
| propagate: 100 * 10000   | error: Maximum call stack size exceeded |
| propagate: 1000 * 1      | `726.04 µs/iter` | `707.31 µs` | `729.20 µs` | `895.32 µs` | `927.52 µs` |
| propagate: 1000 * 10     | `  4.58 ms/iter` | `  4.00 ms` | `  4.76 ms` | `  5.83 ms` | `  6.07 ms` |
| propagate: 1000 * 100    | ` 58.94 ms/iter` | ` 58.18 ms` | ` 59.15 ms` | ` 59.90 ms` | ` 60.59 ms` |
| propagate: 1000 * 1000   | `640.89 ms/iter` | `636.51 ms` | `641.96 ms` | `644.19 ms` | `648.65 ms` |
| propagate: 1000 * 10000  | error: Maximum call stack size exceeded |
| propagate: 10000 * 1     | `  8.18 ms/iter` | `  7.79 ms` | `  8.31 ms` | `  8.49 ms` | `  8.53 ms` |
| propagate: 10000 * 10    | ` 58.76 ms/iter` | ` 57.19 ms` | ` 58.67 ms` | ` 60.52 ms` | ` 62.19 ms` |
| propagate: 10000 * 100   | `569.88 ms/iter` | `559.99 ms` | `570.88 ms` | `578.03 ms` | `581.46 ms` |
| propagate: 10000 * 1000  | `   7.13 s/iter` | `   6.72 s` | `   7.28 s` | `   7.35 s` | `   7.56 s` |
| propagate: 10000 * 10000 | error: Maximum call stack size exceeded |

Go

-+--------------------------+--------------+--------------+--------------+-------------+-------------+
-| BENCHMARK                |          AVG |          MIN |          P75 |         P99 |         MAX |
-+--------------------------+--------------+--------------+--------------+-------------+-------------+
-| propagate: 1 * 1         |        245ns |        120ns |        170ns |     1.182µs |     1.182µs |
-| propagate: 1 * 10        |        913ns |        862ns |        892ns |     1.182µs |     1.182µs |
-| propagate: 1 * 100       |      6.614µs |      5.751µs |      7.114µs |     7.876µs |     7.876µs |
-| propagate: 1 * 1000      |     54.281µs |     49.355µs |     55.137µs |    67.259µs |    67.259µs |
-| propagate: 1 * 10000     |    523.035µs |    452.471µs |    533.979µs |   897.419µs |   897.419µs |
-| propagate: 10 * 1        |        860ns |        811ns |        822ns |     1.133µs |     1.133µs |
-| propagate: 10 * 10       |      5.511µs |      5.099µs |       5.25µs |     8.636µs |     8.636µs |
-| propagate: 10 * 100      |      46.36µs |     46.109µs |      46.45µs |    47.241µs |    47.241µs |
-| propagate: 10 * 1000     |    516.253µs |    460.517µs |    516.505µs |   698.095µs |   698.095µs |
-| propagate: 10 * 10000    |   5.307504ms |   4.902171ms |   5.430799ms |  6.032809ms |  6.032809ms |
-| propagate: 100 * 1       |      8.105µs |      8.015µs |      8.046µs |     8.656µs |     8.656µs |
-| propagate: 100 * 10      |      53.76µs |     51.169µs |     57.311µs |    57.952µs |    57.952µs |
-| propagate: 100 * 100     |      528.4µs |    518.578µs |    531.203µs |   542.485µs |   542.485µs |
-| propagate: 100 * 1000    |   5.657486ms |   5.045708ms |    6.07453ms |  6.945918ms |  6.945918ms |
-| propagate: 100 * 10000   |  54.179415ms |  52.110433ms |  56.017539ms | 56.933642ms | 56.933642ms |
-| propagate: 1000 * 1      |     76.831µs |     75.094µs |     75.475µs |    87.819µs |    87.819µs |
-| propagate: 1000 * 10     |    612.015µs |    529.319µs |    590.787µs |  1.006358ms |  1.006358ms |
-| propagate: 1000 * 100    |   6.532832ms |   5.988413ms |   6.685005ms |  6.873769ms |  6.873769ms |
-| propagate: 1000 * 1000   |  55.287091ms |   53.40665ms |  55.554066ms | 57.087619ms | 57.087619ms |
-| propagate: 1000 * 10000  | 533.734675ms | 524.460397ms | 539.883531ms | 543.99004ms | 543.99004ms |
-| propagate: 10000 * 1     |    781.496µs |    767.147µs |    788.399µs |   803.497µs |   803.497µs |
-| propagate: 10000 * 10    |   9.808555ms |   9.239706ms |   9.857205ms | 11.427108ms | 11.427108ms |
-| propagate: 10000 * 100   |  64.933085ms |  64.196962ms |  65.353068ms | 65.612147ms | 65.612147ms |
-| propagate: 10000 * 1000  | 533.553871ms | 528.541617ms | 535.905941ms | 542.88353ms | 542.88353ms |
-| propagate: 10000 * 10000 | 5.391814406s | 5.326932802s | 5.379107299s | 5.69781948s | 5.69781948s |
-+--------------------------+--------------+--------------+--------------+-------------+-------------+

I'll clean up and make a PR for inclusion in the README

Thank you for the porting! I have added alien-signals-go to readme.

I think the TS's benchmark result is affected by --jitless, can you remove --jitless from the following line and update the result?

"bench": "npm run build:esm && node --jitless --expose-gc benchs/propagate.mjs",

Much better! I figured they should be roughly similar in speed but the Node version taking about 10-12x the memory

Node

| benchmark                |              avg |         min |         p75 |         p99 |         max |
| ------------------------ | ---------------- | ----------- | ----------- | ----------- | ----------- |
| propagate: 1 * 1         | ` 48.61 ns/iter` | ` 44.73 ns` | ` 47.97 ns` | ` 73.81 ns` | `120.40 ns` |
| propagate: 1 * 10        | `268.84 ns/iter` | `256.60 ns` | `278.34 ns` | `294.42 ns` | `506.19 ns` |
| propagate: 1 * 100       | `  2.93 µs/iter` | `  2.90 µs` | `  2.93 µs` | `  2.96 µs` | `  2.96 µs` |
| propagate: 1 * 1000      | ` 34.32 µs/iter` | ` 34.10 µs` | ` 34.46 µs` | ` 34.47 µs` | ` 34.56 µs` |
| propagate: 1 * 10000     | error: Maximum call stack size exceeded |
| propagate: 10 * 1        | `437.01 ns/iter` | `412.83 ns` | `445.33 ns` | `477.34 ns` | `577.09 ns` |
| propagate: 10 * 10       | `  3.04 µs/iter` | `  3.01 µs` | `  3.04 µs` | `  3.12 µs` | `  3.29 µs` |
| propagate: 10 * 100      | ` 29.11 µs/iter` | ` 28.85 µs` | ` 29.34 µs` | ` 29.49 µs` | ` 29.52 µs` |
| propagate: 10 * 1000     | `296.37 µs/iter` | `272.57 µs` | `295.65 µs` | `393.12 µs` | `510.07 µs` |
| propagate: 10 * 10000    | error: Maximum call stack size exceeded |
| propagate: 100 * 1       | `  4.65 µs/iter` | `  4.60 µs` | `  4.66 µs` | `  4.71 µs` | `  4.77 µs` |
| propagate: 100 * 10      | ` 33.41 µs/iter` | ` 33.23 µs` | ` 33.54 µs` | ` 33.66 µs` | ` 33.67 µs` |
| propagate: 100 * 100     | `305.75 µs/iter` | `285.65 µs` | `306.11 µs` | `389.72 µs` | `422.69 µs` |
| propagate: 100 * 1000    | `  4.77 ms/iter` | `  4.56 ms` | `  4.84 ms` | `  5.04 ms` | `  5.11 ms` |
| propagate: 100 * 10000   | error: Maximum call stack size exceeded |
| propagate: 1000 * 1      | ` 45.51 µs/iter` | ` 45.22 µs` | ` 45.57 µs` | ` 45.74 µs` | ` 46.36 µs` |
| propagate: 1000 * 10     | `359.52 µs/iter` | `332.85 µs` | `362.54 µs` | `463.21 µs` | `558.22 µs` |
| propagate: 1000 * 100    | `  5.51 ms/iter` | `  5.28 ms` | `  5.57 ms` | `  5.74 ms` | `  5.85 ms` |
| propagate: 1000 * 1000   | ` 57.36 ms/iter` | ` 56.54 ms` | ` 57.25 ms` | ` 57.46 ms` | ` 61.10 ms` |
| propagate: 1000 * 10000  | error: Maximum call stack size exceeded |
| propagate: 10000 * 1     | `485.35 µs/iter` | `448.03 µs` | `487.39 µs` | `625.87 µs` | `671.36 µs` |
| propagate: 10000 * 10    | `  9.25 ms/iter` | `  8.87 ms` | `  9.37 ms` | `  9.78 ms` | ` 10.03 ms` |
| propagate: 10000 * 100   | ` 62.25 ms/iter` | ` 61.21 ms` | ` 61.86 ms` | ` 63.15 ms` | ` 66.95 ms` |
| propagate: 10000 * 1000  | `676.41 ms/iter` | `659.72 ms` | `675.46 ms` | `710.27 ms` | `734.99 ms` |
| propagate: 10000 * 10000 | error: Maximum call stack size exceeded |

The latest jit stuff is really impressive! I have done any optimization / profiling yet but did turn on PGO

Go

+--------------------------+--------------+--------------+--------------+--------------+--------------+
| BENCHMARK                |          AVG |          MIN |          P75 |          P99 |          MAX |
+--------------------------+--------------+--------------+--------------+--------------+--------------+
| propagate: 1 * 1         |        125ns |        110ns |        111ns |        210ns |      1.333µs |
| propagate: 1 * 10        |        688ns |        581ns |        712ns |        872ns |      1.032µs |
| propagate: 1 * 100       |      3.915µs |      3.767µs |      3.807µs |      4.709µs |       5.32µs |
| propagate: 1 * 1000      |     37.467µs |     36.741µs |     37.151µs |     45.127µs |     58.773µs |
| propagate: 1 * 10000     |    389.447µs |    361.536µs |      378.9µs |    514.461µs |    1.54186ms |
| propagate: 10 * 1        |        675ns |        661ns |        672ns |        762ns |        972ns |
| propagate: 10 * 10       |      4.332µs |      4.298µs |      4.329µs |      4.579µs |      4.709µs |
| propagate: 10 * 100      |     39.324µs |     38.945µs |     39.406µs |     43.173µs |     43.784µs |
| propagate: 10 * 1000     |    393.467µs |    373.399µs |    391.875µs |    580.558µs |    807.164µs |
| propagate: 10 * 10000    |   3.986958ms |   3.827672ms |   4.016606ms |   4.407768ms |   4.799042ms |
| propagate: 100 * 1       |      6.282µs |      6.051µs |      6.543µs |      7.374µs |      7.504µs |
| propagate: 100 * 10      |     40.828µs |     40.367µs |     40.609µs |     47.932µs |     56.579µs |
| propagate: 100 * 100     |    384.984µs |    378.459µs |    386.725µs |    426.411µs |    468.873µs |
| propagate: 100 * 1000    |   4.087396ms |   3.907364ms |   4.046493ms |   4.881872ms |    5.47789ms |
| propagate: 100 * 10000   |  43.243626ms |  42.381882ms |  43.421143ms |  48.683918ms |  49.529747ms |
| propagate: 1000 * 1      |     60.236µs |     59.034µs |     60.396µs |     69.644µs |     73.842µs |
| propagate: 1000 * 10     |    439.561µs |    416.562µs |     446.59µs |    463.663µs |    465.697µs |
| propagate: 1000 * 100    |   4.502427ms |   4.305091ms |   4.542128ms |   4.754507ms |   4.914113ms |
| propagate: 1000 * 1000   |  44.229612ms |  42.923915ms |  45.174851ms |  46.030368ms |  46.405901ms |
| propagate: 1000 * 10000  | 434.184596ms | 426.674225ms | 435.859695ms |  460.31353ms |  462.34876ms |
| propagate: 10000 * 1     |    642.171µs |    610.316µs |    637.768µs |    810.491µs |   1.059511ms |
| propagate: 10000 * 10    |   8.338133ms |   7.336088ms |   8.622125ms |   9.982575ms |  10.264829ms |
| propagate: 10000 * 100   |  52.092456ms |  50.629646ms |  52.723659ms |  56.869794ms |  57.060861ms |
| propagate: 10000 * 1000  | 439.609865ms | 435.477779ms | 441.222123ms | 448.839332ms | 450.429014ms |
| propagate: 10000 * 10000 | 4.530244316s | 4.286658058s | 4.529553663s | 5.666950049s | 6.713975996s |
+--------------------------+--------------+--------------+--------------+--------------+--------------+