using System;
using System.Diagnostics;
using System.Text;
public class Test
{
static string ExpandStringGuffa(string str, int length)
{
if (length <= str.Length) return str.Substring(0, length);
while (str.Length * 2 <= length)
{
str += str;
}
if (str.Length < length)
{
str += str.Substring(0, length - str.Length);
}
return str;
}
static string ExpandStringSb(string str, int length)
{
if (length <= str.Length) return str.Substring(0, length);
var sb = new StringBuilder(str, length);
while (sb.Length * 2 <= length)
{
sb.Append(sb);
}
if (sb.Length < length)
{
sb.Append(sb.ToString(), 0, length - sb.Length);
}
return sb.ToString();
}
static string ExpandStringCharArr(string str, int length)
{
var i = str.Length;
if (i >= length) return str.Substring(0, length);
var result = new char[length];
Array.Copy(str.ToCharArray(), 0, result, 0, i);
while (i * 2 <= length)
{
Array.Copy(result, 0, result, i, i);
i *= 2;
}
if (i < length)
{
Array.Copy(result, 0, result, i, length - i);
}
return new String(result);
}
public static void Main()
{
Console.WriteLine("Guffa\t\t\tStringBuilder\t\t\tCharArray");
Console.WriteLine("-------------------------------------------------");
var sw = new Stopwatch();
sw.Restart();
for(var i = 0; i < 1000; i++) ExpandStringGuffa("Test", i);
sw.Stop();
Console.Write(sw.ElapsedTicks + "\t\t\t");
sw.Restart();
for(var i = 5; i < 1000; i++) ExpandStringSb("Test", i);
sw.Stop();
Console.Write(sw.ElapsedTicks + "\t\t\t\t\t");
sw.Restart();
for(var i = 5; i < 1000; i++) ExpandStringCharArr("Test", i);
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
sw.Restart();
for(var i = 0; i < 1000; i++) ExpandStringGuffa("Test", i);
sw.Stop();
Console.Write(sw.ElapsedTicks + "\t\t\t");
sw.Restart();
for(var i = 5; i < 1000; i++) ExpandStringSb("Test", i);
sw.Stop();
Console.Write(sw.ElapsedTicks + "\t\t\t\t\t");
sw.Restart();
for(var i = 5; i < 1000; i++) ExpandStringCharArr("Test", i);
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
sw.Restart();
for(var i = 0; i < 1000; i++) ExpandStringGuffa("Test", i);
sw.Stop();
Console.Write(sw.ElapsedTicks + "\t\t\t");
sw.Restart();
for(var i = 5; i < 1000; i++) ExpandStringSb("Test", i);
sw.Stop();
Console.Write(sw.ElapsedTicks + "\t\t\t\t\t");
sw.Restart();
for(var i = 5; i < 1000; i++) ExpandStringCharArr("Test", i);
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CnVzaW5nIFN5c3RlbS5UZXh0OwoKcHVibGljIGNsYXNzIFRlc3QKewoJc3RhdGljIHN0cmluZyBFeHBhbmRTdHJpbmdHdWZmYShzdHJpbmcgc3RyLCBpbnQgbGVuZ3RoKSAKCXsKICAgICAgICAgaWYgKGxlbmd0aCA8PSBzdHIuTGVuZ3RoKSByZXR1cm4gc3RyLlN1YnN0cmluZygwLCBsZW5ndGgpOwogIAogICAgICAgICB3aGlsZSAoc3RyLkxlbmd0aCAqIDIgPD0gbGVuZ3RoKSAKICAgICAgICAgewogICAgICAgICAgICAgc3RyICs9IHN0cjsKICAgICAgICAgfQogICAgICAgICBpZiAoc3RyLkxlbmd0aCA8IGxlbmd0aCkKICAgICAgICAgewogICAgICAgICAgICAgc3RyICs9IHN0ci5TdWJzdHJpbmcoMCwgbGVuZ3RoIC0gc3RyLkxlbmd0aCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0cjsKICAgfQogICAKICAgIHN0YXRpYyBzdHJpbmcgRXhwYW5kU3RyaW5nU2Ioc3RyaW5nIHN0ciwgaW50IGxlbmd0aCkKICAgIHsKICAgICAgICBpZiAobGVuZ3RoIDw9IHN0ci5MZW5ndGgpIHJldHVybiBzdHIuU3Vic3RyaW5nKDAsIGxlbmd0aCk7CgogICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0ciwgbGVuZ3RoKTsKICAgICAgICB3aGlsZSAoc2IuTGVuZ3RoICogMiA8PSBsZW5ndGgpCiAgICAgICAgewogICAgICAgICAgICBzYi5BcHBlbmQoc2IpOwogICAgICAgIH0KICAgICAgICBpZiAoc2IuTGVuZ3RoIDwgbGVuZ3RoKQogICAgICAgIHsKICAgICAgICAgICAgc2IuQXBwZW5kKHNiLlRvU3RyaW5nKCksIDAsIGxlbmd0aCAtIHNiLkxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOwogICAgfQoJCiAgICBzdGF0aWMgc3RyaW5nIEV4cGFuZFN0cmluZ0NoYXJBcnIoc3RyaW5nIHN0ciwgaW50IGxlbmd0aCkKICAgIHsKICAgICAgICB2YXIgaSA9IHN0ci5MZW5ndGg7CiAgICAgICAgaWYgKGkgPj0gbGVuZ3RoKSByZXR1cm4gc3RyLlN1YnN0cmluZygwLCBsZW5ndGgpOwogICAgICAgIAogICAgICAgIHZhciByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwogICAgICAgIEFycmF5LkNvcHkoc3RyLlRvQ2hhckFycmF5KCksIDAsIHJlc3VsdCwgMCwgaSk7CiAgICAgICAgd2hpbGUgKGkgKiAyIDw9IGxlbmd0aCkKICAgICAgICB7CiAgICAgICAgICAgIEFycmF5LkNvcHkocmVzdWx0LCAwLCByZXN1bHQsIGksIGkpOwogICAgICAgICAgICBpICo9IDI7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgbGVuZ3RoKQogICAgICAgIHsKICAgICAgICAgICAgQXJyYXkuQ29weShyZXN1bHQsIDAsIHJlc3VsdCwgaSwgbGVuZ3RoIC0gaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7CiAgICB9CgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlDb25zb2xlLldyaXRlTGluZSgiR3VmZmFcdFx0XHRTdHJpbmdCdWlsZGVyXHRcdFx0Q2hhckFycmF5Iik7CgkJQ29uc29sZS5Xcml0ZUxpbmUoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKCQkKCQl2YXIgc3cgPSBuZXcgU3RvcHdhdGNoKCk7CgkJCgkJc3cuUmVzdGFydCgpOwoJCWZvcih2YXIgaSA9IDA7IGkgPCAxMDAwOyBpKyspIEV4cGFuZFN0cmluZ0d1ZmZhKCJUZXN0IiwgaSk7CgkJc3cuU3RvcCgpOwoJCUNvbnNvbGUuV3JpdGUoc3cuRWxhcHNlZFRpY2tzICsgIlx0XHRcdCIpOwoJCQoJCXN3LlJlc3RhcnQoKTsKCQlmb3IodmFyIGkgPSA1OyBpIDwgMTAwMDsgaSsrKSBFeHBhbmRTdHJpbmdTYigiVGVzdCIsIGkpOwoJCXN3LlN0b3AoKTsKCQlDb25zb2xlLldyaXRlKHN3LkVsYXBzZWRUaWNrcyArICJcdFx0XHRcdFx0Iik7CgkJCgkJc3cuUmVzdGFydCgpOwoJCWZvcih2YXIgaSA9IDU7IGkgPCAxMDAwOyBpKyspIEV4cGFuZFN0cmluZ0NoYXJBcnIoIlRlc3QiLCBpKTsKCQlzdy5TdG9wKCk7CgkJQ29uc29sZS5Xcml0ZUxpbmUoc3cuRWxhcHNlZFRpY2tzKTsKCQkKCQlzdy5SZXN0YXJ0KCk7CgkJZm9yKHZhciBpID0gMDsgaSA8IDEwMDA7IGkrKykgRXhwYW5kU3RyaW5nR3VmZmEoIlRlc3QiLCBpKTsKCQlzdy5TdG9wKCk7CgkJQ29uc29sZS5Xcml0ZShzdy5FbGFwc2VkVGlja3MgKyAiXHRcdFx0Iik7CgkJCgkJc3cuUmVzdGFydCgpOwoJCWZvcih2YXIgaSA9IDU7IGkgPCAxMDAwOyBpKyspIEV4cGFuZFN0cmluZ1NiKCJUZXN0IiwgaSk7CgkJc3cuU3RvcCgpOwoJCUNvbnNvbGUuV3JpdGUoc3cuRWxhcHNlZFRpY2tzICsgIlx0XHRcdFx0XHQiKTsKCQkKCQlzdy5SZXN0YXJ0KCk7CgkJZm9yKHZhciBpID0gNTsgaSA8IDEwMDA7IGkrKykgRXhwYW5kU3RyaW5nQ2hhckFycigiVGVzdCIsIGkpOwoJCXN3LlN0b3AoKTsKCQlDb25zb2xlLldyaXRlTGluZShzdy5FbGFwc2VkVGlja3MpOwoJCQoJCXN3LlJlc3RhcnQoKTsKCQlmb3IodmFyIGkgPSAwOyBpIDwgMTAwMDsgaSsrKSBFeHBhbmRTdHJpbmdHdWZmYSgiVGVzdCIsIGkpOwoJCXN3LlN0b3AoKTsKCQlDb25zb2xlLldyaXRlKHN3LkVsYXBzZWRUaWNrcyArICJcdFx0XHQiKTsKCQkKCQlzdy5SZXN0YXJ0KCk7CgkJZm9yKHZhciBpID0gNTsgaSA8IDEwMDA7IGkrKykgRXhwYW5kU3RyaW5nU2IoIlRlc3QiLCBpKTsKCQlzdy5TdG9wKCk7CgkJQ29uc29sZS5Xcml0ZShzdy5FbGFwc2VkVGlja3MgKyAiXHRcdFx0XHRcdCIpOwoJCQoJCXN3LlJlc3RhcnQoKTsKCQlmb3IodmFyIGkgPSA1OyBpIDwgMTAwMDsgaSsrKSBFeHBhbmRTdHJpbmdDaGFyQXJyKCJUZXN0IiwgaSk7CgkJc3cuU3RvcCgpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKHN3LkVsYXBzZWRUaWNrcyk7Cgl9Cn0=