C# 托管代码 和 unsafe使用指针 对数组操作 性能比较--指针真的快么?

在广大CPP程序员眼中,指针和asm是快速高效的程序的表现

但在C#中,指针消失了,所有的数组进行访问时要进行数组越界检查,如下所示(Debug),红色部分为对数组进行访问操作所需要的汇编指令。

源码:

int[] managedArray = new int[100000000];
for (int i = 0; i < managedArray.Length; i++)
{
managedArray[i] = i;
managedArray[i]++;
}

反汇编:


int[] managedArray = new int[100000000];
00000041 mov edx,5F5E100h
00000046 mov ecx,5BC64186h
0000004b call FFF6FD70
00000050 mov dword ptr [ebp-4Ch],eax
00000053 mov eax,dword ptr [ebp-4Ch]
00000056 mov dword ptr [ebp-40h],eax
for (int i = 0; i < managedArray.Length; i++)
00000059 xor edx,edx
0000005b mov dword ptr [ebp-44h],edx
0000005e nop
0000005f jmp 00000099
{
00000061 nop
managedArray[i] = i;
00000062 mov eax,dword ptr [ebp-44h]
00000065 mov edx,dword ptr [ebp-40h]
00000068 cmp eax,dword ptr [edx+4]
0000006b jb 00000072
0000006d call 62A571E0
00000072 mov ecx,dword ptr [ebp-44h]
00000075 mov dword ptr [edx+eax*4+8],ecx
managedArray[i]++;
00000079 mov eax,dword ptr [ebp-44h]
0000007c mov edx,dword ptr [ebp-40h]
0000007f cmp eax,dword ptr [edx+4]
00000082 jb 00000089
00000084 call 62A571E0
00000089 lea eax,[edx+eax*4+8]
0000008d mov dword ptr [ebp-50h],eax
00000090 mov eax,dword ptr [ebp-50h]
00000093 inc dword ptr [eax]
}
00000095 nop
for (int i = 0; i < managedArray.Length; i++)
00000096 inc dword ptr [ebp-44h]
00000099 mov eax,dword ptr [ebp-44h]
0000009c mov edx,dword ptr [ebp-40h]
0000009f cmp eax,dword ptr [edx+4]
000000a2 setl al
000000a5 movzx eax,al

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值