ChainSafe / blst-ts

Typescript wrapper for https://github.com/supranational/blst native bindings, a highly performant BLS12-381 signature library
Other
18 stars 13 forks source link

fix: performance/memory updates #114

Closed matthewkeil closed 7 months ago

matthewkeil commented 8 months ago

Re-wrote how the points are stored and used.

Reduced memory consumption for trade-off with converting points between jacobian and affine for some processes.

Removed TypeTaging because it avoids a round-trip to the isolate for functions when passing deserialized objects.

Also fixes a bug that was found when running on Debug builds of node. There is an internal check for nullptr External variables. Updated how those were being created and passed to the constructors.

Memory results

Swig Build

Swig SecretKey - 76  b / instance - 2025888 allocated by 27000 instances
Swig PublicKey - 76  b / instance - 2065552 allocated by 28000 instances
Swig Signature - 75  b / instance - 2970048 allocated by 40000 instances

mkeil/rebuild

Napi SecretKey - 142  b / instance - 1810304 allocated by 13000 instances
Napi PublicKey - 140  b / instance - 2639992 allocated by 19000 instances
Napi Signature - 138  b / instance - 2613832 allocated by 19000 instances

mkeil/performance-fixes

Napi SecretKey - 109  b / instance - 2807592 allocated by 26000 instances
Napi PublicKey - 108  b / instance - 2890656 allocated by 27000 instances
Napi Signature - 106  b / instance - 2004648 allocated by 19000 instances

Performance Results

mkeil/rebuild

  PublicKey
    ✓ PublicKey serialization- Napi                                        1315789 ops/s    760.0000 ns/op        -     693759 runs  0.606 s
    ✓ PublicKey deserialize - Napi                                        75255.87 ops/s    13.28800 us/op        -      20395 runs  0.303 s
    ✓ PublicKey deserialize and validate - Napi - 1 keys                  19127.41 ops/s    52.28100 us/op        -       4744 runs  0.303 s
    ✓ PublicKey deserialize and validate - Napi - 100 keys                191.9501 ops/s    5.209687 ms/op        -         41 runs  0.755 s
    ✓ PublicKey deserialize and validate - Napi - 10000 keys              1.914846 ops/s    522.2351 ms/op        -         12 runs   6.87 s

  SecretKey
    ✓ SecretKey.fromKeygen - Napi                                         653594.8 ops/s    1.530000 us/op        -     797114 runs   1.31 s
    ✓ SecretKey serialization- Napi                                        1196172 ops/s    836.0000 ns/op        -    1060453 runs   1.01 s
    ✓ SecretKey deserialization - Napi                                    910746.8 ops/s    1.098000 us/op        -     570249 runs   1.11 s
    ✓ SecretKey.toPublicKey - Napi                                        11613.19 ops/s    86.10900 us/op        -       3673 runs  0.404 s
    ✓ SecretKey.sign - Napi                                               3171.542 ops/s    315.3040 us/op        -       1599 runs  0.819 s

  Signature
    ✓ Signature serialization- Napi                                        1193317 ops/s    838.0000 ns/op        -     635040 runs  0.606 s
    ✓ Signature deserialize - Napi                                        38043.06 ops/s    26.28600 us/op        -      13774 runs  0.404 s
    ✓ Signatures deserialize and validate - Napi - 1 sets                 14332.81 ops/s    69.77000 us/op        -       4728 runs  0.404 s
    ✓ Signatures deserialize and validate - Napi - 100 sets               141.7467 ops/s    7.054840 ms/op        -         76 runs   1.04 s
    ✓ Signatures deserialize and validate - Napi - 10000 sets             1.412279 ops/s    708.0755 ms/op        -         12 runs   9.23 s

  functions
    aggregatePublicKeys
      ✓ aggregatePublicKeys - Napi - 1 sets                                 598802.4 ops/s    1.670000 us/op        -     201181 runs  0.404 s
      ✓ aggregatePublicKeys - Napi - 8 sets                                 148236.0 ops/s    6.746000 us/op        -      69714 runs  0.505 s
      ✓ aggregatePublicKeys - Napi - 32 sets                                42178.08 ops/s    23.70900 us/op        -      11258 runs  0.303 s
      ✓ aggregatePublicKeys - Napi - 128 sets                               10596.48 ops/s    94.37100 us/op        -       7287 runs  0.808 s
      ✓ aggregatePublicKeys - Napi - 256 sets                               5381.871 ops/s    185.8090 us/op        -       1582 runs  0.498 s
    aggregateSignatures
      ✓ aggregateSignatures - Napi - 1 sets                                 382409.2 ops/s    2.615000 us/op        -     102094 runs  0.303 s
      ✓ aggregateSignatures - Napi - 8 sets                                 69444.44 ops/s    14.40000 us/op        -      33165 runs  0.505 s
      ✓ aggregateSignatures - Napi - 32 sets                                18553.91 ops/s    53.89700 us/op        -       4490 runs  0.303 s
      ✓ aggregateSignatures - Napi - 128 sets                               4642.612 ops/s    215.3960 us/op        -       1383 runs  0.523 s
      ✓ aggregateSignatures - Napi - 256 sets                               2331.633 ops/s    428.8840 us/op        -        697 runs  0.742 s
    aggregateVerify
      ✓ aggregateVerify - Napi - 1 sets                                     1115.438 ops/s    896.5090 us/op        -        225 runs  0.707 s
      ✓ aggregateVerify - Napi - 8 sets                                     300.2689 ops/s    3.330348 ms/op        -        123 runs  0.918 s
      ✓ aggregateVerify - Napi - 32 sets                                    84.85633 ops/s    11.78462 ms/op        -         28 runs  0.841 s
      ✓ aggregateVerify - Napi - 128 sets                                   21.40434 ops/s    46.71950 ms/op        -         16 runs   1.28 s
      ✓ aggregateVerify - Napi - 256 sets                                   11.09427 ops/s    90.13662 ms/op        -         13 runs   1.74 s
    verifyMultipleAggregateSignatures
      ✓ verifyMultipleAggregateSignatures - Napi - 1 sets                   1058.732 ops/s    944.5260 us/op        -        749 runs   1.21 s
      ✓ verifyMultipleAggregateSignatures - Napi - 8 sets                   281.2109 ops/s    3.556050 ms/op        -         87 runs  0.812 s
      ✓ verifyMultipleAggregateSignatures - Napi - 32 sets                  78.10713 ops/s    12.80293 ms/op        -         17 runs  0.722 s
      ✓ verifyMultipleAggregateSignatures - Napi - 128 sets                 19.78863 ops/s    50.53407 ms/op        -         18 runs   1.46 s
      ✓ verifyMultipleAggregateSignatures - Napi - 256 sets                 10.12075 ops/s    98.80688 ms/op        -         13 runs   1.88 s
    verifyMultipleAggregateSignatures same message
      ✓ Same message - Napi - 1 sets                                        1003.115 ops/s    996.8950 us/op        -        405 runs  0.909 s
      ✓ Same message - Napi - 8 sets                                        666.4836 ops/s    1.500412 ms/op        -        202 runs  0.810 s
      ✓ Same message - Napi - 32 sets                                       309.7171 ops/s    3.228753 ms/op        -         95 runs  0.823 s
      ✓ Same message - Napi - 128 sets                                      96.95258 ops/s    10.31432 ms/op        -         21 runs  0.760 s
      ✓ Same message - Napi - 256 sets                                      51.67093 ops/s    19.35324 ms/op        -         13 runs  0.815 s

  multithreading perf
    libuv
      ✓ libuv multithreading - napi                                        0.2895522 ops/s    3.453608  s/op        -         12 runs   44.9 s

mkeil/performance-fixes

PublicKey
    ✓ PublicKey serialization- Napi                                        1254705 ops/s    797.0000 ns/op        -    1222293 runs   1.11 s
    ✓ PublicKey deserialize - Napi                                        75751.84 ops/s    13.20100 us/op        -      27621 runs  0.404 s
    ✓ PublicKey deserialize and validate - Napi - 1 keys                  19244.09 ops/s    51.96400 us/op        -       4763 runs  0.303 s
    ✓ PublicKey deserialize and validate - Napi - 100 keys                193.3445 ops/s    5.172115 ms/op        -         41 runs  0.755 s
    ✓ PublicKey deserialize and validate - Napi - 10000 keys              1.926565 ops/s    519.0585 ms/op        -         12 runs   6.83 s

  SecretKey
    ✓ SecretKey.fromKeygen - Napi                                         769822.9 ops/s    1.299000 us/op        -     929787 runs   1.41 s
    ✓ SecretKey serialization- Napi                                        1215067 ops/s    823.0000 ns/op        -     751407 runs  0.707 s
    ✓ SecretKey deserialization - Napi                                    924214.4 ops/s    1.082000 us/op        -     556811 runs   1.01 s
    ✓ SecretKey.toPublicKey - Napi                                        11728.14 ops/s    85.26500 us/op        -       6047 runs  0.606 s
    ✓ SecretKey.sign - Napi                                               3314.870 ops/s    301.6710 us/op        -       1005 runs  0.607 s

  Signature
    ✓ Signature serialization- Napi                                        1085776 ops/s    921.0000 ns/op        -     587637 runs  0.606 s
    ✓ Signature deserialize - Napi                                        38082.18 ops/s    26.25900 us/op        -      10158 runs  0.303 s
    ✓ Signatures deserialize and validate - Napi - 1 sets                 14192.65 ops/s    70.45900 us/op        -       7525 runs  0.606 s
    ✓ Signatures deserialize and validate - Napi - 100 sets               142.9535 ops/s    6.995280 ms/op        -         46 runs  0.829 s
    ✓ Signatures deserialize and validate - Napi - 10000 sets             1.429346 ops/s    699.6207 ms/op        -         12 runs   9.10 s

  functions
    aggregatePublicKeys
      ✓ aggregatePublicKeys - Napi - 1 sets                                 712758.4 ops/s    1.403000 us/op        -     235063 runs  0.404 s
      ✓ aggregatePublicKeys - Napi - 8 sets                                 169923.5 ops/s    5.885000 us/op        -      46454 runs  0.303 s
      ✓ aggregatePublicKeys - Napi - 32 sets                                47125.35 ops/s    21.22000 us/op        -      17228 runs  0.404 s
      ✓ aggregatePublicKeys - Napi - 128 sets                               11837.12 ops/s    84.48000 us/op        -       3587 runs  0.404 s
      ✓ aggregatePublicKeys - Napi - 256 sets                               5878.342 ops/s    170.1160 us/op        -       1143 runs  0.380 s
    aggregateSignatures
      ✓ aggregateSignatures - Napi - 1 sets                                 401767.8 ops/s    2.489000 us/op        -     146821 runs  0.404 s
      ✓ aggregateSignatures - Napi - 8 sets                                 74626.87 ops/s    13.40000 us/op        -      35495 runs  0.505 s
      ✓ aggregateSignatures - Napi - 32 sets                                19237.43 ops/s    51.98200 us/op        -       4703 runs  0.303 s
      ✓ aggregateSignatures - Napi - 128 sets                               4985.741 ops/s    200.5720 us/op        -        993 runs  0.408 s
      ✓ aggregateSignatures - Napi - 256 sets                               2487.383 ops/s    402.0290 us/op        -        744 runs  0.712 s
    aggregateVerify
      ✓ aggregateVerify - Napi - 1 sets                                     1117.747 ops/s    894.6570 us/op        -        226 runs  0.705 s
      ✓ aggregateVerify - Napi - 8 sets                                     305.7626 ops/s    3.270511 ms/op        -         63 runs  0.711 s
      ✓ aggregateVerify - Napi - 32 sets                                    86.17898 ops/s    11.60376 ms/op        -         19 runs  0.736 s
      ✓ aggregateVerify - Napi - 128 sets                                   22.27307 ops/s    44.89726 ms/op        -         13 runs   1.14 s
      ✓ aggregateVerify - Napi - 256 sets                                   11.14052 ops/s    89.76242 ms/op        -         13 runs   1.72 s
    verifyMultipleAggregateSignatures
      ✓ verifyMultipleAggregateSignatures - Napi - 1 sets                   1074.413 ops/s    930.7410 us/op        -        218 runs  0.703 s
      ✓ verifyMultipleAggregateSignatures - Napi - 8 sets                   283.8887 ops/s    3.522507 ms/op        -         88 runs  0.814 s
      ✓ verifyMultipleAggregateSignatures - Napi - 32 sets                  79.37762 ops/s    12.59801 ms/op        -         17 runs  0.719 s
      ✓ verifyMultipleAggregateSignatures - Napi - 128 sets                 20.40411 ops/s    49.00973 ms/op        -         13 runs   1.18 s
      ✓ verifyMultipleAggregateSignatures - Napi - 256 sets                 10.28655 ops/s    97.21431 ms/op        -         13 runs   1.85 s
    verifyMultipleAggregateSignatures same message
      ✓ Same message - Napi - 1 sets                                        1013.453 ops/s    986.7260 us/op        -        307 runs  0.805 s
      ✓ Same message - Napi - 8 sets                                        677.9790 ops/s    1.474972 ms/op        -        137 runs  0.709 s
      ✓ Same message - Napi - 32 sets                                       313.6265 ops/s    3.188506 ms/op        -         64 runs  0.720 s
      ✓ Same message - Napi - 128 sets                                      99.74903 ops/s    10.02516 ms/op        -         21 runs  0.753 s
      ✓ Same message - Napi - 256 sets                                      52.30420 ops/s    19.11892 ms/op        -         13 runs  0.817 s

  multithreading perf
    libuv
      ✓ libuv multithreading - napi                                        0.2889514 ops/s    3.460789  s/op        -         12 runs   45.0 s