【问题标题】:C# Code optimizationC# 代码优化
【发布时间】:2009-06-15 19:54:30
【问题描述】:

谁能更快?为什么?

1:

Point point = new Point(25,25);   //any numbers..
Point point2 = new Point(20,95);  //any numbers..

Graphics g = CreateGraphics();
g.DrawLine(point,point2);

2:

Graphics g = CreateGraphics();
g.DrawLine(new Point(25,25),new Point(20,95));

【问题讨论】:

  • 建议您使用 System.Diagnostics.StopWatch 进行基准测试。问题对更广泛的受众几乎没有价值......
  • 我认为这个问题是有效的,不明白为什么不赞成!
  • 这个问题是有效的,但毫无意义。充其量是微优化,最坏的是偏好。
  • 我认为这个问题在广义上是有效的。我觉得 arul 的回答很有趣。
  • @Eric,谁能说这对 OP 毫无意义?

标签: c# .net optimization


【解决方案1】:

没有,因为两个 sn-ps 都将编译为相同的 MSIL 代码表示。

此外,这是一个微优化,您应该在真正知道它是瓶颈之前避免它。

【讨论】:

    【解决方案2】:

    两者都没有,除了可读性的损失(尤其是在 JITing 之后)之外,它们之间没有真正的区别。

    【讨论】:

    • 内存呢?我认为第一个在内存中创建两个点(对象),但第二个不在内存中创建?是这样吗????
    • @mavric - 以相同的方式创建 - 在堆栈上(至少我认为 Point 是一个结构)。即使是引用类型,唯一的区别是在 #1 中,在调试模式下,在您退出方法之前不会收集 Point 对象。在发布模式下,对象将具有相同的生命周期。
    【解决方案3】:

    微优化,嗯?一位著名的剧作家说code readability is more important than micro optimizations,我同意。

    【讨论】:

      【解决方案4】:

      两者都不是更快,最快的是避免在渲染路径中完全分配这些点并更早地预先创建它们的那个

      【讨论】:

        【解决方案5】:

        2 可能会更快,因为在将对象传递给 g.DrawLine 之前,您没有创建指向该对象的中间指针;但是,如果这是您使用 point 和 point2 的唯一地方,那么编译器可能会进行优化,因此二进制文件无论如何都是一样的。

        【讨论】:

          【解决方案6】:

          这完全取决于你在做什么。

          如果您几乎什么都不做(我对此表示怀疑),那么这就是“瓶颈”。

          如果这是“瓶颈”,那么您仍然不知道什么占主导地位:

          • 两个“new”以及相关的构造函数、析构函数和垃圾回收。

          • 实际渲染线条。

          第二个可能是不可避免的,但第一个只是出于风格原因。

          您可以通过分析或this simple method了解。

          或者您可以通过以下方式避免整个问题:

          g.DrawLine(25,25,20,95);
          

          【讨论】:

            猜你喜欢
            • 2012-11-13
            • 1970-01-01
            • 2013-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-01
            相关资源
            最近更新 更多