程序(有很多对象)很慢, 经测试, 结果, GC消耗了大部分的时间.加上这些 config 后, 性能从 90秒,缩短到39秒    <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
      <gcConcurrent enabled="true"/>
    </runtime>
上部分,90 秒多,默认 config
下部分,39 秒完成,修改一些runtime设置
.exe程序没变化,只是修过.config

解决方案 »

  1.   

    MSDN 只是 说,  吞吐量 和 延迟的 差别, 没想到,居然差这么大
      

  2.   


    感谢版主推荐.
    这个实际设置Runtime 配置的时候.得看具体情况而定.
    比如, 单个对象的大小? 对象的寿命(多久引用归零)? 对象的数量? 分配的密集程度(慢慢分配,短时大量分配)?我这个例子是, 有大量的对象生灭, 多线程,从 25个 x 80MB 的文本,大量的string.split. 
    最终转换,计算,产生 6,000,000 多个自定义Class.
    debug->performance analysis后,发现 GC耗时太多.一改设置,95秒变成39秒
    MSDN杂志,有很多讲GC的,更多的 针对GC特性,进行数据结构的优化.
    http://msdn.microsoft.com/en-us/magazine/default.aspx
      

  3.   

    gcConcurrent的默认值本来就是true,gcAllowVeryLargeObjects则是为了让64位系统下运行的程序可以使用超过2G的大内存对象,如果要兼容32位,也用不着。
    不过我更想知道如何通过代码方式来指定,因为配置文件不方便让用户自己去修改。
      

  4.   

    GCSettings.LatencyMode 
    有get;set;
      Batch/Interactive/LowLatency /SustainedLowLatency
      

  5.   

    <gcServer enabled="true"/>
    应该就差不多了
      

  6.   

    C#是提供了比较好的人性化选择而已.
    根据不同的需求, 选择几种不同的内存策略而已.
    作为普通客户端, 一般就是随即释放的多, 以节省更多的内存空间.
    作为服务器, 自然内部会采用较好的内存策略, 在释放的时候不会立刻释放, 而是等待重用, 并且应该会根据重用的频率来优化, 这个就是C#带有的功能, JAVA不知道是否有这些偏向性编译的选项呢...