什么构成昂贵的方法或资源?

时间:2008-12-10 01:32:07

标签: c#

经常提到异常是昂贵的,.NET中的各种方法也很昂贵。

究竟什么构成了.NET中昂贵的方法?

该方法需要花费的时间吗?例如。我使用WebClient对象得到了网页的响应流(这不是异步),当获得响应并将其分配给变量时,需要一段时间来逐步完成这行代码。也许是因为网页本身是图形密集和大。为了看到所花费的时间,我知道我可以使用秒表或计时器(这两者之间存在细微差别,我记不清了。)

或者是资源?如果是这样,查看方法所需资源的最佳方法是什么?我知道我可以使用其中一种GC方法或分析器。还有其他什么方法?

4 个答案:

答案 0 :(得分:9)

昂贵是程度和背景的问题。

我在图像处理方面工作,我觉得分工很贵。在我的情况下,任何最终在一个循环中执行两到五百万次的操作就会增加。这可能是1/8秒和1/32秒之间的差异。 UI时间的1/8秒对动态显示来说很重要。 1/32是可以接受的。

在其他情况下,它可能是对大型JPEG图像进行完全解码并将其缩小,而不是利用同样文件中编码的2个缩小版本的功能。

在网页时间内,它可能是页面加载时服务器点击次数。明白我的意思?

语境就是一切。

资源被认为是昂贵的,如果它们稀缺并导致其他事情等待。如果你有一个非raid磁盘,如果两个进程在整个地方反弹,你需要付出沉重的代价,因此很大程度上依赖于驱动器和操作系统中的缓存。

您的打印机是一种非常昂贵的资源,特别是如果它没有纸张,因此就是队列。

与其他语言功能相比,例外情况很昂贵。静态方法调用很便宜。普通方法调用稍贵一些。虚方法调用稍贵一些。例外情况要贵得多。

例如,您可以抱怨C#没有类型强的多态返回类型,我可以说 - 哦不,它确实 - 只是抛出结果并在另一侧捕获正确的类型。然后我被嘲笑出房间提出建议。与返回(几乎没有指令)相比,异常可能会导致几十到几百个,具体取决于上下文。

答案 1 :(得分:1)

是的,当人们谈论功能昂贵时,它们通常意味着执行时间。 (调用它所支付的价格是你的线程被阻塞了X微秒,直到函数调用完成,毕竟)

当然,它在资源使用方面也可能很昂贵,但通常是人们所指的执行时间。

答案 2 :(得分:0)

答案是你有两种类型的昂贵操作。

我个人使用RedGate的ANTs Profiler来模拟应用程序事件的时间和内存方面以及成本。

答案 3 :(得分:0)

我同意plint,但我想补充一点,昂贵通常意味着某些东西需要的时间或资源比你想象的要多,或者比你给定的情况需要更多的资源。一般来说,如果存在使用较少cpu或更合适的资源的替代方案,则某些内容会很昂贵。

例如,由于构造堆栈跟踪所需的时钟周期量,异常被认为是昂贵的。因此,将异常用作流控制机制是一个非常糟糕的主意。因此,如果您正在解析自定义数据格式并且格式错误,则返回具有失败状态和字符串的对象(格式错误的数据行6,位置3)可能会更好,而不是抛出MalformedDataException。

但是,是的,昂贵是一个程度和观点的问题。对于CPU设计者来说,缓存未命中是一种灾难。因此,分工是昂贵的。对我来说,硬盘访问是昂贵的。