Jef*_*ado 13
数组协方差仅适用于引用类型的数组. DateTime是一个值类型,因此您无法将变量分配DateTime[]给object[]变量.您必须显式创建一个对象数组并复制值.换句话说,创建一个新的类型数组实例object[].
有很多方法可以做到这一点.简单的使用CopyTo()应该就足够了.
DateTime[] x = new DateTime[] { ... };
object[] y = new object[x.Length];
x.CopyTo(y, 0);
Run Code Online (Sandbox Code Playgroud)
我做了一些测试.可能不是最好的方法,但它应该很好地了解适当的分析器将是什么.
class Program
{
static void Main(string[] args)
{
var now = DateTime.Now;
var dates = new DateTime[5000000];
for (int i = 0; i < dates.Length; i++)
dates[i] = now.AddSeconds(i);
for (int i = 0; i < 5; i++)
{
Test("Test1", () =>
{
var result = new object[dates.LongLength];
for (long l = 0; l < result.LongLength; l++)
result[l] = dates[l];
return result;
});
Test("Test2", () =>
{
var result = new object[dates.LongLength];
dates.CopyTo(result, 0);
return result;
});
Test("Test3", () =>
{
var result = new object[dates.LongLength];
Array.Copy(dates, result, dates.LongLength);
return result;
});
Test("Test4", () =>
{
var result = Array.ConvertAll(dates, d => (object)d);
return result;
});
Test("Test5", () =>
{
var result = dates.Cast<object>().ToArray();
return result;
});
Test("Test6", () =>
{
var result = dates.Select(d => (object)d).ToArray();
return result;
});
Console.WriteLine();
}
}
static void Test<T>(string name, Func<T> fn)
{
var startMem = GC.GetTotalMemory(true);
var sw = Stopwatch.StartNew();
var result = fn();
sw.Stop();
var endMem = GC.GetTotalMemory(false);
var diff = endMem - startMem;
Console.WriteLine("{0}\tMem: {1,7}/{2,7} ({3,7})", name, startMem, endMem, diff);
Console.WriteLine("\tTime: {0,7} ({1,7})", sw.ElapsedMilliseconds, sw.ElapsedTicks);
}
}
Run Code Online (Sandbox Code Playgroud)
规格:
Win7Pro x64,Core2Quad Q9550@2.83GHz,4GiB DDR2 1066(PC2-8500)
64位版本(32位大致相同,只是内存总量更少)
Test1 Mem: 40086256/200087360 (160001104)
Time: 444 (1230723)
Test2 Mem: 40091352/200099272 (160007920)
Time: 751 (2078001)
Test3 Mem: 40091416/200099256 (160007840)
Time: 800 (2213764)
Test4 Mem: 40091480/200099256 (160007776)
Time: 490 (1358326)
Test5 Mem: 40091608/300762328 (260670720)
Time: 1407 (3893922)
Test6 Mem: 40091672/300762328 (260670656)
Time: 756 (2092566)
Test1 Mem: 40091736/200099184 (160007448)
Time: 515 (1425098)
Test2 Mem: 40091736/200099184 (160007448)
Time: 868 (2404151)
Test3 Mem: 40091736/200099160 (160007424)
Time: 885 (2448850)
Test4 Mem: 40091736/200099184 (160007448)
Time: 540 (1494429)
Test5 Mem: 40091736/300762240 (260670504)
Time: 1479 (4093676)
Test6 Mem: 40091736/300762216 (260670480)
Time: 746 (2065095)
Test1 Mem: 40091736/200099168 (160007432)
Time: 500 (1383656)
Test2 Mem: 40091736/200099160 (160007424)
Time: 781 (2162711)
Test3 Mem: 40091736/200099176 (160007440)
Time: 793 (2194605)
Test4 Mem: 40091736/200099184 (160007448)
Time: 486 (1346549)
Test5 Mem: 40091736/300762232 (260670496)
Time: 1448 (4008145)
Test6 Mem: 40091736/300762232 (260670496)
Time: 749 (2075019)
Test1 Mem: 40091736/200099184 (160007448)
Time: 487 (1349320)
Test2 Mem: 40091736/200099176 (160007440)
Time: 781 (2162729)
Test3 Mem: 40091736/200099184 (160007448)
Time: 800 (2214766)
Test4 Mem: 40091736/200099184 (160007448)
Time: 506 (1400698)
Test5 Mem: 40091736/300762224 (260670488)
Time: 1436 (3975880)
Test6 Mem: 40091736/300762232 (260670496)
Time: 743 (2058002)
Test1 Mem: 40091736/200099184 (160007448)
Time: 482 (1335709)
Test2 Mem: 40091736/200099184 (160007448)
Time: 777 (2150719)
Test3 Mem: 40091736/200099184 (160007448)
Time: 793 (2196184)
Test4 Mem: 40091736/200099184 (160007448)
Time: 493 (1365222)
Test5 Mem: 40091736/300762240 (260670504)
Time: 1434 (3969530)
Test6 Mem: 40091736/300762232 (260670496)
Time: 746 (2064278)
有趣的是,ConvertAll()执行与普通循环非常相似.
| 归档时间: |
|
| 查看次数: |
3588 次 |
| 最近记录: |