From 6d184490ebc08d32ae9c689a0c16fad270c7e979 Mon Sep 17 00:00:00 2001 From: MajorTop Date: Fri, 9 Dec 2022 00:46:30 +0800 Subject: [PATCH] performance test finish --- .../protomsg/ComparePerformance.py | 106 +++++++++--------- Stream/uav_proto_msg/protomsg/Data/sizeData | 1 + Stream/uav_proto_msg/protomsg/Data/timeData | 1 + .../duration_info_message | 0 .../duration_info_message.bin | 0 .../flight_info_message | 0 .../flight_info_message.bin | 0 .../fly_format_message | 0 .../fly_format_message.bin | Bin .../flymode_info_message | 0 .../flymode_info_message.bin | 0 .../{size => JsonProtosize}/imu_info_message | 0 .../imu_info_message.bin | Bin .../{size => JsonProtosize}/odom_info_message | 0 .../odom_info_message.bin | Bin .../JsonProtosize/timestamp_info_message | 1 + .../JsonProtosize/timestamp_info_message.bin | 1 + .../__pycache__/protoMsg.cpython-310.pyc | Bin 3250 -> 3250 bytes .../protomsg/performancePlot/size.png | Bin 0 -> 71260 bytes .../protomsg/performancePlot/time.png | Bin 0 -> 18089 bytes .../__pycache__/duration_pb2.cpython-310.pyc | Bin 2466 -> 2466 bytes .../flight_information_pb2.cpython-310.pyc | Bin 3134 -> 3134 bytes .../flyformatioln_pb2.cpython-310.pyc | Bin 3236 -> 3236 bytes .../__pycache__/flymode_pb2.cpython-310.pyc | Bin 2651 -> 2651 bytes .../proto/__pycache__/imu_pb2.cpython-310.pyc | Bin 4074 -> 4074 bytes .../__pycache__/odom_pb2.cpython-310.pyc | Bin 2833 -> 2833 bytes .../__pycache__/timestamp_pb2.cpython-310.pyc | Bin 2174 -> 2174 bytes Stream/uav_proto_msg/protomsg/protoMsg.pyc | Bin 0 -> 4301 bytes .../protomsg/size/timestamp_info_message | 1 - .../protomsg/size/timestamp_info_message.bin | 1 - Stream/uav_proto_msg/protomsg/size_test.py | 27 ++++- Stream/uav_proto_msg/protomsg/timeit_test.py | 31 +++-- 32 files changed, 98 insertions(+), 72 deletions(-) create mode 100644 Stream/uav_proto_msg/protomsg/Data/sizeData create mode 100644 Stream/uav_proto_msg/protomsg/Data/timeData rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/duration_info_message (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/duration_info_message.bin (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/flight_info_message (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/flight_info_message.bin (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/fly_format_message (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/fly_format_message.bin (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/flymode_info_message (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/flymode_info_message.bin (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/imu_info_message (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/imu_info_message.bin (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/odom_info_message (100%) rename Stream/uav_proto_msg/protomsg/{size => JsonProtosize}/odom_info_message.bin (100%) create mode 100644 Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message create mode 100644 Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message.bin create mode 100644 Stream/uav_proto_msg/protomsg/performancePlot/size.png create mode 100644 Stream/uav_proto_msg/protomsg/performancePlot/time.png create mode 100644 Stream/uav_proto_msg/protomsg/protoMsg.pyc delete mode 100644 Stream/uav_proto_msg/protomsg/size/timestamp_info_message delete mode 100644 Stream/uav_proto_msg/protomsg/size/timestamp_info_message.bin diff --git a/Stream/uav_proto_msg/protomsg/ComparePerformance.py b/Stream/uav_proto_msg/protomsg/ComparePerformance.py index e12e6c0..cceecdc 100644 --- a/Stream/uav_proto_msg/protomsg/ComparePerformance.py +++ b/Stream/uav_proto_msg/protomsg/ComparePerformance.py @@ -1,64 +1,66 @@ import numpy as np import matplotlib.pyplot as plt +import orjson -fig = plt.figure(1) -plt.subplot(421) # 設定子圖 421 表示4*2 位置1 不想塞子圖就註解 -duration_info_message = 8 -duration_info_message_bin = 4 +def readData(fileName:str) -> dict: + with open(fileName, "r") as f: + data_dict = orjson.loads(f.read()) + return data_dict -width=0.3 -x = ['set1'] -x1=np.arange(len(x)) #X 軸 (第一組) -y1=(8) #Y 軸1=duration_info_message -x2=[p + width for p in x1] #X 軸 (第二組) -y2=(4) #Y 軸2=duration_info_message_bin -plt.bar(x1, y1, label='Json', width=0.1) #繪製長條圖 -plt.bar(x2, y2, label='protobuf', width=0.1) #繪製長條圖 -plt.xticks([p + width/2 for p in x1], x) #設定 X 軸刻度標籤 -plt.legend() #顯示圖例 -plt.title('duration_info') #設定圖形標題 -# plt.xlabel('x label') #設定 X 軸標籤 -plt.ylabel('MB') #設定 Y 軸標籤 -plt.subplot(422) -flight_info_message=85 -flight_info_message_bin=22 -width=0.3 -x = ['set2'] -x1=np.arange(len(x)) #X 軸 (第一組) -y1=(85) #Y 軸1=duration_info_message -x2=[p + width for p in x1] #X 軸 (第二組) -y2=(22) #Y 軸2=duration_info_message_bin -plt.bar(x1, y1, label='Json', width=0.1) #繪製長條圖 -plt.bar(x2, y2, label='protobuf', width=0.1) #繪製長條圖 -plt.xticks([p + width/2 for p in x1], x) #設定 X 軸刻度標籤 -plt.legend() #顯示圖例 -plt.title('flight_info') #設定圖形標題 -# plt.xlabel('x label') #設定 X 軸標籤 -plt.ylabel('MB') #設定 Y 軸標籤 +def plotSizeHist(size_data_dict:dict): + postion = 421 + for OutterKey in size_data_dict: + plt.subplot(postion) + plt.ylim(top=140) + postion += 1 + size = list(size_data_dict[OutterKey].values()) + width=0.3 + x = [''] + x1=np.arange(len(x)) + y1=(size[0]) + x2=[p + width for p in x1] + y2=(size[1]) + plt.bar(x1, y1, label='Json', width=0.1) + plt.bar(x2, y2, label='protobuf', width=0.1) + plt.xticks([p + width/2 for p in x1], x) + plt.legend() + plt.title(OutterKey) + plt.ylabel('MB') + figure = plt.gcf() # get current figure + figure.set_size_inches(18, 14) + plt.savefig("performancePlot/size.png") + plt.show() + -fig = plt.figure(2) +def plotTimeHist(time_data_dict:dict): + postion = 211 + for OutterKey in time_data_dict: + plt.subplot(postion) + postion += 1 + size = list(time_data_dict[OutterKey].values()) + width=0.3 + x = [''] + x1=np.arange(len(x)) + y1=(size[0]) + x2=[p + width for p in x1] + y2=(size[1]) + plt.bar(x1, y1, label='Json', width=0.1) + plt.bar(x2, y2, label='protobuf', width=0.1) + plt.xticks([p + width/2 for p in x1], x) + plt.legend() + plt.title(OutterKey) + plt.ylabel('second') + + plt.savefig("performancePlot/time.png") + plt.show() -json=404 -serial=97 -width=0.3 -x = ['set'] -x1=np.arange(len(x)) #X 軸 (第一組) -y1=(404) #Y 軸1=duration_info_message -x2=[p + width for p in x1] #X 軸 (第二組) -y2=(97) #Y 軸2=duration_info_message_bin -plt.bar(x1, y1, label='Json', width=0.1) #繪製長條圖 -plt.bar(x2, y2, label='protobuf', width=0.1) #繪製長條圖 -plt.xticks([p + width/2 for p in x1], x) #設定 X 軸刻度標籤 -plt.legend() #顯示圖例 -plt.title('flight_info') #設定圖形標題 -# plt.xlabel('x label') #設定 X 軸標籤 -plt.ylabel('MB') #設定 Y 軸標籤 - - -plt.show() \ No newline at end of file +if __name__ == "__main__": + fileName_size, fileName_time = "Data/sizeData", "Data/timeData" + plotSizeHist(readData(fileName_size)) + plotTimeHist(readData(fileName_time)) \ No newline at end of file diff --git a/Stream/uav_proto_msg/protomsg/Data/sizeData b/Stream/uav_proto_msg/protomsg/Data/sizeData new file mode 100644 index 0000000..c961a57 --- /dev/null +++ b/Stream/uav_proto_msg/protomsg/Data/sizeData @@ -0,0 +1 @@ +{"flight_info_message":{"json":85,"proto":22},"fly_format_message":{"json":55,"proto":7},"imu_info_message":{"json":130,"proto":34},"odom_info_message":{"json":59,"proto":17},"flymode_info_message":{"json":38,"proto":2},"duration_info_message":{"json":8,"proto":4},"timestamp_info_message":{"json":29,"proto":11},"Total":{"json":404,"proto":97}} \ No newline at end of file diff --git a/Stream/uav_proto_msg/protomsg/Data/timeData b/Stream/uav_proto_msg/protomsg/Data/timeData new file mode 100644 index 0000000..3960028 --- /dev/null +++ b/Stream/uav_proto_msg/protomsg/Data/timeData @@ -0,0 +1 @@ +{"serialize":{"json":0.710234867001418,"proto":2.2478437370155007},"deserializ":{"json":0.41798062800080515,"proto":0.49253950000274926}} \ No newline at end of file diff --git a/Stream/uav_proto_msg/protomsg/size/duration_info_message b/Stream/uav_proto_msg/protomsg/JsonProtosize/duration_info_message similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/duration_info_message rename to Stream/uav_proto_msg/protomsg/JsonProtosize/duration_info_message diff --git a/Stream/uav_proto_msg/protomsg/size/duration_info_message.bin b/Stream/uav_proto_msg/protomsg/JsonProtosize/duration_info_message.bin similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/duration_info_message.bin rename to Stream/uav_proto_msg/protomsg/JsonProtosize/duration_info_message.bin diff --git a/Stream/uav_proto_msg/protomsg/size/flight_info_message b/Stream/uav_proto_msg/protomsg/JsonProtosize/flight_info_message similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/flight_info_message rename to Stream/uav_proto_msg/protomsg/JsonProtosize/flight_info_message diff --git a/Stream/uav_proto_msg/protomsg/size/flight_info_message.bin b/Stream/uav_proto_msg/protomsg/JsonProtosize/flight_info_message.bin similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/flight_info_message.bin rename to Stream/uav_proto_msg/protomsg/JsonProtosize/flight_info_message.bin diff --git a/Stream/uav_proto_msg/protomsg/size/fly_format_message b/Stream/uav_proto_msg/protomsg/JsonProtosize/fly_format_message similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/fly_format_message rename to Stream/uav_proto_msg/protomsg/JsonProtosize/fly_format_message diff --git a/Stream/uav_proto_msg/protomsg/size/fly_format_message.bin b/Stream/uav_proto_msg/protomsg/JsonProtosize/fly_format_message.bin similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/fly_format_message.bin rename to Stream/uav_proto_msg/protomsg/JsonProtosize/fly_format_message.bin diff --git a/Stream/uav_proto_msg/protomsg/size/flymode_info_message b/Stream/uav_proto_msg/protomsg/JsonProtosize/flymode_info_message similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/flymode_info_message rename to Stream/uav_proto_msg/protomsg/JsonProtosize/flymode_info_message diff --git a/Stream/uav_proto_msg/protomsg/size/flymode_info_message.bin b/Stream/uav_proto_msg/protomsg/JsonProtosize/flymode_info_message.bin similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/flymode_info_message.bin rename to Stream/uav_proto_msg/protomsg/JsonProtosize/flymode_info_message.bin diff --git a/Stream/uav_proto_msg/protomsg/size/imu_info_message b/Stream/uav_proto_msg/protomsg/JsonProtosize/imu_info_message similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/imu_info_message rename to Stream/uav_proto_msg/protomsg/JsonProtosize/imu_info_message diff --git a/Stream/uav_proto_msg/protomsg/size/imu_info_message.bin b/Stream/uav_proto_msg/protomsg/JsonProtosize/imu_info_message.bin similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/imu_info_message.bin rename to Stream/uav_proto_msg/protomsg/JsonProtosize/imu_info_message.bin diff --git a/Stream/uav_proto_msg/protomsg/size/odom_info_message b/Stream/uav_proto_msg/protomsg/JsonProtosize/odom_info_message similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/odom_info_message rename to Stream/uav_proto_msg/protomsg/JsonProtosize/odom_info_message diff --git a/Stream/uav_proto_msg/protomsg/size/odom_info_message.bin b/Stream/uav_proto_msg/protomsg/JsonProtosize/odom_info_message.bin similarity index 100% rename from Stream/uav_proto_msg/protomsg/size/odom_info_message.bin rename to Stream/uav_proto_msg/protomsg/JsonProtosize/odom_info_message.bin diff --git a/Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message b/Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message new file mode 100644 index 0000000..53a2984 --- /dev/null +++ b/Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message @@ -0,0 +1 @@ +"2022-12-08T16:44:17.067479Z" \ No newline at end of file diff --git a/Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message.bin b/Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message.bin new file mode 100644 index 0000000..e5a6744 --- /dev/null +++ b/Stream/uav_proto_msg/protomsg/JsonProtosize/timestamp_info_message.bin @@ -0,0 +1 @@ +Ȝ \ No newline at end of file diff --git a/Stream/uav_proto_msg/protomsg/__pycache__/protoMsg.cpython-310.pyc b/Stream/uav_proto_msg/protomsg/__pycache__/protoMsg.cpython-310.pyc index 505eed5b9a373c13248aabf125d341c277944f62..9d7a7bebf0fa0e16b65edcf07d4f8d0cd492fde9 100644 GIT binary patch delta 29 jcmdlaxk-{MpO=@50SNr>ZRFa;#8Q%C6$EEF4} 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 literal 0 HcmV?d00001 diff --git a/Stream/uav_proto_msg/protomsg/performancePlot/time.png b/Stream/uav_proto_msg/protomsg/performancePlot/time.png new file mode 100644 index 0000000000000000000000000000000000000000..185fd1d7a37906c0090726ccbc3269c7b8d54d98 GIT binary patch literal 18089 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 delta 30 kcmZ1^yhxZkpO=@50SKIHCT`@;Vq!_jPs!h0$)w2+0B&aoi2wiq diff --git a/Stream/uav_proto_msg/protomsg/proto/__pycache__/flight_information_pb2.cpython-310.pyc b/Stream/uav_proto_msg/protomsg/proto/__pycache__/flight_information_pb2.cpython-310.pyc index f1235e90c2fcc7a3c77dd7cbd27b7a6dd7196a34..3b3da9ac58dd6e649794252c57597e495a350a9f 100644 GIT binary patch delta 618 zcmY*WJ#W-N5G9G@^?mp*5D14(L83~kC=~@2NFhjkBnVQCgjQ>NY*yOawRYDimnIT5 z4f5ZhLFt2_hIy*bBNNiY?FV7u4}U{Sb_p>zGsGJn6pY)`hkfG48kh!4>$ zfzhG6$iYJSwv*oRmHj27G}JG8kDkJ)I}uIh?M?NzPrGy7TeFP8)*CFivq)dp_DVl{ d+dDvBbq8sJjHgy_dZF>MViD61E=K+R)xYAa)Tsaf delta 618 zcmY*W&2H2%5T@NU&i-V#g;Ex+;D+E-^#X@VNFYj)ptJ~jMV1p!f+epV*$(PfNR@bl zDo=uXFXGAraF{pX8Mt6?c1!W;^EWf!%zSe>z8v>;n)Yt^_u|X>xBhVyan1Eb9{pKa z!G^};*Vrv;DXC&pz@!io<|qmXN4Zvx2_;lX-K+wP3jvZ_>>NBlJ|(Z-ec1K@*M#D5 zg3XWk&KV|oRn3!s$G$7BNtS`cjZe%{4h5^Fqo0|qVIR}~{y3O|wXB4;Qx{Y{ZQ(#z z3MUSf6{L`R3%d?a@#I8b06@VSb`-j$-o=A7J`;QBu) z!&C_tW350JKK`9-d4GP99fF;*vZwc(XUU{_l%$@0l6*bGRhr?b)Vh?gT^a3kRu?81 zjeWnT&5fv>Hl`n#gf3PygEqlHAt85u9g_xTo!Z$n(~@%LSjH?M*=xN*5<-+`INbLa z*;^=Ydg-U3vbSWk!RAeO_azS76VYrozo~f;(r#b()-GeX^&U#$Ei%`&gVN9Ly@yEN Zwgod0S#|}#7-`Wfh~U8op1Nsoo`PDCxbwTp?}GZub0TU-sz!wR$LIo zM+kEiZ+QXP2gucnXJOyKi*F#g(GC~cv zPo)(K6FJhQcqjD;k0AVK4b?AieH%KN75Kiy+-4?+-py3l*c3=B&V5?#wqBe-Cr4YN zy1d4MkNIeLH4m>nl#DdeGQVhP=0q}2(ZZt1(Il33oc#0h>ATgp)^QW&L9SoCA$NvH_AN14XMne($de6su8^);(P^}YSzEv&xAG;`h4e`=4{CocClBnuZ8 zu?O`T1IAs(CS!|nk8$4t{J*a__Mh%UxBgxcjYTepNPE1kf7NFl^tA@dv+!?f)rG&- bfa-_8*$3}s9nW+@WpPPQ*lN-aJ~#dVZY9ZR diff --git a/Stream/uav_proto_msg/protomsg/proto/__pycache__/flymode_pb2.cpython-310.pyc b/Stream/uav_proto_msg/protomsg/proto/__pycache__/flymode_pb2.cpython-310.pyc index 24a1ecc24e7e1a6f8153f05aec7794c014e4b03c..954d35c0eeb3ec16d2173c297373745961e7a7c3 100644 GIT binary patch delta 30 kcmcaDa$AHupO=@50SFGQ>DkD=fQh9fKd*B0dZsn(0E{IGx&QzG delta 30 kcmcaDa$AHupO=@50SKIHCT`?jz{HZ0pOU|MJ<}R?0DtcY>;M1& diff --git a/Stream/uav_proto_msg/protomsg/proto/__pycache__/imu_pb2.cpython-310.pyc b/Stream/uav_proto_msg/protomsg/proto/__pycache__/imu_pb2.cpython-310.pyc index b9b0e27ae713ca11ac8d2bf63362506bc9d527f0..a03d27d780bfa43119a579c89d9d28d0bfdbf4e3 100644 GIT binary patch delta 30 kcmaDQ|4N=apO=@50SFGQ>DkEbz{XONpI5orpKUfL0E`O>CjbBd delta 30 kcmaDQ|4N=apO=@50SKIHCT`?*U}H(iPs!ix&o-MA0Dsj8SpWb4 diff --git a/Stream/uav_proto_msg/protomsg/proto/__pycache__/odom_pb2.cpython-310.pyc b/Stream/uav_proto_msg/protomsg/proto/__pycache__/odom_pb2.cpython-310.pyc index a53ba0a82a35c099e6d649708a4b578a8ac3b795..0f1b1dc36a0e106a50a2203aca332c0c29c739de 100644 GIT binary patch delta 30 kcmbOzHc^Z_pO=@50SFGQ>DkErjG3h*Kd*B0S7sS@0Dm6|C;$Ke delta 30 kcmbOzHc^Z_pO=@50SKIHCT`?@#>|qEpOU}%E3*tc0CMRFS^xk5 diff --git a/Stream/uav_proto_msg/protomsg/proto/__pycache__/timestamp_pb2.cpython-310.pyc b/Stream/uav_proto_msg/protomsg/proto/__pycache__/timestamp_pb2.cpython-310.pyc index 0e59f4646c9ba7348841c71f91eef5b26e7c76bc..ea4569fc96e966c8eba5ff546677f57b8a94737c 100644 GIT binary patch delta 30 kcmew-@K1m{pO=@50SFGQ>DkDgz{FCLpI5m#pNXFh0FC$v+5i9m delta 30 kcmew-@K1m{pO=@50SKIHCT`?TU}8zhPs!h$&&1CL0D-~?3;+NC diff --git a/Stream/uav_proto_msg/protomsg/protoMsg.pyc b/Stream/uav_proto_msg/protomsg/protoMsg.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a4b8e5642604f4da9f750f596bfc2f3c5fe417c5 GIT binary patch literal 4301 zcmc&%Pj4GV6o0m3$Ikzj04;yS1(1;-76l0o1)Mf*Nr`P(8&&mX<$5R18n4&d9Y;-6 zB&1g2h~U}}035jT1vvBzATCJ!xgd^}_yFbi-gwrVrm4b#H1Uq#yqTSO^M1eg<~jGz z;#}jmue)8E{N?an#S?#n#=|E=1EPM0+8Nu;Qa?xSobAp~KTqwv?G~s%OYK?PEmFTk z?UL=zQGcG=^R~M{{Y7do+U^qdm#M!(?G^H}miLSR#u_?`R9%lIu@K@K% z5Jyp{!&=VN*w}orks`V>h#}UPQlUR&Rw@F`$_z^>C;} zXhmaH=3Vt18XU_k=gFCM$SWOnoFML%@eWB7UxQTH2?JHp;c&0Aq2kYUII1{}rh73A zg7MJr8ZXp7X|>$ixmpDVt4>fEcXlUk#DW!ZXd-~+Yok4V8fzc+C!Z`{MMK$zjQKBR z3Yj@PXETTS)xyNX{BpCR%n6UcCh+J@;ZZ)}(Z>X5Ai$YN_#i*zNSCHO5`X$%V0kCQ z4KusU-V}tk2YZ$Q14DtQF$C=dASQ-Izlf1tH3+-D-jh(jymj5Z+;D2^t<6T=-4!qo zyz1~i4rA^x^BnexvxG)4bvRu(D`>1K=}k`xKId5&z`T#y5(cXTxQ+(uOH4Wp)Nv9) zzd$asa9#j}TqF;v0Z9aMNwD>#JC|U4n=?XxL9jLXyGVLzifswD)O&0;(fto50#zqM z(F!Y8Shd2LYKjaDgM_Xhj3o;&V4Jm16W|#;?qAu9LKp0p=#$RPskk>4_k{`k#(KA_ z2J*@*)-b)BvX_zfQu6+>+42ZNQk71+$qX ztgn#HbJTOnHZ>g5d~u2yUwHKtFdXJ`b0WD0z(cTM8rr_i&}=X#yRN*WqYx8ijan;FLD zHNhsAVDllN@Id)|;5tRsX3H{jomMX_r>|2E3-Piyj;6&FYd0neb6-YbQ11-GSarjp z7ato2&Me8wPX>q8BTTpoeFDVdW3J6jOgsz(vY4Ro>O&}8N}-TMND76ABSZk;>O%X7 z1>Ffo5+fWqEvv!BNpwZ&i{mIlt<3skBXDr(K%Er*xfq)sDFuBC1Bu_crZjbBImzL! z6#T9$g|o|{KOQJ_ITye|+V2KR?}Q#Q5pqUn5G#kXhg3t(%PhUl%{gw~;pRM=Y0!)G ze^%8Fwj(}G`~sRnHkUcQfM*WR5}tWHCG!}g*m%wPN=o!KhDq*r-rylN$P7&p=J(#^ yLH;4v3&Y+(t;w7lSEKGYfj literal 0 HcmV?d00001 diff --git a/Stream/uav_proto_msg/protomsg/size/timestamp_info_message b/Stream/uav_proto_msg/protomsg/size/timestamp_info_message deleted file mode 100644 index 068797d..0000000 --- a/Stream/uav_proto_msg/protomsg/size/timestamp_info_message +++ /dev/null @@ -1 +0,0 @@ -"2022-12-08T07:22:43.602554Z" \ No newline at end of file diff --git a/Stream/uav_proto_msg/protomsg/size/timestamp_info_message.bin b/Stream/uav_proto_msg/protomsg/size/timestamp_info_message.bin deleted file mode 100644 index b85b6da..0000000 --- a/Stream/uav_proto_msg/protomsg/size/timestamp_info_message.bin +++ /dev/null @@ -1 +0,0 @@ -áƜ𜔟 \ No newline at end of file diff --git a/Stream/uav_proto_msg/protomsg/size_test.py b/Stream/uav_proto_msg/protomsg/size_test.py index 19a6813..0c609d6 100644 --- a/Stream/uav_proto_msg/protomsg/size_test.py +++ b/Stream/uav_proto_msg/protomsg/size_test.py @@ -1,8 +1,10 @@ import os from protoMsg import protoMsgWrapper +import copy +import orjson def file(message, path, json=False, serial=False): - path = "size/" + path + path = "JsonProtosize/" + path if serial: with open(path+".bin", "wb") as f: f.write(message) @@ -35,20 +37,33 @@ def json_msg(): for message in js: file(message, serial_name[js.index(message)], json=True) -if __name__ == '__main__': +def toFile(fileName:str, compare_size:dict): + with open(fileName, "w+") as f: + f.write(orjson.dumps(compare_size).decode("UTF-8")) + +if __name__=='__main__': serial_name = ["flight_info_message", "fly_format_message", "imu_info_message", "odom_info_message", "flymode_info_message", "duration_info_message", "timestamp_info_message"] proto_msg() json_msg() serlizl_size = 0 json_size = 0 - size = {"flight_info_message":{"Json":None, "Proto":None}} - files = sorted(os.listdir("size")) + compare_size_prototype = {"json":None, "proto":None} + compare_size = dict((name, copy.deepcopy(compare_size_prototype))for name in serial_name) + files = sorted(os.listdir("JsonProtosize")) for file in files: - size = os.path.getsize("size/"+file) - print(file, size) + size = os.path.getsize("JsonProtosize/"+file) + if file.endswith(".bin"): + name = file.replace(".bin", "") + compare_size[name]["proto"] = size serlizl_size += size else: + compare_size[file]["json"] = size json_size += size + compare_size["Total"] = {"json":json_size, "proto":serlizl_size} + print(compare_size) print("json - serial = ", json_size - serlizl_size) + fileName = "Data/sizeData" + toFile(fileName, compare_size) + diff --git a/Stream/uav_proto_msg/protomsg/timeit_test.py b/Stream/uav_proto_msg/protomsg/timeit_test.py index 86d2b3d..e1eed8c 100644 --- a/Stream/uav_proto_msg/protomsg/timeit_test.py +++ b/Stream/uav_proto_msg/protomsg/timeit_test.py @@ -38,19 +38,26 @@ def json_serialize(lib): data.update(dataGpsUpdate) js = lib.dumps(data).decode("utf-8") # print(js) + def json_deserialize(lib): js = lib.loads(a) # print(js) - - - -proto_serialize_time = timeit.timeit(lambda: proto_serialize(), number = 150000) -proto_deserialize_time = timeit.timeit(lambda: proto_deserialize(proto_deserialize_msg), number = 150000) -json_serialize_time = timeit.timeit(lambda: json_serialize(orjson), number = 150000) -json_deserialize_time = timeit.timeit(lambda: json_deserialize(orjson), number = 150000) -print(f"proto_serialize_time: {proto_serialize_time}") -print(f"json_serialize_time: {json_serialize_time}") -print() -print(f"proto_deserialize_time: {proto_deserialize_time}") -print(f"json_deserialize_time: {json_deserialize_time}") \ No newline at end of file +def toFile(fileName:str, compare_time:dict): + with open(fileName, "w+") as f: + f.write(orjson.dumps(compare_time).decode("UTF-8")) + + +if __name__=='__main__': + proto_serialize_time = timeit.timeit(lambda: proto_serialize(), number = 1000000) + proto_deserialize_time = timeit.timeit(lambda: proto_deserialize(proto_deserialize_msg), number = 1000000) + json_serialize_time = timeit.timeit(lambda: json_serialize(orjson), number = 1000000) + json_deserialize_time = timeit.timeit(lambda: json_deserialize(orjson), number = 1000000) + time_dict = {"serialize": {"json": json_serialize_time, "proto":proto_serialize_time}, "deserializ":{"json": json_deserialize_time, "proto":proto_deserialize_time}} + print(f"proto_serialize_time: {proto_serialize_time}") + print(f"json_serialize_time: {json_serialize_time}") + print() + print(f"proto_deserialize_time: {proto_deserialize_time}") + print(f"json_deserialize_time: {json_deserialize_time}") + fileName = "Data/timeData" + toFile(fileName, time_dict) \ No newline at end of file