English 中文(简体)
编译常数、优化和性能
原标题:Compiler constants, optimizations, and performance
  • 时间:2012-05-25 18:29:45
  •  标签:
  • c#
  • .net

我有一大堆代码 经常需要追踪信息输出 这样客户可以帮助调试输出 - 它非常注重数学。

我绝对不希望由于性能原因在生产过程中能够进行追踪,但不得不经常对追踪进行评论,这正在成为一个麻烦问题。

我刚刚把代码设置成这样...

using System.Diagnostics;

const bool TRACING_ENABLED = false;

//math math math....

Trace.WriteLineIf(TRACING_ENABLED, "Minimum Nitrogen Yield: " + minYieldNitrogen);
Trace.WriteLineIf(TRACING_ENABLED, "Minimum Water Yield: " + minYieldWater);
Trace.WriteLineIf(TRACING_ENABLED, "Minimum Seed Yield: " + minYieldSeed);

//more math math trace math trace math...

我的问题是... 这是启用和禁用调试追踪的最佳方法吗? 这些线条分散在代码中 所以我希望不必为内部管理 包扎那些小块 if 或其它东西

汇编者是否会优化组装中的这些线条, 因为这些线条在构建时会有一个 false 常数?

谢谢你的洞察力!

最佳回答

我将使用"http://msdn.microsoft.com/ en-us/library/ system.diagnostics. dediagnostistics. proticalalatprimittee.aspx" rel=“nofollow” >The contestalAtriationte 和一个编译者旗帜来处理此事。

这样做的好处是 将方法 完全从您的生产代码中删除 - 所以有条件检查甚至不会发生 。

这样做,你可以制定你自己的方法,例如:

[Conditional("TRACE")]
public WriteTraceLine(string message)
{
     Trace.WriteLine(message);
}

然后在您的调试/非生产构建设置中设置一个 TRACE 的旗帜。 这将导致该方法在定义该旗帜时只存在于汇编的源(包括调用)中。

问题回答

我也会查看调试. writeLine () 方法。 所有调试方法都使用 Reed s 条件属性, 但取而代之的是“ DEBUG” 常数的定义( 在默认的 Debug 构建配置中是免费的, 在默认的 Debug 构建配置中是不存在的 ) 。 调试方法使用与 Trace 相同的收听器; 想法是您使用 Trace. writeLine () 来记录或显示在任何软件构建中的任何您想要登录或显示的内容, 以及 Debug. writeLine () 用于在软件的调试构建中记录或显示的额外文本 。

而不是 Trace. writeLineif( 条件, 消息) , 使用 < code> Debug. writeLine( 消息)

在调试构建中, 此方法的调用通常会被编译 。 在发布构建中, 编译者不会发出调用代码或参数评价代码 。 如果我正确理解您的问题, 这正是您想要的 。

精确地说, debug. writeLine(消息) 对其适用了 [DeBUG] 。 因此,汇编者将发出调用代码,只要在编译过程中定义了 DEBUG 符号。此符号在标准视觉工作室调试构建中定义,而不是在发布构建中定义。

详情见http://msdn.microsoft.com/en-us/library/9z9k5ydz

也许你能做的就是写你自己的课

public class MyTrace 
{
     [Conditional("TRACE")]
     public static void Trace(string message)
     {
          //trace code goes here
     }
     [Conditional("DEBUG")] 
     public static void Debug(string message)
     {
          //Debug code goes here
     }
}

其好处在于您可以使用有条件的汇编,添加配置逻辑,或者甚至使用Log4Net这样的日志软件包。

你当然会用它

  ....
  MyTrace.Trace(".....");
  MyTrace.Debug(".....");
  ....




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...