TL; 博士
连接速度更快,更一致。但是对于 1 或 2 个变量,差异很小(对于 1 亿次调用,低于 0.3 秒)。
编辑
在第二次运行之后,连接似乎是两者中速度更快的。
所以,我想通过提供一个更广泛的测试来扩展模拟 nico 的答案,并且还(有点)研究了这两个功能的可扩展性。
pastebin 上的代码
我决定为每个函数使用四个测试用例,前面有一个变量,一个在末尾,一个在中间,中间有两个变量。基本设置是一样的。我只使用了 100,000,000 次函数迭代,这些迭代运行了 100 次。我使用相同的机制来防止优化,即获取结果字符串的长度总和并记录下来。我还记录了所需的时间(让我猜测需要多长时间),但也将其保存到一个数组中。
之后,我计算了每种方法的平均值、最小值、最大值和标准偏差。
结果如下:
{
sum: {
t: {
start: 2072751,
mid: 2338476,
end: 2083695,
double: 2950287
},
c: {
start: 2086059,
mid: 2345551,
end: 2074732,
double: 2922929
}
},
avg: {
t: {
start: 20727.51,
mid: 23384.76,
end: 20836.95,
double: 29502.87
},
c: {
start: 20860.59,
mid: 23455.51,
end: 20747.32,
double: 29229.29
}
},
sd: {
t: {
start: 335.6251329981114,
mid: 282.9490809315344,
end: 286.2220947096852,
double: 216.40844045461824
},
c: {
start: 255.4803356424913,
mid: 221.48744862858484,
end: 238.98242111084238,
double: 209.9309074433776
}
},
min: {
t: {
start: 20490,
mid: 23216,
end: 20588,
double: 29271
},
c: {
start: 20660,
mid: 23258,
end: 20534,
double: 28985
}
},
max: {
t: {
start: 23279,
mid: 25616,
end: 22887,
double: 30843
},
c: {
start: 22603,
mid: 25062,
end: 22403,
double: 30536
}
}
}
在值t
-objects是模板,在值c
-objects是串联。start
表示变量在开头,mid 表示在中间,end 表示在末尾,double 表示有两个变量。sum
是所有 100 次运行的总和。avg
是平均运行,这意味着它是sum / 100
。sd
这是一个简单的方法,维基百科(简单英语)。min
和max
分别是运行的最小值和最大值。
结果
考虑到平均值较低且最小值较低,对于不位于字符串末尾的单个变量,模板似乎更快。如果将变量放在字符串的末尾或字符串中有多个变量,则连接速度会更快。
尽管就前两个条件而言,模板的最小值和平均值都优于它们的串联对应物,但标准偏差始终更差。差异似乎随着更多变量(需要更多测试)而缩小。
由于大多数模板可能不会仅用于字符串中的一个变量,因此可以说坚持连接会产生更好的性能。但区别是(至少现在)非常微小。在具有两个变量的 100,000,000(1 亿)次评估中,差异仅为 273,58 毫秒,大约四分之一秒......
第二次运行
第二次运行看起来有些不同。除了最大值、平均绝对偏差和标准偏差,每个测量都证明串联比模板快。
当变量位于字符串末尾或字符串中有两个变量时,提到的三个测量具有较低(因此更好)的模板值。
结果如下:
{
"sum": {
"t": {
"start": 1785103,
"mid": 1826679,
"end": 1719594,
"double": 2110823,
"many": 4153368
},
"c": {
"start": 1720260,
"mid": 1799579,
"end": 1716883,
"double": 2097473,
"many": 3836265
}
},
"avg": {
"t": {
"start": 17851.03,
"mid": 18266.79,
"end": 17195.94,
"double": 21108.23,
"many": 41533.68
},
"c": {
"start": 17202.6,
"mid": 17995.79,
"end": 17168.83,
"double": 20974.73,
"many": 38362.65
}
},
"sd": {
"t": {
"start": 858.7857061572462,
"mid": 886.0941856823124,
"end": 786.5366719994689,
"double": 905.5376950188214,
"many": 1744.9005638144542
},
"c": {
"start": 599.0468429096342,
"mid": 719.1084521127534,
"end": 935.9367719563112,
"double": 991.5642274204934,
"many": 1465.1116774840066
}
},
"aad": {
"t": {
"start": 579.1207999999996,
"mid": 576.5628000000003,
"end": 526.8268,
"double": 586.9651999999998,
"many": 1135.9432000000002
},
"c": {
"start": 467.96399999999966,
"mid": 443.09220000000016,
"end": 551.1318000000008,
"double": 610.2321999999999,
"many": 1020.1310000000003
}
},
"min": {
"t": {
"start": 16932,
"mid": 17238,
"end": 16387,
"double": 20016,
"many": 39327
},
"c": {
"start": 16477,
"mid": 17137,
"end": 16226,
"double": 19863,
"many": 36424
}
},
"max": {
"t": {
"start": 23310,
"mid": 24102,
"end": 21258,
"double": 26883,
"many": 49103
},
"c": {
"start": 19328,
"mid": 23203,
"end": 22859,
"double": 26875,
"many": 44352
}
},
"median": {
"t": {
"start": 17571,
"mid": 18062,
"end": 16974,
"double": 20874,
"many": 41171.5
},
"c": {
"start": 16893.5,
"mid": 18213,
"end": 17016.5,
"double": 20771,
"many": 38849
}
}
}
代码在这里