大型数组的 C# 内存优化

标签 c# c++ optimization performance

下面是用 c++ 和 c# 编写的两个代码部分,它们做的事情完全相同:

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.01s 内存:2576 kB

C#
http://ideone.com/baXYm

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 倍。

最佳答案

在Release模式下编译运行。在 Release模式下构建和运行时,我从 C# 版本中得到了 0.01 秒。就内存消耗而言,您正在将苹果与橙子进行比较。托管环境将消耗更多内存,因为它托管 CLR 和垃圾收集器,它们并非没有成本。

关于大型数组的 C# 内存优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6085109/

相关文章:

c# - 如何从 Controller 调用 EditorFor

c++ - 为什么打印字符串数组只打印第一个字符?

C++/Qt 编码风格——#define 应该放在哪里

PHP - 函数内的函数。是好是坏?

php - 如何只对这样的事情进行一次查询

c# - 为什么在作为普通委托(delegate)参数提供时必须转换 lambda 表达式

c# - 如何在 .NET 中匹配正则表达式 "shortest match"

c++ - UpdateLayeredWindow、SIZE_RESTORED 和 GetClientRect 问题

optimization - Gekko 不可行解,应满足 cotraint

c# - File.Replace 抛出 IOException