C# 应用程序分析给出不同的结果

Posted

技术标签:

【中文标题】C# 应用程序分析给出不同的结果【英文标题】:C# application profiling gives different results 【发布时间】:2014-04-26 19:07:09 【问题描述】:

我是分析新手。我正在尝试分析连接到 SQLite 数据库并检索数据的 C# 应用程序。数据库包含 146856400 行,select 查询执行后检索到 428800 行。

在第一次执行时,主线程需要 246686 毫秒

在第二次执行相同的代码时,主线程只需要 4296 毫秒

重启系统后

在第一次执行时,主线程需要 244533 毫秒

在第二次执行相同的代码时,主线程只需要 4053 毫秒

问题:

1) 为什么第一次执行时间和第二次执行时间相差很大

2) 重新启动系统后为什么我没有得到相同的结果。

请帮忙

【问题讨论】:

你每次都会得到不同的结果(在性能方面),因为这就是计算机的工作方式。 数据库将缓冲和缓存数据。文件系统也是如此。 @HenkHolterman 您的 JITer 也会如此。这就像... JIter 的定义。此外,如果您使用的是 EF,那里也有编译...所以 .net 4.5 也会缓存... 【参考方案1】:

您体验到查询的冷执行和暖执行之间的区别。冷意味着第一次并温暖您的数据库查询的所有后续调用。 第一次一切都“冷”

OS 文件系统缓存为空。 SQLLite 缓存为空。 ORM 动态查询编译尚未完成并缓存。 ORM 映射器缓存为空。 垃圾收集器需要调整您的工作集 ....

当您第二次执行查询时,所有这些第一次初始化(缓存)都已完成,并且您正在测量不同缓存级别的效果,只要有足够的内存可用于缓存大量请求的数据。

4 分钟和 4 秒之间的性能差异令人印象深刻。两个号码都有效。测量东西很容易。告诉别人你到底测量了什么以及如何通过改变这个或那个来提高性能要困难得多。

表演游戏通常是这样进行的:

Customer: It is slow 
Dev:      I cannot repro your issue.
Customer: Here is my scenario .... 
Dev:      I still cannot repro it. Can you give me data set you use and the exact steps you did perform?
Customer: Sure. Here is the data and the test steps.
Dev:      Ahh I see. I can make it 10 times faster.
Customer: That is great. Can I have the fix?
Dev:      Sure here it is.
Customer: **Very Angry** It has become faster yes. But I cannot read my old data!
Dev:      Ups. We need to migrate all your old data to the new much more efficient format. 
          We need to  develop a a conversion tool which will take 3 weeks and your site will 
          have 3 days downtime while the conversion tool is running. 
          Or 
          We keep the old inefficient data format. But then we can make it only 9 times faster.
Customer: I want to access my data faster without data conversion!
Dev:      Here is the fix which is 10% slower with no schema changes. 
Customer: Finally. The fix does not break anything but it has not become faster?
Dev:      I have measured your use case. It is only slow for the first time. 
          All later data retrievals are 9 times faster than before. 
Customer: Did I mention that in my use case I read always different data?
Dev:      No you did not. 
Customer: Fix it!
Dev:      That is not really possible without a major rewrite of large portions of our software.
Customer: The data I want to access is stored in a list. I want to process it sequentially.
Dev:      In that case we can preload the data in the background while you are working the current data set. You will only experience a delay for the first data set on each working day.
Customer: Can I have the fix?
Dev:      Sure here it is.
Customer: Perfect. It works!

性能很难掌握,因为大多数时候您处理的是主观的感知性能。将其归结为定量测量是一个好的开始,但您需要调整指标以反映实际的客户用例,否则您可能会在上述错误的地方进行优化。必须全面了解客户需求和用例。另一方面,您需要了解您的完整系统(将其描述为地狱),以便能够区分冷查询和热查询执行之间的区别以及您可以在哪里调整整个事情。如果您一直查询不同的数据(不太可能),这些缓存将变得毫无用处。也许您需要不同的索引来加快查询速度,或者您购买 SSD,或者您将所有数据保存在内存中并在内存中执行所有后续查询......

【讨论】:

不错的对话示例 - 尽管这类对话通常要长得多(并且双方都会产生更多的愤怒;-))! 谢谢@Alois Kraus,解释得很好

以上是关于C# 应用程序分析给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

C# 代码仅在逐步执行时给出预期结果?

用动态规算法求出的0-1背包问题,写出完整的可以运行的程序,并且给出算法复杂性的分析与结果,谢谢

Simd matmul 程序给出不同的数值结果

VB6 与 C# 以不同顺序返回的 SQL 结果集

为啥 java.awt.Font.getStringBounds 在不同的机器上给出不同的结果?

重复运行该程序的不同 k-means 结果