Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 启动VS Profiler可提高应用程序性能x20?_C#_.net_Optimization_Profiling_Profiler - Fatal编程技术网

C# 启动VS Profiler可提高应用程序性能x20?

C# 启动VS Profiler可提高应用程序性能x20?,c#,.net,optimization,profiling,profiler,C#,.net,Optimization,Profiling,Profiler,编辑1 我完全不排除这可能是由使用探查器的一些非常基本的副作用引起的(我的“常规”项目中的一些错误设置) 我想提高我的应用程序的计算时间,所以我决定进行一次彻底的分析。 所以我刚刚启动了一个.Net内存分配评测来分析我的应用程序看到计算速度快了20倍,我完全目瞪口呆 应用程序由后台人员从二进制文件中读取数据,对其进行处理,并将结果存储到MSSQL数据库中。每轮通常需要20秒,而分析只需要1秒。我检查并确保两种情况下的结果一致 一位在.Net上做过实验的朋友告诉我,分析器优化了线程,并且“不知怎么

编辑1
我完全不排除这可能是由使用探查器的一些非常基本的副作用引起的(我的“常规”项目中的一些错误设置)

我想提高我的应用程序的计算时间,所以我决定进行一次彻底的分析。 所以我刚刚启动了一个.Net内存分配评测来分析我的应用程序
看到计算速度快了20倍,我完全目瞪口呆

应用程序由后台人员从二进制文件中读取数据,对其进行处理,
并将结果存储到MSSQL数据库中。每轮通常需要20秒,而分析只需要1秒。我检查并确保两种情况下的结果一致

一位在.Net上做过实验的朋友告诉我,分析器优化了线程,并且“不知怎么地”找到了解决线程锁和瓶颈的方法,但我简直不敢相信

因此,我的问题是:

  • 到底发生了什么,如何发生,为什么发生
  • 如何使我的代码在本机上表现为那样
  • 编辑2
    我知道这听起来既疯狂又难以置信。我自己仍然很怀疑。但这是真的。
    当由分析器运行时,同样的代码运行得非常快。 我使用相同的测试数据,观看相同的计算输出。 我不能给出一个简单的复制项目,因为它是一个相对较大的框架。 我正在使用VisualStudio2010分析器。

    我会提供尽可能多的细节流,我肯定会张贴一个线索,只要我找到它

    常规运行日志:
    2011年3月23日18:04:34 | 180434.621 |模拟装置[5]-[1]-[5 PC-10[装置1/48]
    2011年3月23日18:05:01 | 180501.271 |处理时间:00:00:26.6515244
    等等

    探查器运行日志:
    2011年3月24日11:38:15 | 113815.592 |模拟装置[5]-[1]-[5 PC-10[装置1/48]
    2011年3月24日11:38:17 | 113817.350 |处理时间:00:00:01.7581005

    等等

    编辑3:线索
    好吧,好吧,我的错(我在编辑1上警告过这种可能性,因为这太不可思议了。对不起)@Watts建议检查我是否处于调试或发布模式。 但@SnowBear指出有两件事是不同的:运行调试版本的软件和在调试器下运行软件 我确保在构建和执行都是VS2010中发布了活动配置。然而,由于我刚刚发疯,我决定直接从bin/RELEASE中的exe文件启动应用程序。瞧……每个进程都需要1秒的时间。 运行探查器可以使您脱离调试模式(无论您是处于发布模式还是调试模式) 这让我感到困惑。

    感谢所有案例都已关闭。

    使用调试器运行会禁用jit优化。如果运行exe,通常会启用jit优化。将调试器附加到这样一个正在运行的应用程序,可以使用启用的优化对其进行调试

    发布版本与调试版本有两种结果:

  • 未定义条件编译器符号
  • 它启用/禁用C#=>IL编译中的优化

  • 考虑到问题是关于代码在分析器下运行得更快,具体的问题是“1.到底发生了什么,如何,为什么?以及2.如何使我的代码在本机上表现为那样?”公认的答案是错误的,因为它根本没有提到分析器,也没有提到20倍加速的具体原因

    具体情况是:

    在项目属性的“调试”选项卡中,选中“启用非托管代码调试”复选框;此选项会导致调试器运行缓慢

    当您运行探查器时,它仍然是您要评测的程序的调试版本,因此定义了“debug”符号,并且启用了所有跟踪、断言等,但不涉及调试器,因此“Enable unmanaged code debug”选项不适用。(JIT优化可能是在评测时启用的,但这并不能带来2倍的性能提升,更不用说20倍的提升了。)

    如果您想在调试代码时享受这20倍的提升(不仅仅是在评测时),请转到项目属性的“调试”选项卡,并确保未选中“启用非托管代码调试”

    附言


    有一个问题比这个问题早了几个月:

    我已经多次遇到这个问题……对此有一个非常简单的解释。探查器不处理对象,因此在分析时不会产生对象处理成本

    因此,如果您想提高性能,使其与分析的性能相匹配,那么请找出实例化所有这些短期对象的位置,并重构代码


    我还不知道有什么好方法可以立即找到有问题的代码,但我可以帮助您缩小范围。如果您分析代码,请打开报告,选择“函数”在当前视图中,然后按包含性样本排序,您将看到顶级方法…对象实例化的性能问题可能出现在包含性样本最多的方法中。

    如果您在代码中使用线程,windows计时器解析也是一个原因

    默认windows计时器分辨率为15.6ms


    使用探查器运行应用程序时,此设置为1ms,应用程序运行速度更快。签出此

    无任何注释的向下投票不是很方便。我不相信。探查器的要点不是仅仅通过运行它们就能使应用程序更快。你必须将运行它们所学到的实际应用到优化你的代码。如果你想让任何人认真对待你,发布一个小的repo项目和你正在使用的分析器的名称