using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.CompilerServices;
namespace ConsoleApplication85
{
class Program
{
static void Main()
{
int n = 100000;
var results1 = new long[10];
var results2 = new long[10];
for (int i = 0; i < results1.Length; i++)
{
results1[i] = Test(0, n, Concat);
results2[i] = Test(n, n, Insert);
}
Console.WriteLine("Concat = {0}{2}Insert = {1}", results1.Average(), results2.Average(), Environment.NewLine);
Console.ReadKey();
}
private static long Test(int start, int n, Func<string,string,string> func)
{
var sw = Stopwatch.StartNew();
var strings = new string[n];
for (int i = 0, j = start; i < strings.Length; i++, j++)
{
strings[i] = func(j.ToString(), j.ToString());
}
sw.Stop();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
return sw.ElapsedMilliseconds;
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static string Concat(string a, string b)
{
return a + b;
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static string Insert(string a, string b)
{
return b.Insert(0, a);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CnVzaW5nIFN5c3RlbS5MaW5xOwp1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwoKbmFtZXNwYWNlIENvbnNvbGVBcHBsaWNhdGlvbjg1CnsKICAgIGNsYXNzIFByb2dyYW0KICAgIHsKICAgICAgICBzdGF0aWMgdm9pZCBNYWluKCkKICAgICAgICB7CiAgICAgICAgICAgIGludCBuID0gMTAwMDAwOwogICAgICAgICAgICB2YXIgcmVzdWx0czEgPSBuZXcgbG9uZ1sxMF07CiAgICAgICAgICAgIHZhciByZXN1bHRzMiA9IG5ldyBsb25nWzEwXTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzMS5MZW5ndGg7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmVzdWx0czFbaV0gPSBUZXN0KDAsIG4sIENvbmNhdCk7CiAgICAgICAgICAgICAgICByZXN1bHRzMltpXSA9IFRlc3QobiwgbiwgSW5zZXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQ29uY2F0ID0gezB9ezJ9SW5zZXJ0ID0gezF9IiwgcmVzdWx0czEuQXZlcmFnZSgpLCByZXN1bHRzMi5BdmVyYWdlKCksIEVudmlyb25tZW50Lk5ld0xpbmUpOwogICAgICAgICAgICBDb25zb2xlLlJlYWRLZXkoKTsKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgc3RhdGljIGxvbmcgVGVzdChpbnQgc3RhcnQsIGludCBuLCBGdW5jPHN0cmluZyxzdHJpbmcsc3RyaW5nPiBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHN3ID0gU3RvcHdhdGNoLlN0YXJ0TmV3KCk7CiAgICAgICAgICAgIHZhciBzdHJpbmdzID0gbmV3IHN0cmluZ1tuXTsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGogPSBzdGFydDsgaSA8IHN0cmluZ3MuTGVuZ3RoOyBpKyssIGorKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RyaW5nc1tpXSA9IGZ1bmMoai5Ub1N0cmluZygpLCBqLlRvU3RyaW5nKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN3LlN0b3AoKTsKICAgICAgICAgICAgR0MuQ29sbGVjdCgpOwogICAgICAgICAgICBHQy5XYWl0Rm9yUGVuZGluZ0ZpbmFsaXplcnMoKTsKICAgICAgICAgICAgR0MuQ29sbGVjdCgpOwogICAgICAgICAgICByZXR1cm4gc3cuRWxhcHNlZE1pbGxpc2Vjb25kczsKICAgICAgICB9CgogICAgICAgIFtNZXRob2RJbXBsKE1ldGhvZEltcGxPcHRpb25zLk5vSW5saW5pbmcpXQogICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBDb25jYXQoc3RyaW5nIGEsIHN0cmluZyBiKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGEgKyBiOwogICAgICAgIH0KCiAgICAgICAgW01ldGhvZEltcGwoTWV0aG9kSW1wbE9wdGlvbnMuTm9JbmxpbmluZyldCiAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEluc2VydChzdHJpbmcgYSwgc3RyaW5nIGIpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gYi5JbnNlcnQoMCwgYSk7CiAgICAgICAgfQogICAgfQp9Cg==