Просмотр исходного кода

script/research: add benchmarks for merkletree and nullifiers serialization

ghassmo 3 лет назад
Родитель
Сommit
d3e8877ded

+ 2 - 0
script/research/merkletree_null_benchmark/.gitignore

@@ -0,0 +1,2 @@
+/target
+Cargo.lock

+ 19 - 0
script/research/merkletree_null_benchmark/Cargo.toml

@@ -0,0 +1,19 @@
+[package]
+name = "merkletree_null_benchmark"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+
+darkfi = {path="../../../", features=["node"]}
+darkfi-sdk = {path="../../../src/sdk"}
+darkfi-serial = {path="../../../src/serial"}
+
+rand = "0.8.5"
+pasta_curves = "0.4.0"
+incrementalmerkletree = "0.3.0"
+
+serde_json = "1.0.87"
+
+[workspace]
+

+ 9 - 0
script/research/merkletree_null_benchmark/benchmarks.md

@@ -0,0 +1,9 @@
+
+# Benchmarks
+
+# Merkle Tree
+![serialize desrialize merkle tree](./serial_desrial_merkle_time.png)
+
+# Nullifiers
+![serialize desrialize nullifiers](./serial_desrial_null_time.png)
+

+ 402 - 0
script/research/merkletree_null_benchmark/deserial_merkle_time.json

@@ -0,0 +1,402 @@
+{
+  "1000": {
+    "nanos": 520,
+    "secs": 0
+  },
+  "10000": {
+    "nanos": 528,
+    "secs": 0
+  },
+  "100000": {
+    "nanos": 635,
+    "secs": 0
+  },
+  "11000": {
+    "nanos": 676,
+    "secs": 0
+  },
+  "12000": {
+    "nanos": 878,
+    "secs": 0
+  },
+  "13000": {
+    "nanos": 535,
+    "secs": 0
+  },
+  "14000": {
+    "nanos": 607,
+    "secs": 0
+  },
+  "15000": {
+    "nanos": 553,
+    "secs": 0
+  },
+  "16000": {
+    "nanos": 699,
+    "secs": 0
+  },
+  "17000": {
+    "nanos": 515,
+    "secs": 0
+  },
+  "18000": {
+    "nanos": 661,
+    "secs": 0
+  },
+  "19000": {
+    "nanos": 565,
+    "secs": 0
+  },
+  "2000": {
+    "nanos": 546,
+    "secs": 0
+  },
+  "20000": {
+    "nanos": 576,
+    "secs": 0
+  },
+  "21000": {
+    "nanos": 459,
+    "secs": 0
+  },
+  "22000": {
+    "nanos": 714,
+    "secs": 0
+  },
+  "23000": {
+    "nanos": 658,
+    "secs": 0
+  },
+  "24000": {
+    "nanos": 739,
+    "secs": 0
+  },
+  "25000": {
+    "nanos": 587,
+    "secs": 0
+  },
+  "26000": {
+    "nanos": 612,
+    "secs": 0
+  },
+  "27000": {
+    "nanos": 668,
+    "secs": 0
+  },
+  "28000": {
+    "nanos": 680,
+    "secs": 0
+  },
+  "29000": {
+    "nanos": 570,
+    "secs": 0
+  },
+  "3000": {
+    "nanos": 570,
+    "secs": 0
+  },
+  "30000": {
+    "nanos": 673,
+    "secs": 0
+  },
+  "31000": {
+    "nanos": 603,
+    "secs": 0
+  },
+  "32000": {
+    "nanos": 1231,
+    "secs": 0
+  },
+  "33000": {
+    "nanos": 758,
+    "secs": 0
+  },
+  "34000": {
+    "nanos": 528,
+    "secs": 0
+  },
+  "35000": {
+    "nanos": 542,
+    "secs": 0
+  },
+  "36000": {
+    "nanos": 613,
+    "secs": 0
+  },
+  "37000": {
+    "nanos": 471,
+    "secs": 0
+  },
+  "38000": {
+    "nanos": 606,
+    "secs": 0
+  },
+  "39000": {
+    "nanos": 507,
+    "secs": 0
+  },
+  "4000": {
+    "nanos": 588,
+    "secs": 0
+  },
+  "40000": {
+    "nanos": 619,
+    "secs": 0
+  },
+  "41000": {
+    "nanos": 437,
+    "secs": 0
+  },
+  "42000": {
+    "nanos": 497,
+    "secs": 0
+  },
+  "43000": {
+    "nanos": 684,
+    "secs": 0
+  },
+  "44000": {
+    "nanos": 657,
+    "secs": 0
+  },
+  "45000": {
+    "nanos": 650,
+    "secs": 0
+  },
+  "46000": {
+    "nanos": 675,
+    "secs": 0
+  },
+  "47000": {
+    "nanos": 653,
+    "secs": 0
+  },
+  "48000": {
+    "nanos": 729,
+    "secs": 0
+  },
+  "49000": {
+    "nanos": 672,
+    "secs": 0
+  },
+  "5000": {
+    "nanos": 483,
+    "secs": 0
+  },
+  "50000": {
+    "nanos": 604,
+    "secs": 0
+  },
+  "51000": {
+    "nanos": 619,
+    "secs": 0
+  },
+  "52000": {
+    "nanos": 636,
+    "secs": 0
+  },
+  "53000": {
+    "nanos": 551,
+    "secs": 0
+  },
+  "54000": {
+    "nanos": 631,
+    "secs": 0
+  },
+  "55000": {
+    "nanos": 663,
+    "secs": 0
+  },
+  "56000": {
+    "nanos": 676,
+    "secs": 0
+  },
+  "57000": {
+    "nanos": 705,
+    "secs": 0
+  },
+  "58000": {
+    "nanos": 594,
+    "secs": 0
+  },
+  "59000": {
+    "nanos": 649,
+    "secs": 0
+  },
+  "6000": {
+    "nanos": 599,
+    "secs": 0
+  },
+  "60000": {
+    "nanos": 670,
+    "secs": 0
+  },
+  "61000": {
+    "nanos": 589,
+    "secs": 0
+  },
+  "62000": {
+    "nanos": 585,
+    "secs": 0
+  },
+  "63000": {
+    "nanos": 637,
+    "secs": 0
+  },
+  "64000": {
+    "nanos": 753,
+    "secs": 0
+  },
+  "65000": {
+    "nanos": 745,
+    "secs": 0
+  },
+  "66000": {
+    "nanos": 543,
+    "secs": 0
+  },
+  "67000": {
+    "nanos": 549,
+    "secs": 0
+  },
+  "68000": {
+    "nanos": 568,
+    "secs": 0
+  },
+  "69000": {
+    "nanos": 903,
+    "secs": 0
+  },
+  "7000": {
+    "nanos": 570,
+    "secs": 0
+  },
+  "70000": {
+    "nanos": 625,
+    "secs": 0
+  },
+  "71000": {
+    "nanos": 551,
+    "secs": 0
+  },
+  "72000": {
+    "nanos": 635,
+    "secs": 0
+  },
+  "73000": {
+    "nanos": 568,
+    "secs": 0
+  },
+  "74000": {
+    "nanos": 475,
+    "secs": 0
+  },
+  "75000": {
+    "nanos": 635,
+    "secs": 0
+  },
+  "76000": {
+    "nanos": 619,
+    "secs": 0
+  },
+  "77000": {
+    "nanos": 592,
+    "secs": 0
+  },
+  "78000": {
+    "nanos": 603,
+    "secs": 0
+  },
+  "79000": {
+    "nanos": 584,
+    "secs": 0
+  },
+  "8000": {
+    "nanos": 665,
+    "secs": 0
+  },
+  "80000": {
+    "nanos": 702,
+    "secs": 0
+  },
+  "81000": {
+    "nanos": 638,
+    "secs": 0
+  },
+  "82000": {
+    "nanos": 489,
+    "secs": 0
+  },
+  "83000": {
+    "nanos": 535,
+    "secs": 0
+  },
+  "84000": {
+    "nanos": 533,
+    "secs": 0
+  },
+  "85000": {
+    "nanos": 494,
+    "secs": 0
+  },
+  "86000": {
+    "nanos": 1023,
+    "secs": 0
+  },
+  "87000": {
+    "nanos": 683,
+    "secs": 0
+  },
+  "88000": {
+    "nanos": 761,
+    "secs": 0
+  },
+  "89000": {
+    "nanos": 653,
+    "secs": 0
+  },
+  "9000": {
+    "nanos": 474,
+    "secs": 0
+  },
+  "90000": {
+    "nanos": 746,
+    "secs": 0
+  },
+  "91000": {
+    "nanos": 645,
+    "secs": 0
+  },
+  "92000": {
+    "nanos": 720,
+    "secs": 0
+  },
+  "93000": {
+    "nanos": 874,
+    "secs": 0
+  },
+  "94000": {
+    "nanos": 1234,
+    "secs": 0
+  },
+  "95000": {
+    "nanos": 654,
+    "secs": 0
+  },
+  "96000": {
+    "nanos": 796,
+    "secs": 0
+  },
+  "97000": {
+    "nanos": 695,
+    "secs": 0
+  },
+  "98000": {
+    "nanos": 1033,
+    "secs": 0
+  },
+  "99000": {
+    "nanos": 602,
+    "secs": 0
+  }
+}

+ 402 - 0
script/research/merkletree_null_benchmark/deserial_null_time.json

@@ -0,0 +1,402 @@
+{
+  "1000": {
+    "nanos": 55418,
+    "secs": 0
+  },
+  "10000": {
+    "nanos": 454002,
+    "secs": 0
+  },
+  "100000": {
+    "nanos": 4271029,
+    "secs": 0
+  },
+  "11000": {
+    "nanos": 466540,
+    "secs": 0
+  },
+  "12000": {
+    "nanos": 631768,
+    "secs": 0
+  },
+  "13000": {
+    "nanos": 563309,
+    "secs": 0
+  },
+  "14000": {
+    "nanos": 874443,
+    "secs": 0
+  },
+  "15000": {
+    "nanos": 703812,
+    "secs": 0
+  },
+  "16000": {
+    "nanos": 635922,
+    "secs": 0
+  },
+  "17000": {
+    "nanos": 698253,
+    "secs": 0
+  },
+  "18000": {
+    "nanos": 786894,
+    "secs": 0
+  },
+  "19000": {
+    "nanos": 1132017,
+    "secs": 0
+  },
+  "2000": {
+    "nanos": 122463,
+    "secs": 0
+  },
+  "20000": {
+    "nanos": 859992,
+    "secs": 0
+  },
+  "21000": {
+    "nanos": 832009,
+    "secs": 0
+  },
+  "22000": {
+    "nanos": 1064128,
+    "secs": 0
+  },
+  "23000": {
+    "nanos": 1370178,
+    "secs": 0
+  },
+  "24000": {
+    "nanos": 1153108,
+    "secs": 0
+  },
+  "25000": {
+    "nanos": 1104906,
+    "secs": 0
+  },
+  "26000": {
+    "nanos": 1147885,
+    "secs": 0
+  },
+  "27000": {
+    "nanos": 1128384,
+    "secs": 0
+  },
+  "28000": {
+    "nanos": 1148660,
+    "secs": 0
+  },
+  "29000": {
+    "nanos": 1210717,
+    "secs": 0
+  },
+  "3000": {
+    "nanos": 148279,
+    "secs": 0
+  },
+  "30000": {
+    "nanos": 1739851,
+    "secs": 0
+  },
+  "31000": {
+    "nanos": 1435411,
+    "secs": 0
+  },
+  "32000": {
+    "nanos": 1354423,
+    "secs": 0
+  },
+  "33000": {
+    "nanos": 1589283,
+    "secs": 0
+  },
+  "34000": {
+    "nanos": 1476268,
+    "secs": 0
+  },
+  "35000": {
+    "nanos": 1480049,
+    "secs": 0
+  },
+  "36000": {
+    "nanos": 1832580,
+    "secs": 0
+  },
+  "37000": {
+    "nanos": 1687130,
+    "secs": 0
+  },
+  "38000": {
+    "nanos": 1856885,
+    "secs": 0
+  },
+  "39000": {
+    "nanos": 1649066,
+    "secs": 0
+  },
+  "4000": {
+    "nanos": 237787,
+    "secs": 0
+  },
+  "40000": {
+    "nanos": 1687916,
+    "secs": 0
+  },
+  "41000": {
+    "nanos": 1784021,
+    "secs": 0
+  },
+  "42000": {
+    "nanos": 1939604,
+    "secs": 0
+  },
+  "43000": {
+    "nanos": 1982332,
+    "secs": 0
+  },
+  "44000": {
+    "nanos": 2043983,
+    "secs": 0
+  },
+  "45000": {
+    "nanos": 2103901,
+    "secs": 0
+  },
+  "46000": {
+    "nanos": 2006225,
+    "secs": 0
+  },
+  "47000": {
+    "nanos": 2275498,
+    "secs": 0
+  },
+  "48000": {
+    "nanos": 2416770,
+    "secs": 0
+  },
+  "49000": {
+    "nanos": 2570104,
+    "secs": 0
+  },
+  "5000": {
+    "nanos": 231111,
+    "secs": 0
+  },
+  "50000": {
+    "nanos": 2106829,
+    "secs": 0
+  },
+  "51000": {
+    "nanos": 2064148,
+    "secs": 0
+  },
+  "52000": {
+    "nanos": 2303774,
+    "secs": 0
+  },
+  "53000": {
+    "nanos": 2258760,
+    "secs": 0
+  },
+  "54000": {
+    "nanos": 2246807,
+    "secs": 0
+  },
+  "55000": {
+    "nanos": 2355410,
+    "secs": 0
+  },
+  "56000": {
+    "nanos": 2476287,
+    "secs": 0
+  },
+  "57000": {
+    "nanos": 2443953,
+    "secs": 0
+  },
+  "58000": {
+    "nanos": 2555899,
+    "secs": 0
+  },
+  "59000": {
+    "nanos": 2605292,
+    "secs": 0
+  },
+  "6000": {
+    "nanos": 269627,
+    "secs": 0
+  },
+  "60000": {
+    "nanos": 2464003,
+    "secs": 0
+  },
+  "61000": {
+    "nanos": 3048624,
+    "secs": 0
+  },
+  "62000": {
+    "nanos": 2830657,
+    "secs": 0
+  },
+  "63000": {
+    "nanos": 2880066,
+    "secs": 0
+  },
+  "64000": {
+    "nanos": 2941481,
+    "secs": 0
+  },
+  "65000": {
+    "nanos": 2889690,
+    "secs": 0
+  },
+  "66000": {
+    "nanos": 2840917,
+    "secs": 0
+  },
+  "67000": {
+    "nanos": 2829613,
+    "secs": 0
+  },
+  "68000": {
+    "nanos": 3127232,
+    "secs": 0
+  },
+  "69000": {
+    "nanos": 3181686,
+    "secs": 0
+  },
+  "7000": {
+    "nanos": 315260,
+    "secs": 0
+  },
+  "70000": {
+    "nanos": 3492396,
+    "secs": 0
+  },
+  "71000": {
+    "nanos": 3223275,
+    "secs": 0
+  },
+  "72000": {
+    "nanos": 2997916,
+    "secs": 0
+  },
+  "73000": {
+    "nanos": 3135957,
+    "secs": 0
+  },
+  "74000": {
+    "nanos": 3370823,
+    "secs": 0
+  },
+  "75000": {
+    "nanos": 3972228,
+    "secs": 0
+  },
+  "76000": {
+    "nanos": 3691130,
+    "secs": 0
+  },
+  "77000": {
+    "nanos": 3391621,
+    "secs": 0
+  },
+  "78000": {
+    "nanos": 3453784,
+    "secs": 0
+  },
+  "79000": {
+    "nanos": 3439870,
+    "secs": 0
+  },
+  "8000": {
+    "nanos": 354640,
+    "secs": 0
+  },
+  "80000": {
+    "nanos": 3736211,
+    "secs": 0
+  },
+  "81000": {
+    "nanos": 3760407,
+    "secs": 0
+  },
+  "82000": {
+    "nanos": 3943915,
+    "secs": 0
+  },
+  "83000": {
+    "nanos": 3792094,
+    "secs": 0
+  },
+  "84000": {
+    "nanos": 3473753,
+    "secs": 0
+  },
+  "85000": {
+    "nanos": 3839513,
+    "secs": 0
+  },
+  "86000": {
+    "nanos": 4154761,
+    "secs": 0
+  },
+  "87000": {
+    "nanos": 3901227,
+    "secs": 0
+  },
+  "88000": {
+    "nanos": 3717099,
+    "secs": 0
+  },
+  "89000": {
+    "nanos": 4305197,
+    "secs": 0
+  },
+  "9000": {
+    "nanos": 392102,
+    "secs": 0
+  },
+  "90000": {
+    "nanos": 3930301,
+    "secs": 0
+  },
+  "91000": {
+    "nanos": 4049443,
+    "secs": 0
+  },
+  "92000": {
+    "nanos": 3813621,
+    "secs": 0
+  },
+  "93000": {
+    "nanos": 3899017,
+    "secs": 0
+  },
+  "94000": {
+    "nanos": 4232925,
+    "secs": 0
+  },
+  "95000": {
+    "nanos": 4017195,
+    "secs": 0
+  },
+  "96000": {
+    "nanos": 4062076,
+    "secs": 0
+  },
+  "97000": {
+    "nanos": 4053742,
+    "secs": 0
+  },
+  "98000": {
+    "nanos": 4354866,
+    "secs": 0
+  },
+  "99000": {
+    "nanos": 4078394,
+    "secs": 0
+  }
+}

+ 42 - 0
script/research/merkletree_null_benchmark/main.py

@@ -0,0 +1,42 @@
+import json
+import collections
+
+import matplotlib.pyplot as plt
+
+
+f = open("./serial_merkle_time.json")
+
+def load_data(path):
+    f = open(path)
+    
+    data = json.load(f)
+    data = {int(k):v for k,v in data.items()}
+    od = collections.OrderedDict(sorted(data.items()))
+    
+    
+    coins = list(od.keys()) 
+    seconds =  [ v.get("secs") + (v.get("nanos") / 1e9) for v in od.values()]
+
+    return coins, seconds
+
+plt.title(f"Serialize/Deserialize merkle tree benchmark")
+coins, seconds = load_data("./serial_merkle_time.json")
+plt.plot(coins, seconds, label='serializing')
+coins, seconds = load_data("./deserial_merkle_time.json")
+plt.plot(coins, seconds, label='deserializing')
+
+plt.legend()
+plt.ylabel(f"time in seconds")
+plt.xlabel("number of coins")
+plt.savefig("serial_desrial_merkle_time.png")
+
+#plt.title(f"Serialize/Deserialize nullifiers vector benchmark")
+#coins, seconds = load_data("./serial_null_time.json")
+#plt.plot(coins, seconds, label='serializing')
+#coins, seconds = load_data("./deserial_null_time.json")
+#plt.plot(coins, seconds, label='deserializing')
+#
+#plt.legend()
+#plt.ylabel(f"time in seconds")
+#plt.xlabel("number of coins")
+#plt.savefig("serial_desrial_null_time.png")

BIN
script/research/merkletree_null_benchmark/serial_desrial_merkle_time.png


BIN
script/research/merkletree_null_benchmark/serial_desrial_null_time.png


+ 402 - 0
script/research/merkletree_null_benchmark/serial_merkle_time.json

@@ -0,0 +1,402 @@
+{
+  "1000": {
+    "nanos": 436,
+    "secs": 0
+  },
+  "10000": {
+    "nanos": 402,
+    "secs": 0
+  },
+  "100000": {
+    "nanos": 503,
+    "secs": 0
+  },
+  "11000": {
+    "nanos": 492,
+    "secs": 0
+  },
+  "12000": {
+    "nanos": 495,
+    "secs": 0
+  },
+  "13000": {
+    "nanos": 434,
+    "secs": 0
+  },
+  "14000": {
+    "nanos": 492,
+    "secs": 0
+  },
+  "15000": {
+    "nanos": 423,
+    "secs": 0
+  },
+  "16000": {
+    "nanos": 540,
+    "secs": 0
+  },
+  "17000": {
+    "nanos": 428,
+    "secs": 0
+  },
+  "18000": {
+    "nanos": 865,
+    "secs": 0
+  },
+  "19000": {
+    "nanos": 459,
+    "secs": 0
+  },
+  "2000": {
+    "nanos": 902,
+    "secs": 0
+  },
+  "20000": {
+    "nanos": 489,
+    "secs": 0
+  },
+  "21000": {
+    "nanos": 833,
+    "secs": 0
+  },
+  "22000": {
+    "nanos": 900,
+    "secs": 0
+  },
+  "23000": {
+    "nanos": 549,
+    "secs": 0
+  },
+  "24000": {
+    "nanos": 1176,
+    "secs": 0
+  },
+  "25000": {
+    "nanos": 814,
+    "secs": 0
+  },
+  "26000": {
+    "nanos": 464,
+    "secs": 0
+  },
+  "27000": {
+    "nanos": 524,
+    "secs": 0
+  },
+  "28000": {
+    "nanos": 513,
+    "secs": 0
+  },
+  "29000": {
+    "nanos": 437,
+    "secs": 0
+  },
+  "3000": {
+    "nanos": 457,
+    "secs": 0
+  },
+  "30000": {
+    "nanos": 516,
+    "secs": 0
+  },
+  "31000": {
+    "nanos": 481,
+    "secs": 0
+  },
+  "32000": {
+    "nanos": 606,
+    "secs": 0
+  },
+  "33000": {
+    "nanos": 820,
+    "secs": 0
+  },
+  "34000": {
+    "nanos": 459,
+    "secs": 0
+  },
+  "35000": {
+    "nanos": 481,
+    "secs": 0
+  },
+  "36000": {
+    "nanos": 449,
+    "secs": 0
+  },
+  "37000": {
+    "nanos": 410,
+    "secs": 0
+  },
+  "38000": {
+    "nanos": 429,
+    "secs": 0
+  },
+  "39000": {
+    "nanos": 401,
+    "secs": 0
+  },
+  "4000": {
+    "nanos": 436,
+    "secs": 0
+  },
+  "40000": {
+    "nanos": 488,
+    "secs": 0
+  },
+  "41000": {
+    "nanos": 413,
+    "secs": 0
+  },
+  "42000": {
+    "nanos": 416,
+    "secs": 0
+  },
+  "43000": {
+    "nanos": 554,
+    "secs": 0
+  },
+  "44000": {
+    "nanos": 522,
+    "secs": 0
+  },
+  "45000": {
+    "nanos": 526,
+    "secs": 0
+  },
+  "46000": {
+    "nanos": 508,
+    "secs": 0
+  },
+  "47000": {
+    "nanos": 508,
+    "secs": 0
+  },
+  "48000": {
+    "nanos": 556,
+    "secs": 0
+  },
+  "49000": {
+    "nanos": 537,
+    "secs": 0
+  },
+  "5000": {
+    "nanos": 680,
+    "secs": 0
+  },
+  "50000": {
+    "nanos": 456,
+    "secs": 0
+  },
+  "51000": {
+    "nanos": 518,
+    "secs": 0
+  },
+  "52000": {
+    "nanos": 510,
+    "secs": 0
+  },
+  "53000": {
+    "nanos": 457,
+    "secs": 0
+  },
+  "54000": {
+    "nanos": 550,
+    "secs": 0
+  },
+  "55000": {
+    "nanos": 525,
+    "secs": 0
+  },
+  "56000": {
+    "nanos": 488,
+    "secs": 0
+  },
+  "57000": {
+    "nanos": 528,
+    "secs": 0
+  },
+  "58000": {
+    "nanos": 832,
+    "secs": 0
+  },
+  "59000": {
+    "nanos": 512,
+    "secs": 0
+  },
+  "6000": {
+    "nanos": 889,
+    "secs": 0
+  },
+  "60000": {
+    "nanos": 540,
+    "secs": 0
+  },
+  "61000": {
+    "nanos": 496,
+    "secs": 0
+  },
+  "62000": {
+    "nanos": 563,
+    "secs": 0
+  },
+  "63000": {
+    "nanos": 553,
+    "secs": 0
+  },
+  "64000": {
+    "nanos": 593,
+    "secs": 0
+  },
+  "65000": {
+    "nanos": 574,
+    "secs": 0
+  },
+  "66000": {
+    "nanos": 418,
+    "secs": 0
+  },
+  "67000": {
+    "nanos": 411,
+    "secs": 0
+  },
+  "68000": {
+    "nanos": 983,
+    "secs": 0
+  },
+  "69000": {
+    "nanos": 443,
+    "secs": 0
+  },
+  "7000": {
+    "nanos": 742,
+    "secs": 0
+  },
+  "70000": {
+    "nanos": 451,
+    "secs": 0
+  },
+  "71000": {
+    "nanos": 458,
+    "secs": 0
+  },
+  "72000": {
+    "nanos": 523,
+    "secs": 0
+  },
+  "73000": {
+    "nanos": 457,
+    "secs": 0
+  },
+  "74000": {
+    "nanos": 424,
+    "secs": 0
+  },
+  "75000": {
+    "nanos": 505,
+    "secs": 0
+  },
+  "76000": {
+    "nanos": 490,
+    "secs": 0
+  },
+  "77000": {
+    "nanos": 1190,
+    "secs": 0
+  },
+  "78000": {
+    "nanos": 448,
+    "secs": 0
+  },
+  "79000": {
+    "nanos": 433,
+    "secs": 0
+  },
+  "8000": {
+    "nanos": 479,
+    "secs": 0
+  },
+  "80000": {
+    "nanos": 517,
+    "secs": 0
+  },
+  "81000": {
+    "nanos": 488,
+    "secs": 0
+  },
+  "82000": {
+    "nanos": 653,
+    "secs": 0
+  },
+  "83000": {
+    "nanos": 432,
+    "secs": 0
+  },
+  "84000": {
+    "nanos": 444,
+    "secs": 0
+  },
+  "85000": {
+    "nanos": 388,
+    "secs": 0
+  },
+  "86000": {
+    "nanos": 580,
+    "secs": 0
+  },
+  "87000": {
+    "nanos": 503,
+    "secs": 0
+  },
+  "88000": {
+    "nanos": 572,
+    "secs": 0
+  },
+  "89000": {
+    "nanos": 548,
+    "secs": 0
+  },
+  "9000": {
+    "nanos": 389,
+    "secs": 0
+  },
+  "90000": {
+    "nanos": 539,
+    "secs": 0
+  },
+  "91000": {
+    "nanos": 533,
+    "secs": 0
+  },
+  "92000": {
+    "nanos": 542,
+    "secs": 0
+  },
+  "93000": {
+    "nanos": 499,
+    "secs": 0
+  },
+  "94000": {
+    "nanos": 545,
+    "secs": 0
+  },
+  "95000": {
+    "nanos": 474,
+    "secs": 0
+  },
+  "96000": {
+    "nanos": 579,
+    "secs": 0
+  },
+  "97000": {
+    "nanos": 555,
+    "secs": 0
+  },
+  "98000": {
+    "nanos": 604,
+    "secs": 0
+  },
+  "99000": {
+    "nanos": 435,
+    "secs": 0
+  }
+}

+ 402 - 0
script/research/merkletree_null_benchmark/serial_null_time.json

@@ -0,0 +1,402 @@
+{
+  "1000": {
+    "nanos": 25707,
+    "secs": 0
+  },
+  "10000": {
+    "nanos": 216642,
+    "secs": 0
+  },
+  "100000": {
+    "nanos": 2662667,
+    "secs": 0
+  },
+  "11000": {
+    "nanos": 233108,
+    "secs": 0
+  },
+  "12000": {
+    "nanos": 258893,
+    "secs": 0
+  },
+  "13000": {
+    "nanos": 277626,
+    "secs": 0
+  },
+  "14000": {
+    "nanos": 298115,
+    "secs": 0
+  },
+  "15000": {
+    "nanos": 316558,
+    "secs": 0
+  },
+  "16000": {
+    "nanos": 349252,
+    "secs": 0
+  },
+  "17000": {
+    "nanos": 309206,
+    "secs": 0
+  },
+  "18000": {
+    "nanos": 398314,
+    "secs": 0
+  },
+  "19000": {
+    "nanos": 412214,
+    "secs": 0
+  },
+  "2000": {
+    "nanos": 45835,
+    "secs": 0
+  },
+  "20000": {
+    "nanos": 435866,
+    "secs": 0
+  },
+  "21000": {
+    "nanos": 443708,
+    "secs": 0
+  },
+  "22000": {
+    "nanos": 465586,
+    "secs": 0
+  },
+  "23000": {
+    "nanos": 506836,
+    "secs": 0
+  },
+  "24000": {
+    "nanos": 505983,
+    "secs": 0
+  },
+  "25000": {
+    "nanos": 531944,
+    "secs": 0
+  },
+  "26000": {
+    "nanos": 571615,
+    "secs": 0
+  },
+  "27000": {
+    "nanos": 585129,
+    "secs": 0
+  },
+  "28000": {
+    "nanos": 562634,
+    "secs": 0
+  },
+  "29000": {
+    "nanos": 579645,
+    "secs": 0
+  },
+  "3000": {
+    "nanos": 76906,
+    "secs": 0
+  },
+  "30000": {
+    "nanos": 500443,
+    "secs": 0
+  },
+  "31000": {
+    "nanos": 520743,
+    "secs": 0
+  },
+  "32000": {
+    "nanos": 590317,
+    "secs": 0
+  },
+  "33000": {
+    "nanos": 597426,
+    "secs": 0
+  },
+  "34000": {
+    "nanos": 711377,
+    "secs": 0
+  },
+  "35000": {
+    "nanos": 665712,
+    "secs": 0
+  },
+  "36000": {
+    "nanos": 693867,
+    "secs": 0
+  },
+  "37000": {
+    "nanos": 722775,
+    "secs": 0
+  },
+  "38000": {
+    "nanos": 739728,
+    "secs": 0
+  },
+  "39000": {
+    "nanos": 742682,
+    "secs": 0
+  },
+  "4000": {
+    "nanos": 98782,
+    "secs": 0
+  },
+  "40000": {
+    "nanos": 760965,
+    "secs": 0
+  },
+  "41000": {
+    "nanos": 778431,
+    "secs": 0
+  },
+  "42000": {
+    "nanos": 809894,
+    "secs": 0
+  },
+  "43000": {
+    "nanos": 819735,
+    "secs": 0
+  },
+  "44000": {
+    "nanos": 860603,
+    "secs": 0
+  },
+  "45000": {
+    "nanos": 862725,
+    "secs": 0
+  },
+  "46000": {
+    "nanos": 884374,
+    "secs": 0
+  },
+  "47000": {
+    "nanos": 890589,
+    "secs": 0
+  },
+  "48000": {
+    "nanos": 954809,
+    "secs": 0
+  },
+  "49000": {
+    "nanos": 879739,
+    "secs": 0
+  },
+  "5000": {
+    "nanos": 125918,
+    "secs": 0
+  },
+  "50000": {
+    "nanos": 871705,
+    "secs": 0
+  },
+  "51000": {
+    "nanos": 911719,
+    "secs": 0
+  },
+  "52000": {
+    "nanos": 967166,
+    "secs": 0
+  },
+  "53000": {
+    "nanos": 976981,
+    "secs": 0
+  },
+  "54000": {
+    "nanos": 1046523,
+    "secs": 0
+  },
+  "55000": {
+    "nanos": 1019318,
+    "secs": 0
+  },
+  "56000": {
+    "nanos": 1103141,
+    "secs": 0
+  },
+  "57000": {
+    "nanos": 1055578,
+    "secs": 0
+  },
+  "58000": {
+    "nanos": 1109236,
+    "secs": 0
+  },
+  "59000": {
+    "nanos": 1120614,
+    "secs": 0
+  },
+  "6000": {
+    "nanos": 144705,
+    "secs": 0
+  },
+  "60000": {
+    "nanos": 1208080,
+    "secs": 0
+  },
+  "61000": {
+    "nanos": 1165978,
+    "secs": 0
+  },
+  "62000": {
+    "nanos": 1191259,
+    "secs": 0
+  },
+  "63000": {
+    "nanos": 1209839,
+    "secs": 0
+  },
+  "64000": {
+    "nanos": 1170322,
+    "secs": 0
+  },
+  "65000": {
+    "nanos": 1249531,
+    "secs": 0
+  },
+  "66000": {
+    "nanos": 1108637,
+    "secs": 0
+  },
+  "67000": {
+    "nanos": 1225433,
+    "secs": 0
+  },
+  "68000": {
+    "nanos": 1196818,
+    "secs": 0
+  },
+  "69000": {
+    "nanos": 1207728,
+    "secs": 0
+  },
+  "7000": {
+    "nanos": 159013,
+    "secs": 0
+  },
+  "70000": {
+    "nanos": 1279995,
+    "secs": 0
+  },
+  "71000": {
+    "nanos": 1300298,
+    "secs": 0
+  },
+  "72000": {
+    "nanos": 1349131,
+    "secs": 0
+  },
+  "73000": {
+    "nanos": 1368361,
+    "secs": 0
+  },
+  "74000": {
+    "nanos": 1379306,
+    "secs": 0
+  },
+  "75000": {
+    "nanos": 1416562,
+    "secs": 0
+  },
+  "76000": {
+    "nanos": 1522962,
+    "secs": 0
+  },
+  "77000": {
+    "nanos": 1528788,
+    "secs": 0
+  },
+  "78000": {
+    "nanos": 1532588,
+    "secs": 0
+  },
+  "79000": {
+    "nanos": 1557600,
+    "secs": 0
+  },
+  "8000": {
+    "nanos": 170707,
+    "secs": 0
+  },
+  "80000": {
+    "nanos": 1595893,
+    "secs": 0
+  },
+  "81000": {
+    "nanos": 1557007,
+    "secs": 0
+  },
+  "82000": {
+    "nanos": 1653833,
+    "secs": 0
+  },
+  "83000": {
+    "nanos": 1571937,
+    "secs": 0
+  },
+  "84000": {
+    "nanos": 1680081,
+    "secs": 0
+  },
+  "85000": {
+    "nanos": 1827453,
+    "secs": 0
+  },
+  "86000": {
+    "nanos": 1700669,
+    "secs": 0
+  },
+  "87000": {
+    "nanos": 1861765,
+    "secs": 0
+  },
+  "88000": {
+    "nanos": 1881227,
+    "secs": 0
+  },
+  "89000": {
+    "nanos": 1886907,
+    "secs": 0
+  },
+  "9000": {
+    "nanos": 197961,
+    "secs": 0
+  },
+  "90000": {
+    "nanos": 1935081,
+    "secs": 0
+  },
+  "91000": {
+    "nanos": 1901289,
+    "secs": 0
+  },
+  "92000": {
+    "nanos": 1904586,
+    "secs": 0
+  },
+  "93000": {
+    "nanos": 2173950,
+    "secs": 0
+  },
+  "94000": {
+    "nanos": 2054032,
+    "secs": 0
+  },
+  "95000": {
+    "nanos": 2152519,
+    "secs": 0
+  },
+  "96000": {
+    "nanos": 2054692,
+    "secs": 0
+  },
+  "97000": {
+    "nanos": 2154415,
+    "secs": 0
+  },
+  "98000": {
+    "nanos": 2272199,
+    "secs": 0
+  },
+  "99000": {
+    "nanos": 2506013,
+    "secs": 0
+  }
+}

+ 116 - 0
script/research/merkletree_null_benchmark/src/main.rs

@@ -0,0 +1,116 @@
+use std::{collections::HashMap, fs::write, time::Instant};
+
+use darkfi::crypto::coin::Coin;
+use darkfi_sdk::crypto::{constants::MERKLE_DEPTH, MerkleNode, Nullifier};
+use darkfi_serial::{deserialize, serialize};
+
+use incrementalmerkletree::{bridgetree::BridgeTree, Tree};
+use pasta_curves::{group::ff::Field, pallas};
+use rand::rngs::OsRng;
+use serde_json::json;
+
+fn main() {
+    let mut serial_merkle_time = HashMap::new();
+
+    for i in 1..101 {
+        let mut tree: BridgeTree<MerkleNode, MERKLE_DEPTH> = BridgeTree::new(100);
+
+        let coins = 1000 * i; 
+
+        for _ in 0..coins {
+            let coin = Coin(pallas::Base::random(&mut OsRng));
+            tree.append(&MerkleNode::from(coin.0));
+        }
+
+        let start = Instant::now();
+        for _ in 0..100 {
+            serialize(&tree);
+        }
+        let elapsed = start.elapsed();
+
+        let result = elapsed / 100;
+        serial_merkle_time.insert(coins, result);
+    }
+
+    let mut deserial_merkle_time = HashMap::new();
+
+    for i in 1..101 {
+        let mut tree: BridgeTree<MerkleNode, MERKLE_DEPTH> = BridgeTree::new(100);
+
+        let coins = 1000 * i; 
+        for _ in 0..coins {
+            let coin = Coin(pallas::Base::random(&mut OsRng));
+            tree.append(&MerkleNode::from(coin.0));
+        }
+
+        let ser_tree = serialize(&tree);
+        let start = Instant::now();
+        for _ in 0..100 {
+            deserialize::<BridgeTree<MerkleNode, MERKLE_DEPTH>>(&ser_tree).unwrap();
+        }
+        let elapsed = start.elapsed();
+
+        let result = elapsed / 100;
+        deserial_merkle_time.insert(coins, result);
+    }
+
+    let mut serial_null_time = HashMap::new();
+
+    for i in 1..101 {
+        let mut nullifiers: Vec<Nullifier> = vec![];
+
+        let coins = 1000 * i; 
+        for _ in 0..coins {
+            let nullifier = Nullifier::from(pallas::Base::random(&mut OsRng));
+            nullifiers.push(nullifier);
+        }
+
+        let start = Instant::now();
+        for _ in 0..100 {
+            serialize(&nullifiers);
+        }
+        let elapsed = start.elapsed();
+
+        let result = elapsed / 100;
+        serial_null_time.insert(coins, result);
+    }
+
+    let mut deserial_null_time = HashMap::new();
+
+    for i in 1..101 {
+        let mut nullifiers: Vec<Nullifier> = vec![];
+
+        let coins = 1000 * i; 
+        for _ in 0..coins {
+            let nullifier = Nullifier::from(pallas::Base::random(&mut OsRng));
+            nullifiers.push(nullifier);
+        }
+
+        let ser_null = serialize(&nullifiers);
+        let start = Instant::now();
+        for _ in 0..100 {
+            deserialize::<Vec<Nullifier>>(&ser_null).unwrap();
+        }
+        let elapsed = start.elapsed();
+
+        let result = elapsed / 100;
+        deserial_null_time.insert(coins, result);
+    }
+
+    let serial_merkle_time = json!(serial_merkle_time);
+    let deserial_merkle_time = json!(deserial_merkle_time);
+    let serial_null_time = json!(serial_null_time);
+    let deserial_null_time = json!(deserial_null_time);
+
+    write("serial_merkle_time.json", serde_json::to_string_pretty(&serial_merkle_time).unwrap())
+        .unwrap();
+
+    write("deserial_merkle_time.json", serde_json::to_string_pretty(&deserial_merkle_time).unwrap())
+        .unwrap();
+
+    write("serial_null_time.json", serde_json::to_string_pretty(&serial_null_time).unwrap())
+        .unwrap();
+
+    write("deserial_null_time.json", serde_json::to_string_pretty(&deserial_null_time).unwrap())
+        .unwrap();
+}