static unsafe void Main(string[] args) { DateTime start1 = DateTime.Now; long* pArray = stackalloc long[20000]; for (int i = 0; i < 20; i++) { pArray[i] = i * i; } DateTime end1 = DateTime.Now; TimeSpan span = start1 - end1; Console.WriteLine(span.ToString()); DateTime start2 = DateTime.Now; long[] array = new long[20000]; for (int i = 0; i < 20; i++) { array[i] = i * i; } DateTime end2 = DateTime.Now; TimeSpan span1 = start2 - end2; Console.WriteLine(span1.ToString()); Console.ReadLine(); }
为何还不如普通数组
for (int i = 0; i < 20; i++) 这个20怕是要换成20000,但是我觉得20000这个数有点小
20000结果一样,总得来说,C#指针用法比普通数组操作,实测数据性能不如普通数组操作。不解其中原因。 我用的是堆栈,大了就溢出了.
我听不懂什么叫高性能数组。。
是我孤陋寡闻吧。。
看了下是在说stackalloc吗?https://msdn.microsoft.com/zh-cn/library/cx9s2sy4.aspx
实在看不出来他跟高性能有什么关系。。。我一开始以为是在CPU高速缓存中,原来只是栈内存分配。。。
总结就是:并没有什么高性能数组,有的话也也不知你这个
你到底想比较什么呢?内存分配速度?栈和堆的操作速度?还是...
我想比较的是unsafe的性能
stackalloc这是在堆栈上分配内存块,但你的普通数组是存放在栈上面的,用一个比喻:
1:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
2:使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。
这个已经解释你上面的存储速度问题了
亲,普通数组是引用类型,是在堆上分配存储空间的,OK你搞错了吧
@飞鸟Xeon: 在才C,c++里面数组是放在栈上面的,c#和java里面的是一个对象,是放在堆上,你应该去了解stackalloc的存储原理,多去看看指针,才能去知道为什么他存取速度为什么慢。
通常来说栈的访问会相对比堆栈块点,一个直接访问一个间接的访问,至于楼主测试出现的问题,我觉得最好的验证办法就是看看IL代码了