【发布时间】:2011-08-30 10:01:04
【问题描述】:
以下是 c++ 和 c# 中的两个代码部分,它们做的事情完全相同:
#include <stdio.h>
int main(int argc, char *argv[]) {
char p[1000000];
unsigned int i,j;
unsigned long long s=0;
for(i=2;i<1000000;i++) p[i]=1;
for(i=2;i<500000;) {
for(j=2*i;j<1000000;j+=i) p[j]=0;
for(i++;!p[i];i++);
}
for(i=3,s=2;i<1000000;i+=2) if(p[i]) s+=i;
printf ("%lld\n",s);
return 0;
}
时间:0.01s 内存:2576 kB
using System;
namespace ConsoleApplication4
{
internal class Program
{
private static void Main(string[] args)
{
var p = new byte[1000000];
ulong i, j;
double s = 0;
for(i=2;i<1000000;i++)
p[i]=1;
for(i=2;i<500000;)
{
for(j=2*i;j<1000000;j+=i)
p[j]=0;
for(i++;p[i]==0;i++);
}
for(i=3,s=2;i<1000000;i+=2)
if(p[i]!=0) s+=i;
Console.WriteLine(s);
}
}
}
时间:0.05s 内存:38288 kB
如何改进 C# 代码以向我的同事证明 C# 可以和 C++ 一样快?
如您所见,C# 执行时间增加了 5 倍,内存消耗增加了 15 倍。
【问题讨论】:
-
在深入研究之前可能需要注意一些事情:您的数组是不同的。 C/C++ 示例中的数组位于堆栈上。在 C# 中,它在堆上。 C# 中的
i和j变量占用空间更大,如果处理器是 32 位处理器,则可能需要更多的努力才能使用。使用uint,假设(相当考虑迭代量)unsigned int在 C/C++ 示例中是 4 个字节。p[0]和p[1]在 C/C++ 示例中将未初始化,因此存在问题,但在 C# 示例中0。 -
Plus
s在 C# 示例中是double,在 C/C++ 示例中是ulong(有效)。整数运算实际上总是比浮点运算快。 -
你的“C++ 代码示例”是用纯 C 编写的。所以在证明任何东西之前,先学习一些东西可能会有所帮助。
-
您没有为打印计时,是吗?那还真不算。 :P
-
@pickypg:更不用说不易出错。 @Dimitry:如您所见,两者并没有做“绝对相同的事情”,只是相似的事情。
标签: c# c++ optimization performance