首页 新闻 赞助 找找看

C#中的高性能数组与一般数组性能对比为何会这样?求解?

0
悬赏园豆:50 [已关闭问题] 关闭于 2015-12-23 21:36
 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();
        }
为何还不如普通数组


飞鸟Xeon的主页 飞鸟Xeon | 初学一级 | 园豆:2
提问于:2015-06-28 16:49
< >
分享
所有回答(5)
0

for (int i = 0; i < 20; i++) 这个20怕是要换成20000,但是我觉得20000这个数有点小

刘宏玺 | 园豆:14020 (专家六级) | 2015-06-28 17:22

20000结果一样,总得来说,C#指针用法比普通数组操作,实测数据性能不如普通数组操作。不解其中原因。   我用的是堆栈,大了就溢出了.

支持(0) 反对(0) 飞鸟Xeon | 园豆:2 (初学一级) | 2015-06-28 17:43
0

我听不懂什么叫高性能数组。。

是我孤陋寡闻吧。。

看了下是在说stackalloc吗?https://msdn.microsoft.com/zh-cn/library/cx9s2sy4.aspx

实在看不出来他跟高性能有什么关系。。。我一开始以为是在CPU高速缓存中,原来只是栈内存分配。。。

总结就是:并没有什么高性能数组,有的话也也不知你这个

吴瑞祥 | 园豆:29449 (高人七级) | 2015-06-28 22:51
0

你到底想比较什么呢?内存分配速度?栈和堆的操作速度?还是...

JeffWong | 园豆:2328 (老鸟四级) | 2015-06-29 10:34

我想比较的是unsafe的性能

支持(0) 反对(0) 飞鸟Xeon | 园豆:2 (初学一级) | 2015-07-01 08:29
0

stackalloc这是在堆栈上分配内存块,但你的普通数组是存放在栈上面的,用一个比喻:

1:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 

2:使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

 这个已经解释你上面的存储速度问题了

稳稳的河 | 园豆:4216 (老鸟四级) | 2015-06-29 15:17

亲,普通数组是引用类型,是在堆上分配存储空间的,OK你搞错了吧

支持(0) 反对(2) 飞鸟Xeon | 园豆:2 (初学一级) | 2015-06-30 23:21

@飞鸟Xeon: 在才C,c++里面数组是放在栈上面的,c#和java里面的是一个对象,是放在堆上,你应该去了解stackalloc的存储原理,多去看看指针,才能去知道为什么他存取速度为什么慢。

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-07-07 10:30
0

通常来说栈的访问会相对比堆栈块点,一个直接访问一个间接的访问,至于楼主测试出现的问题,我觉得最好的验证办法就是看看IL代码了

visonme | 园豆:1674 (小虾三级) | 2015-07-02 17:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册