有个功能,把网络解析出来色数据,发送到指定服务器中。实现方案是解析出来的数据放到一个队列,发送线程定时1s从队列中读出数据,通过json来拼装一个字符串,最后通过sokect把数据发出去。但是当数据量大时,出现了发送线程慢的问题,就是说写队列(有分内存)比读队列快(释放内存),所以导致了内存堆积,最后内存号完了。产生了oom。
解决这个问题,就是对列大小做了限制,超过了一定数量就不入队了,
json拼装字符串的工作,看着很简单,但是深入json源码,发现代码逻辑还是比较复杂的。所以决定测一下性能,感觉json最后生成的字符串比较简单,所以采用了字符串直接拼接来做对比。统计的是发送线程处理10000个数据的时间。
ptmalloc 字符串 | ptmalloc json |
cost | cost |
136503255 | 865849445 |
94390937 | 501576043 |
107136028 | 660325834 |
165560971 | 677858996 |
149622027 | 498675625 |
104906645 | 585718050 |
117702061 | 398178281 |
142683821 | 499244664 |
109723691 | 493010446 |
287851874 | 498472806 |
131795982 | 474277930 |
102492069 | 672462557 |
99929375 | 478949276 |
161406965 | 581461028 |
209037419 | 629864594 |
83959895 | 542105357 |
109194205 | 670715035 |
117447262 | 694172184 |
130906713 | 504037360 |
212439303 | 505776759 |
164401141 | 449425986 |
111838992 | 515644408 |
102742461 | 545234213 |
93900642 | 825517226 |
119487330 | 759949066 |
140358563 | 429193580 |
141726192 | 553129380 |
88606194 | 1036867572 |
90500167 | 811409272 |
169908390 | 725724140 |
121346115 | 727657879 |
124210905 | 613775118 |
98418483 | 633068804 |
142694597 | 889261153 |
107757376 | 463395237 |
120854040 | 485081219 |
167375239 | 734893372 |
91796337 | 609344651 |
120624887 | 534586870 |
137384464 | 479512050 |
111307098 | 485206383 |
126759901 | 371798365 |
155444339 | 770634022 |
119814257 | 1159298938 |
91779423 | 370871698 |
140215518 | 880513267 |
91354004 | 614751217 |
215857252 | 526709734 |
118725771 | 474568940 |
125455508 | 410049891 |
185731605 | 725962458 |
184645827 | 531261987 |
133171066 | 629015489 |
80294891 | 431675344 |
120746084 | 424027970 |
126492251 | 430218838 |
106859707 | 851205006 |
116950673 | 559102129 |
121955000 | 580289220 |
133310169 | 594716461 |
246773623 | 605580993 |
87364257 | 563490049 |
110932381 | 803470540 |
113660861 | 599588314 |
88527854 | 863366080 |
191599741 | 1050613406 |
112640217 | 610210231 |
99208009 | 565249675 |
126518664 | 656321679 |
116236646 | 714844498 |
134600705 | 896680175 |
103816699 | 680343414 |
134400018 | 787742450 |
101445414 | 615364775 |
124091284 | 483825873 |
145079233 | 1110204997 |
196357191 | 1093047912 |
181905126 | 811547721 |
231944165 | 571346940 |
174812865 | 677974905 |
126987673 | 384406748 |
163494287 | 460927214 |
117883773 | 746618239 |
155663397 | 918249599 |
122994332 | 653145290 |
131296817 | 542704185 |
94961426 | 570209960 |
121801449 | 541528103 |
95824027 | 870805307 |
95293511 | 671642683 |
134260208 | 561124990 |
171989445 | 509016324 |
116858128 | 374951892 |
193769955 | 633969402 |
115741846 | 474738290 |
140722548 | 452654101 |
109473052 | 634708514 |
189760346 | 415197742 |
133686120 | 972496061 |
133251218.7 | 628557475.7 |
时间单位是ns,
采用json串处理10000个数据的平均时间是 628557475.7ns
采用字符串拼装处理10000个数据的平均时间是 133251218.7ns
字符串拼装比json快了近5倍。