Tag: 编译器优化

Visual Studio构建中“优化代码”选项的优点

我们的大部分C#发布代码都是在关闭“优化代码”选项的情况下构建的。 我相信这是为了让发布模式中内置的代码更容易调试。 鉴于我们正在创建相当简单的桌面软件,它连接到后端Web服务(即,不是特别是处理器密集型应用程序),那么如果可能出现任何类型的性能影响呢? 是否有任何特定平台可能受到更严重的影响? 例如。 多处理器/ 64位。

允许对局部变量进行C#编译器优化并从内存中重新获取值

编辑 :我在问两个线程在没有正确同步的情况下同时访问相同数据会发生什么(在此编辑之前,该点未明确表达)。 我有一个关于C#编译器和JIT编译器执行的优化的问题。 请考虑以下简化示例: class Example { private Action _action; private void InvokeAction() { var local = this._action; if (local != null) { local(); } } } 请在示例中忽略读取_action可能会产生缓存和过期值,因为没有volatile说明符,也没有任何其他同步。 那不是重点:) 是否允许编译器(或实际上是运行时的抖动)优化对局部变量的赋值,而是从内存中读取_action两次: class Example { private Action _action; private void InvokeAction() { if (this._action != null) { this._action(); // might be set to null by an other […]

有没有办法让.Net JIT或C#编译器优化掉空的for循环?

.NET JIT是否会优化空循环? : 以下程序只运行十亿次空循环并打印出运行时间。 我的机器需要700毫秒,我很好奇是否有办法让抖动优化掉空循环。 using System; namespace ConsoleApplication1 { class Program { static void Main() { var start = DateTime.Now; for (var i = 0; i < 1000000000; i++) {} Console.WriteLine((DateTime.Now – start).TotalMilliseconds); } } } 据我所知,答案是否定的,但我不知道是否有隐藏的编译器选项,我可能没试过。 我确保在发布模式下编译并在没有附加调试器的情况下运行,但仍然需要700毫秒才能运行此空循环。 我也试过NGEN同样的结果(虽然我的理解是它应该产生与JIT相同的编译代码,对吧?)。 但是我以前从未使用过NGEN,可能使用错了。 看起来这对于JIT来说很容易找到和优化,但是对于一般情况下抖动的工作知之甚少,我很好奇是否有一个特定的原因,这种优化会被遗漏。 VC ++编译器肯定似乎做了这个优化,所以我想知道为什么会出现这种差异。 有任何想法吗?

C#/ XNA – 乘法比分区更快?

我最近看到一条推文让我很困惑(这是由XNA编码器在编写XNA游戏时发布的): 当天的微优化提示:在可能的情况下,在高频区域使用乘法而不是除法。 它的速度提高了几个周期。 我很惊讶,因为我一直认为编译器非常聪明(例如,使用位移),最近读了Shawn Hargreaves的一篇文章说了很多相同的事情 。 我想知道这有多少真相,因为我的游戏中有很多计算。 我询问,希望有一个样本,但原始的海报无法给出一个。 然而,他这样说: 不一定是“center = width / 2”之类的东西。 我已经确定“是的,这是值得的”。 🙂 所以,我很好奇…… 任何人都可以给出一些代码示例,您可以将分区更改为乘法并获得性能增益,而C#编译器本身无法执行相同的操作。

调用空函数需要多长时间?

我有一个实现接口的项目列表。 对于这个问题,让我们使用这个示例界面: interface Person { void AgeAYear(); } 有两个class级 class NormalPerson : Person { int age = 0; void AgeAYear() { age++; //do some more stuff… } } class ImmortalPerson : Person { void AgeAYear() { //do nothing… } } 由于其他原因,我需要他们两个列表。 但是对于这个调用,当我循环遍历Person列表时,我可能正在调用空函数。 这会对性能产生影响吗? 如果是这样,多少钱? 对于所有意图和目的,空函数是否会被优化掉? 注意:在真实示例中, ImmortalPerson还有其他具有代码的方法 – 它不仅仅是一个什么都不做的对象。

何时使用volatile来抵消C#中的编译器优化

我花了很多周时间在C#4.0中进行multithreading编码。 但是,有一个问题对我来说仍然没有答案。 我知道volatile关键字阻止编译器将变量存储在寄存器中,从而避免无意中读取过时值。 写入在.Net中始终是易变的,因此任何说明它也避免了stales写入的文档都是多余的。 我也知道编译器优化有些“不可预测”。 以下代码将说明由于编译器优化而导致的停顿(在VS之外运行发布编译时): class Test { public struct Data { public int _loop; } public static Data data; public static void Main() { data._loop = 1; Test test1 = new Test(); new Thread(() => { data._loop = 0; } ).Start(); do { if (data._loop != 1) { break; } //Thread.Yield(); } while […]