Golang 性能忽然增加变慢10倍的现象,推测是编译器在spilt stack,导致的问题

前端之家收集整理的这篇文章主要介绍了Golang 性能忽然增加变慢10倍的现象,推测是编译器在spilt stack,导致的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本测试分别执行三种测试:

1.程序嵌套调用时使用int;

2.程序嵌套调用时使用int+string;

3.程序嵌套调用时使用int+interface{};

测试脚本如下:

//stackSplitTest
packagemain

import(
"fmt"
"time"
)

//测试函数嵌套多少次后,进行runtion.stackSplit,导致运行效率急剧下降

varC=make(chanint,100)
varF="嵌套次数%5d,From=%5d,To=%5d,Group=%6d,耗时%7s毫秒\t%d\n"

//计算函数
funcsum(fromint,toint)(rint){
r=0
fori:=from;i<=to;i++{
r+=i
}
return
}

//嵌套调用
funcNestedCall1(nint,fromint,toint,grpint,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80int)(rint){
ifn<=0{
r=0
forg:=0;g<grp;g++{
r+=sum(from,to)
}
return
}else{
returnNestedCall1(n-1,from,to,grp,a80)
}
}

funcNestedTest1(){
fori:=0;i<=500;i++{
begin:=time.Now()
N:=NestedCall1(i,1,10,1000000,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80)
end:=time.Now()
use:=int64(end.Sub(begin).Seconds()*1000)
fmt.Printf(F,i,1000,100,fmt.Sprint(use),N)

}
C<-0
}

//嵌套调用
funcNestedCall2(nint,a80int,sstring)(rint){
ifn<=0{
r=0
forg:=0;g<grp;g++{
r+=sum(from,to)
}
return
}else{
returnNestedCall2(n-1,a80,s)
}
}
funcNestedTest2(){
fori:=0;i<=500;i++{
begin:=time.Now()
N:=NestedCall2(i,80,"")
end:=time.Now()
use:=int64(end.Sub(begin).Seconds()*1000)
fmt.Printf(F,N)
}
C<-0
}

funcNestedCall3(nint,sinterface{})(rint){
ifn<=0{
r=0
forg:=0;g<grp;g++{
r+=sum(from,to)
}
return
}else{
returnNestedCall3(n-1,s)
}
}
funcNestedTest3(){
fori:=0;i<=500;i++{
begin:=time.Now()
N:=NestedCall3(i,N)
}
C<-0
}

funcmain(){
fmt.Println("----------NestedTest1----------")
goNestedTest1()
<-C
fmt.Println("----------NestedTest2----------")
goNestedTest2()
<-C
fmt.Println("----------NestedTest3----------")
goNestedTest3()
<-C
}

执行结果如下:

----------NestedTest1----------

嵌套次数 0,From= 1,To= 1000,Group= 100,耗时 37毫秒 55000000

嵌套次数 1,耗时 35毫秒 55000000

嵌套次数 2,耗时 39毫秒 55000000

嵌套次数 3,耗时 28毫秒 55000000

嵌套次数 4,耗时 29毫秒 55000000

嵌套次数 5,耗时 34毫秒 55000000

嵌套次数 6,255);">嵌套次数 7,255);">嵌套次数 8,255);">嵌套次数 9,255);">嵌套次数 10,耗时 31毫秒 55000000

嵌套次数 11,耗时 26毫秒 55000000

嵌套次数 12,255);">嵌套次数 13,耗时 27毫秒 55000000

嵌套次数 14,255);">嵌套次数 15,255);">嵌套次数 16,耗时 36毫秒 55000000

嵌套次数 17,255);">嵌套次数 18,255);">嵌套次数 19,255);">嵌套次数 20,255);">嵌套次数 21,255);">嵌套次数 22,255);">嵌套次数 23,255);">嵌套次数 24,耗时 30毫秒 55000000

嵌套次数 25,255);">嵌套次数 26,255);">嵌套次数 27,255);">嵌套次数 28,耗时 32毫秒 55000000

嵌套次数 29,255);">嵌套次数 30,255);">嵌套次数 31,255);">嵌套次数 32,255);">嵌套次数 33,255);">嵌套次数 34,255);">嵌套次数 35,255);">嵌套次数 36,255);">嵌套次数 37,255);">嵌套次数 38,255);">嵌套次数 39,255);">嵌套次数 40,255);">嵌套次数 41,255);">嵌套次数 42,耗时 216毫秒 55000000<-性能降低

嵌套次数 43,255);">嵌套次数 44,耗时 33毫秒 55000000

嵌套次数 45,255);">嵌套次数 46,255);">嵌套次数 47,255);">嵌套次数 48,255);">嵌套次数 49,255);">嵌套次数 50,255);">嵌套次数 51,255);">嵌套次数 52,255);">嵌套次数 53,255);">嵌套次数 54,255);">嵌套次数 55,255);">嵌套次数 56,255);">嵌套次数 57,255);">嵌套次数 58,耗时 38毫秒 55000000

嵌套次数 59,255);">嵌套次数 60,255);">嵌套次数 61,255);">嵌套次数 62,255);">嵌套次数 63,255);">嵌套次数 64,耗时 214毫秒 55000000<-性能降低

嵌套次数 65,255);">嵌套次数 66,255);">嵌套次数 67,255);">嵌套次数 68,255);">嵌套次数 69,255);">嵌套次数 70,255);">嵌套次数 71,255);">嵌套次数 72,255);">嵌套次数 73,255);">嵌套次数 74,255);">嵌套次数 75,255);">嵌套次数 76,255);">嵌套次数 77,255);">嵌套次数 78,255);">嵌套次数 79,255);">嵌套次数 80,255);">嵌套次数 81,255);">嵌套次数 82,255);">嵌套次数 83,255);">嵌套次数 84,255);">嵌套次数 85,255);">嵌套次数 86,耗时 218毫秒 55000000嵌套次数 87,255);">嵌套次数 88,255);">嵌套次数 89,255);">嵌套次数 90,255);">嵌套次数 91,255);">嵌套次数 92,255);">嵌套次数 93,255);">嵌套次数 94,255);">嵌套次数 95,255);">嵌套次数 96,耗时 40毫秒 55000000

嵌套次数 97,255);">嵌套次数 98,255);">嵌套次数 99,255);">嵌套次数 100,255);">嵌套次数 101,255);">嵌套次数 102,255);">嵌套次数 103,255);">嵌套次数 104,255);">嵌套次数 105,255);">嵌套次数 106,255);">嵌套次数 107,255);">嵌套次数 108,耗时 215毫秒 55000000

嵌套次数 109,255);">嵌套次数 110,255);">嵌套次数 111,255);">嵌套次数 112,255);">嵌套次数 113,255);">嵌套次数 114,255);">嵌套次数 115,255);">嵌套次数 116,耗时 25毫秒 55000000

嵌套次数 117,255);">嵌套次数 118,255);">嵌套次数 119,255);">嵌套次数 120,255);">嵌套次数 121,255);">嵌套次数 122,255);">嵌套次数 123,255);">嵌套次数 124,255);">嵌套次数 125,255);">嵌套次数 126,255);">嵌套次数 127,255);">嵌套次数 128,255);">嵌套次数 129,255);">嵌套次数 130,耗时 216毫秒 55000000嵌套次数 131,255);">嵌套次数 132,255);">嵌套次数 133,255);">嵌套次数 134,255);">嵌套次数 135,255);">嵌套次数 136,255);">嵌套次数 137,255);">嵌套次数 138,255);">嵌套次数 139,255);">嵌套次数 140,255);">嵌套次数 141,255);">嵌套次数 142,255);">嵌套次数 143,255);">嵌套次数 144,255);">嵌套次数 145,255);">嵌套次数 146,255);">嵌套次数 147,255);">嵌套次数 148,255);">嵌套次数 149,255);">嵌套次数 150,255);">嵌套次数 151,255);">嵌套次数 152,耗时 213毫秒 55000000

嵌套次数 153,255);">嵌套次数 154,255);">嵌套次数 155,255);">嵌套次数 156,255);">嵌套次数 157,255);">嵌套次数 158,255);">嵌套次数 159,255);">嵌套次数 160,255);">嵌套次数 161,255);">嵌套次数 162,255);">嵌套次数 163,255);">嵌套次数 164,255);">嵌套次数 165,255);">嵌套次数 166,255);">嵌套次数 167,255);">嵌套次数 168,255);">嵌套次数 169,255);">嵌套次数 170,255);">嵌套次数 171,255);">嵌套次数 172,255);">嵌套次数 173,255);">嵌套次数 174,耗时 213毫秒 55000000嵌套次数 175,255);">嵌套次数 176,255);">嵌套次数 177,255);">嵌套次数 178,255);">嵌套次数 179,255);">嵌套次数 180,255);">嵌套次数 181,255);">嵌套次数 182,255);">嵌套次数 183,255);">嵌套次数 184,255);">嵌套次数 185,255);">嵌套次数 186,255);">嵌套次数 187,255);">嵌套次数 188,耗时 44毫秒 55000000

嵌套次数 189,255);">嵌套次数 190,耗时 43毫秒 55000000

嵌套次数 191,255);">嵌套次数 192,255);">嵌套次数 193,255);">嵌套次数 194,255);">嵌套次数 195,255);">嵌套次数 196,耗时 217毫秒 55000000嵌套次数 197,255);">嵌套次数 198,255);">嵌套次数 199,255);">嵌套次数 200,255);">嵌套次数 201,255);">嵌套次数 202,255);">嵌套次数 203,255);">嵌套次数 204,255);">嵌套次数 205,255);">嵌套次数 206,255);">嵌套次数 207,255);">嵌套次数 208,255);">嵌套次数 209,255);">嵌套次数 210,255);">嵌套次数 211,耗时 60毫秒 55000000

嵌套次数 212,耗时 83毫秒 55000000

嵌套次数 213,耗时 52毫秒 55000000

嵌套次数 214,耗时 55毫秒 55000000

嵌套次数 215,255);">嵌套次数 216,255);">嵌套次数 217,耗时 61毫秒 55000000

嵌套次数 218,耗时 300毫秒 55000000嵌套次数 219,耗时 78毫秒 55000000

嵌套次数 220,耗时 51毫秒 55000000

嵌套次数 221,255);">嵌套次数 222,255);">嵌套次数 223,耗时 49毫秒 55000000

嵌套次数 224,255);">嵌套次数 225,255);">嵌套次数 226,耗时 47毫秒 55000000

嵌套次数 227,255);">嵌套次数 228,255);">嵌套次数 229,255);">嵌套次数 230,255);">嵌套次数 231,255);">嵌套次数 232,255);">嵌套次数 233,255);">嵌套次数 234,255);">嵌套次数 235,255);">嵌套次数 236,255);">嵌套次数 237,255);">嵌套次数 238,255);">嵌套次数 239,255);">嵌套次数 240,耗时 259毫秒 55000000嵌套次数 241,255);">嵌套次数 242,255);">嵌套次数 243,255);">嵌套次数 244,耗时 64毫秒 55000000

嵌套次数 245,255);">嵌套次数 246,255);">嵌套次数 247,255);">嵌套次数 248,255);">嵌套次数 249,耗时 41毫秒 55000000

嵌套次数 250,255);">嵌套次数 251,255);">嵌套次数 252,255);">嵌套次数 253,255);">嵌套次数 254,255);">嵌套次数 255,255);">嵌套次数 256,255);">嵌套次数 257,255);">嵌套次数 258,255);">嵌套次数 259,255);">嵌套次数 260,255);">嵌套次数 261,255);">嵌套次数 262,耗时 249毫秒 55000000

嵌套次数 263,255);">嵌套次数 264,255);">嵌套次数 265,255);">嵌套次数 266,255);">嵌套次数 267,255);">嵌套次数 268,255);">嵌套次数 269,255);">嵌套次数 270,耗时 45毫秒 55000000

嵌套次数 271,255);">嵌套次数 272,255);">嵌套次数 273,255);">嵌套次数 274,255);">嵌套次数 275,255);">嵌套次数 276,255);">嵌套次数 277,255);">嵌套次数 278,耗时 46毫秒 55000000

嵌套次数 279,255);">嵌套次数 280,255);">嵌套次数 281,255);">嵌套次数 282,耗时 56毫秒 55000000

嵌套次数 283,耗时 69毫秒 55000000

嵌套次数 284,耗时 432毫秒 55000000

嵌套次数 285,255);">嵌套次数 286,耗时 90毫秒 55000000

嵌套次数 287,255);">嵌套次数 288,255);">嵌套次数 289,耗时 48毫秒 55000000

嵌套次数 290,255);">嵌套次数 291,255);">嵌套次数 292,255);">嵌套次数 293,255);">嵌套次数 294,255);">嵌套次数 295,255);">嵌套次数 296,255);">嵌套次数 297,255);">嵌套次数 298,255);">嵌套次数 299,255);">嵌套次数 300,255);">嵌套次数 301,255);">嵌套次数 302,255);">嵌套次数 303,255);">嵌套次数 304,255);">嵌套次数 305,255);">嵌套次数 306,耗时 254毫秒 55000000

嵌套次数 307,255);">嵌套次数 308,255);">嵌套次数 309,255);">嵌套次数 310,255);">嵌套次数 311,255);">嵌套次数 312,255);">嵌套次数 313,255);">嵌套次数 314,255);">嵌套次数 315,255);">嵌套次数 316,255);">嵌套次数 317,255);">嵌套次数 318,255);">嵌套次数 319,255);">嵌套次数 320,255);">嵌套次数 321,255);">嵌套次数 322,255);">嵌套次数 323,255);">嵌套次数 324,耗时 42毫秒 55000000

嵌套次数 325,255);">嵌套次数 326,255);">嵌套次数 327,255);">嵌套次数 328,耗时 255毫秒 55000000

嵌套次数 329,255);">嵌套次数 330,255);">嵌套次数 331,255);">嵌套次数 332,255);">嵌套次数 333,255);">嵌套次数 334,255);">嵌套次数 335,255);">嵌套次数 336,255);">嵌套次数 337,255);">嵌套次数 338,255);">嵌套次数 339,255);">嵌套次数 340,255);">嵌套次数 341,255);">嵌套次数 342,耗时 77毫秒 55000000

嵌套次数 343,255);">嵌套次数 344,255);">嵌套次数 345,255);">嵌套次数 346,255);">嵌套次数 347,255);">嵌套次数 348,255);">嵌套次数 349,255);">嵌套次数 350,耗时 278毫秒 55000000

嵌套次数 351,255);">嵌套次数 352,耗时 81毫秒 55000000

嵌套次数 353,255);">嵌套次数 354,255);">嵌套次数 355,255);">嵌套次数 356,255);">嵌套次数 357,255);">嵌套次数 358,255);">嵌套次数 359,255);">嵌套次数 360,255);">嵌套次数 361,255);">嵌套次数 362,255);">嵌套次数 363,255);">嵌套次数 364,255);">嵌套次数 365,255);">嵌套次数 366,耗时 59毫秒 55000000

嵌套次数 367,255);">嵌套次数 368,255);">嵌套次数 369,耗时 116毫秒 55000000

嵌套次数 370,255);">嵌套次数 371,255);">嵌套次数 372,耗时 308毫秒 55000000

嵌套次数 373,255);">嵌套次数 374,255);">嵌套次数 375,255);">嵌套次数 376,255);">嵌套次数 377,255);">嵌套次数 378,255);">嵌套次数 379,255);">嵌套次数 380,255);">嵌套次数 381,255);">嵌套次数 382,255);">嵌套次数 383,255);">嵌套次数 384,255);">嵌套次数 385,255);">嵌套次数 386,255);">嵌套次数 387,255);">嵌套次数 388,255);">嵌套次数 389,255);">嵌套次数 390,255);">嵌套次数 391,耗时 58毫秒 55000000

嵌套次数 392,255);">嵌套次数 393,255);">嵌套次数 394,耗时 258毫秒 55000000

嵌套次数 395,255);">嵌套次数 396,255);">嵌套次数 397,255);">嵌套次数 398,255);">嵌套次数 399,255);">嵌套次数 400,255);">嵌套次数 401,255);">嵌套次数 402,255);">嵌套次数 403,255);">嵌套次数 404,255);">嵌套次数 405,255);">嵌套次数 406,255);">嵌套次数 407,255);">嵌套次数 408,255);">嵌套次数 409,255);">嵌套次数 410,255);">嵌套次数 411,255);">嵌套次数 412,255);">嵌套次数 413,255);">嵌套次数 414,255);">嵌套次数 415,255);">嵌套次数 416,耗时 222毫秒 55000000

嵌套次数 417,255);">嵌套次数 418,255);">嵌套次数 419,255);">嵌套次数 420,255);">嵌套次数 421,255);">嵌套次数 422,255);">嵌套次数 423,255);">嵌套次数 424,255);">嵌套次数 425,255);">嵌套次数 426,255);">嵌套次数 427,255);">嵌套次数 428,255);">嵌套次数 429,255);">嵌套次数 430,255);">嵌套次数 431,255);">嵌套次数 432,255);">嵌套次数 433,255);">嵌套次数 434,255);">嵌套次数 435,255);">嵌套次数 436,255);">嵌套次数 437,255);">嵌套次数 438,耗时 226毫秒 55000000

嵌套次数 439,255);">嵌套次数 440,255);">嵌套次数 441,255);">嵌套次数 442,耗时 118毫秒 55000000

嵌套次数 443,255);">嵌套次数 444,255);">嵌套次数 445,255);">嵌套次数 446,255);">嵌套次数 447,255);">嵌套次数 448,255);">嵌套次数 449,255);">嵌套次数 450,255);">嵌套次数 451,255);">嵌套次数 452,255);">嵌套次数 453,255);">嵌套次数 454,耗时 65毫秒 55000000

嵌套次数 455,255);">嵌套次数 456,255);">嵌套次数 457,255);">嵌套次数 458,255);">嵌套次数 459,255);">嵌套次数 460,耗时 252毫秒 55000000

嵌套次数 461,255);">嵌套次数 462,255);">嵌套次数 463,255);">嵌套次数 464,255);">嵌套次数 465,255);">嵌套次数 466,255);">嵌套次数 467,255);">嵌套次数 468,255);">嵌套次数 469,255);">嵌套次数 470,255);">嵌套次数 471,255);">嵌套次数 472,255);">嵌套次数 473,255);">嵌套次数 474,255);">嵌套次数 475,255);">嵌套次数 476,255);">嵌套次数 477,255);">嵌套次数 478,255);">嵌套次数 479,255);">嵌套次数 480,255);">嵌套次数 481,255);">嵌套次数 482,耗时 216毫秒 55000000

嵌套次数 483,255);">嵌套次数 484,255);">嵌套次数 485,255);">嵌套次数 486,255);">嵌套次数 487,255);">嵌套次数 488,255);">嵌套次数 489,255);">嵌套次数 490,255);">嵌套次数 491,255);">嵌套次数 492,255);">嵌套次数 493,255);">嵌套次数 494,255);">嵌套次数 495,255);">嵌套次数 496,255);">嵌套次数 497,255);">嵌套次数 498,255);">嵌套次数 499,255);">嵌套次数 500,255);">----------NestedTest2----------

----------NestedTest3----------

嵌套次数40后,耗时忽然增加10倍,以后每过22次,耗时忽然增加10倍;

怀疑spilt stack,导致程序在新stack和老stack中来回切换,导致程序运行效率下降;

2,测试2

在使用变长的string参数后,程序运行变得平稳。

由于存在变长参数,可能嵌套调用时参数并不直接缓存在stack,因此不存在该问题;

3,测试3

在使用变长的interface{}参数后,程序运行变得平稳。

由于存在变长参数,可能嵌套调用时参数并不直接缓存在stack,因此不存在该问题;

猜你在找的Go相关文章