C#和ASP.NET中跟踪的性能影响是什么?

12

最近我在查看一些生产环境的登录代码时发现了这个...

HttpContext.Current.Trace.Write(query + ": " + username + ", " + password));

...where查询是一个短的SQL查询,用于获取匹配的用户。这会有任何性能影响吗?我认为它非常小。

此外,使用HTTP上下文的这种精确跟踪的目的是什么?这些数据被追踪到哪里?提前感谢!

7个回答

18

如果在构建过程中定义了TRACE条件编译常量,它将产生性能影响。但做任何事情都会有某种影响 :)

至于这是否对应用程序产生重大影响,这是非常不可能的,因为Trace旨在运行,并在许多生产应用程序中运行。只有滥用该功能才会导致明显的性能差异。

但像往常一样,不要相信我,而要相信分析器。


那么,当页面或web.config中禁用跟踪时,跟踪调用是否没有影响?在页面即时编译时,它们是否会被“优化掉”? - John B

5

我目前没有足够的声望点数来进行评论,但我想快速声明一下对Jonathan答案的看法。我看到的数字似乎表明,仅在少量字符串连接时使用stringbuilder是没有意义的。创建stringbuilder对象的开销超过了连接速度的好处。


4
跟踪消息可以发送到许多不同的地方。您可以为控制台、VisualStudio调试窗口、文件、数据库表或事件日志添加(或删除)TraceListeners,甚至可以构建自己的TraceListeners。
此外,您可以在编译发布版本时将Trace配置为不执行任何操作。
因此,使用Trace的性能影响可能会大相径庭,从实际上零到完全拖垮您的应用程序,具体取决于各种活动侦听器的性能。但是,大多数侦听器的影响与您预期的差不多;写入文件、数据库或控制台需要一定的工作量,而相对于这些I/O绑定的活动,Trace并不会增加太多开销。
除了性能影响之外,我对跟踪密码值的想法感到非常恐慌。那是绝对不能做的事情。

3

这段代码中最大的性能损失不在跟踪上,而是在使用 + 运算符进行字符串连接时。这会执行一些低效的内存操作,甚至比 IO 操作更耗费性能。我建议使用 string.Concat 或 StringBuilder 类(或者 string.Format)来代替。


2

1

我猜Trace Source在将消息转发给侦听器之前会查看其开关的TraceLevel。因此,如果我们将开关的默认TraceLevel值保持为“Error”,那么跟踪开销将大大减少,因为只有“Error”跟踪信息会发送到侦听器。

只是猜测...我还没有测量任何东西。如果我这样做了,我会更新的。

2017年更新:似乎已经过时,但在asp.net应用程序中以一种相当方便的方式跟踪/记录信息到浏览器/可远程访问的.aspx页面。

https://msdn.microsoft.com/en-IN/library/z48bew18(v=vs.71).aspx


1

如果跟踪信息写入文本文件,我认为它比写入控制台要花费更多的时间。


1
取决于情况。如果文件被缓存并且仅在缓冲区满时刷新,则平均而言,实际耗费的时间更少。写入GUI控制台相当昂贵,因为这涉及字体渲染、反锯齿、视口剪裁等方面。 - TMN
实际上我考虑过向控制台输出的代价,认为这样会更省成本,不过如果你这么说,那就没错了... - yusuf
控制台在Windows上成本很高。执行时会阻塞,等待控制台消耗文本。现在,如果您自己缓冲控制台写入,例如使用编写器线程,您将不会注意到所有的阻塞(除非由于队列增长速度快于控制台消耗而导致内存不足;-))。 - binki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接