Tag: 优化

我可以检查C#编译器内联方法调用吗?

我正在写一个XNA游戏,我在那里进行逐像素碰撞检查。 通过移位int和按位ORing来检查这种情况的循环通常很难阅读和理解。 我想添加私有方法,如private bool IsTransparent(int pixelColorValue)以使循环更具可读性,但我不希望方法调用的开销,因为这是性能非常敏感的代码。 有没有办法强制编译器内联这个调用,或者我会这样做,我只希望编译器会进行这种优化? 如果没有办法强制执行此操作,是否有办法检查方法是否内联,而不是读取反汇编? 如果内联并且没有其他调用者存在,该方法是否会显示在reflection中? 编辑:我不能强迫它,所以我可以检测到它吗?

使用预先计算的平移arrays的快速Sin / Cos

我有以下代码使用预先计算的内存表进行Sin / Cos函数。 在下面的示例中,该表具有1024 * 128个项目,涵盖从0到2pi的所有Sin / Cos值。 我知道我可以使用Sin / Cos对称并只保留1/4的值,但是在计算值时我会有更多’ifs’。 private const double PI2 = Math.PI * 2.0; private const int TABLE_SIZE = 1024 * 128; private const double TABLE_SIZE_D = (double)TABLE_SIZE; private const double FACTOR = TABLE_SIZE_D / PI2; private static double[] _CosineDoubleTable; private static double[] _SineDoubleTable; 设置转换表 private static void InitializeTrigonometricTables(){ _CosineDoubleTable […]

C#.NET:如何检查我们是否使用电池运行?

如果我们通过远程桌面运行或使用电池运行,我想成为一名优秀的开发者公民, 支付我的税 ,并禁用一些东西。 如果我们在远程桌面上运行(或等效于终端服务器会话),我们必须禁用动画和双缓冲。 您可以通过以下方式检查: /// /// Indicates if we’re running in a remote desktop session. /// If we are, then you MUST disable animations and double buffering ie Pay your taxes! /// /// /// public static Boolean IsRemoteSession { //This is just a friendly wrapper around the built-in way get { return System.Windows.Forms.SystemInformation.TerminalServerSession; } […]

如何在运行时创建WPF UserControl的映像

我创建了一个WPF应用程序,它有一个Canvas ,我在其上放置UserControls , UserControls可以移动和resize(就像Windows窗口一样)。 现在我已经发现这对于旧PC而言可能非常慢,这是一个问题。 作为一个解决方案,我考虑生成一个显示UserControl的图形,并在调整Control /拖动Control时显示,以防止WPF永久重新计算所有元素。 唯一的问题是我不知道如何生成这个图像。 是否有类似函数在.Net中执行此操作? 或者我怎么能自己做呢?

C#编译器优化 – 未使用的方法

C#编译器(在VS2008或VS2010中)在编译时是否删除未使用的方法? 我认为决定是否使用公共方法可能有问题,所以我猜它会编译所有的公共方法。 但是在类中从未使用的私有方法呢? 编辑: 是否存在关于编译器optmization的一组规则,这些规则在任何地方都有记录?

如何快速替换数组中的字符

我在XML文件上使用XML文本阅读器,该文件可能包含对读者无效的字符。 我最初的想法是创建我自己的流阅读器版本并清除坏角色,但它严重减慢了我的程序。 public class ClensingStream : StreamReader { private static char[] badChars = { ‘\x00’, ‘\x09’, ‘\x0A’, ‘\x10’ }; //snip public override int Read(char[] buffer, int index, int count) { var tmp = base.Read(buffer, index, count); for (int i = 0; i < buffer.Length; ++i) { //check the element in the buffer to see if […]

加快在WPF中向Canvas添加对象的速度

我有一个Canvas ,我在WPF中使用它绘制许多彩色矩形,但程序在添加时运行速度非常慢。 我尝试了不同的选项,例如将它们添加到Array并一次添加它们并使用Image而不是Canvas来调度它们,但它们似乎没有做太多。 我在一个线程中有编码导致绘图,但由于C#规则,我必须在主线程中有绘图部分。 我还应该注意,问题不在于我的电脑(它运行的英特尔酷睿i7配备14GB DDR2内存)。 这是添加矩形的代码。 它跑了83,000多次。 private void AddBlock(double left, double top, double width, double height, Brush color) { if (this.Dispatcher.Thread != Thread.CurrentThread) { this.Dispatcher.Invoke(new Action(this.AddBlock), left, top, width, height, color); return; } Rectangle rect = new Rectangle() { Width = width, Height = height, Fill = color, SnapsToDevicePixels = true }; this.canvas.Children.Add(rect); […]

替换许多字符串的更好方法 – 在C#中进行模糊处理

我正在尝试模糊大量数据。 我已经创建了一个我要替换的单词(标记)列表,我正在使用StringBuilder类逐个替换单词,如下所示: var sb = new StringBuilder(one_MB_string); foreach(var token in tokens) { sb.Replace(token, “new string”); } 这很慢! 我能做些什么简单的事情来加速它吗? 标记是大约一千个字符串的列表,每个字符串长度为5到15个字符。

C#编译器是否足够智能以优化此代码?

请忽略此问题中的代码可读性。 在性能方面,如下所示代码应如下所示: int maxResults = criteria.MaxResults; if (maxResults > 0) { while (accounts.Count > maxResults) accounts.RemoveAt(maxResults); } 或者像这样: if (criteria.MaxResults > 0) { while (accounts.Count > criteria.MaxResults) accounts.RemoveAt(criteria.MaxResults); } ? 编辑: criteria是一个class , MaxResults是一个简单的整数属性(即public int MaxResults { get { return _maxResults; } } 。 C#编译器是否将MaxResults视为黑盒并每次评估它? 或者它是否足够聪明,可以发现我有3次调用同一个属性而没有在调用之间修改该属性? 如果MaxResults是一个领域怎么办? 优化法则之一是预先计算,所以我本能地像第一个列表那样编写这个代码,但我很好奇是否自动为我做了这种事情(再次,忽略代码可读性)。 (注意:我对听到“微优化”论证不感兴趣,这个论点可能在我发布的具体案例中有效。我只是想了解正在发生或未发生的事情的一些理论。)

Interlocked.CompareExchange是否使用内存屏障?

我正在阅读Joe Duffy关于Volatile读取和写入以及及时性的post,我正在尝试理解post中最后一个代码示例: while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ; m_state = 0; while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ; m_state = 0; … 执行第二次CMPXCHG操作时,它是否使用内存屏障来确保m_state的值确实是写入它的最新值? 或者它只是使用已存储在处理器缓存中的某些值? (假设m_state未声明为volatile)。 如果我理解正确,如果CMPXCHG不会使用内存屏障,那么整个锁获取过程将不公平,因为第一个获取锁的线程很可能是将获得所有锁的线程。 以下锁 。 我理解正确,还是我错过了什么? 编辑 :主要问题实际上,在尝试读取m_state的值之前,调用CompareExchange是否会导致内存障碍。 因此,当尝试再次调用CompareExchange时,是否所有线程都可以看到赋值0。