2009-10-09 64 views
3

是否有某些原因导致相同的数学运算在一个Silverlight应用程序中比另一个Silverlight应用程序花费的时间要长得多?silverlight数学性能问题

例如,我有一些代码需要一个点列表并将它们转换(缩放和转换它们)并填充另一个点列表。重要的是我保持原始点完好无损,因此是第二个列表。

下面是相关的代码(规模为双和原产地是一个点):

public Point transformPoint(Point point) { 
     // scale, then translate the x 
     point.X = (point.X - origin.X) * scale; 
     // scale, then translate the y 
     point.Y = (point.Y - origin.Y) * scale; 
     // return the point 
     return point; 
    } 

以下是我正在做的循环和时间,在情况下,它是很重要的:

  DateTime startTime = DateTime.Now; 
     foreach (Point point in rawPoints) transformedPoints.Add(transformPoint(point)); 
     Debug.Print("ASPX milliseconds: {0}", (DateTime.Now - startTime).Milliseconds); 

在运行14356点(不要问,它是在桌面应用程序中模拟一个真实的世界数字),故障如下:

Silverlight应用程序#1:46毫秒

Silverlight应用程序#2:859毫秒

第一个应用程序是一个空的应用程序,它在MainPage构造函数中执行循环。第二个是在另一个类的方法中执行循环,我想在GUI线程的事件处理程序中调用该方法。但是,如果考虑到循环内部发生了相同的操作,是否应该考虑这一点?

在线程工作或其他方面我可能缺少一些巨大的东西,但这种差异对我来说根本没有意义。

+3

请使用System.Diagnostics.StopWatch来测试您的代码并发布结果。使用DataTime是非常不准确的。 – ParmesanCodice 2009-10-09 21:52:31

+3

另外 - 也许这是显而易见的 - 确保你在这两种情况下测量版本构建。 – 2009-10-09 21:54:39

回答

2

除了其他意见和回答我要去的线路有点之间的阅读。

在第一个应用程序中,您几乎可以在MainPage构造函数中单独运行此代码。 IWO您已经创建了一个新的Silverlight应用程序,并将此代码放在其中,这就是它。

在第二个应用程序中,你有更多的真实世界的东西。至少你有这个代码作为一个简单的用户界面的按钮点击的结果运行。这就是线索。

拿一个空白的应用程序,并放下一个按钮。运行它并点击按钮,按钮有什么作用?有动画附加到按钮的视觉状态。当您单击按钮时,此动画(或其他动画或循环)可能与您的代码平行运行。定时器(无论您是否使用StopWatch正确执行)都会记录已用时间,而不仅仅是您线程的时间。因此,当其他线程正在做其他事情时(比如动画),你的计时将会关闭。

+0

这是我怀疑的情况。由另一个组件或另一个线程完成的工作正在减慢我的数学运算速度。该页面上唯一的其他控件是ESRI Silverlight地图,它也响应导致重绘我的观点的鼠标移动。但是电脑*真的很快 - 无论它做什么都不应该消耗太多的处理器时间,它会导致一些相当简单的数学运算,像它们一样磨碎...... – Klay 2009-10-12 03:37:23

1

我的第一个怀疑是Silverlight App#2会触发垃圾回收。缩放〜15,000点应该花费一毫秒,而不是将近一秒。

尝试减少代码中的内存分配。转换点可以是一个数组,而不是一个动态增长的数据结构?

你也可以看看GC performance counters,但简单地减少内存分配可能会变得更简单。

+0

最初,当我创建了rawPoints列表时,我还将每个点添加到了转换点列表中,因此它们总是具有相同的大小,并且在程序运行过程中没有内存分配。据我所知,如果列表的大小从不改变,那么数组和列表之间没有性能差异。 – Klay 2009-10-10 16:26:36

+0

此外,这并没有说明为什么这两个应用程序执行得如此不同。 – Klay 2009-10-10 16:27:55