C++ http://ideone.com/UfL5R
#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.01秒 内存: 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.05秒 内存:38288 kB
我该如何改进C#代码,以向我的同事证明C#可以像C++一样快?
正如你所看到的,C#的执行时间是C++的5倍,内存消耗是C++的15倍。
i
和j
变量占用更大的内存空间,可能需要更多的处理器资源。假设(考虑到迭代次数)C/C++示例中的“unsigned int”为4字节,则应使用uint
。在C/C++示例中,p[0]
和p[1]
将未初始化,因此可能存在疑问,但在C#示例中为0。 - pickypgs
是一个double
,而在C/C++示例中则是一个ulong
(实际上)。整数运算几乎总是比浮点运算快。 - pickypg