【发布时间】:2011-05-08 13:06:20
【问题描述】:
至少在 java 中,代理模式有很多开销——我不记得确切的数字,但是当包装微小的方法时,代理需要的时间大约是包装方法的 50 倍。这就是为什么java.awt.image.BufferedImage.setRGB&getRGB真的慢的原因;大约有三个代理包装了实际的byte[]。
为什么50次?!为什么代理不只是加倍时间?
编辑:=(
对于 SO 来说似乎很平常,我得到了一堆答案,告诉我我的问题是错误的。它不是。查看 BufferedImage 或其他一些真正的代理模式,而不是那些微基准。事实上,如果您必须对 BufferedImage 进行大量像素操作并且您知道它的结构,那么您可以通过手动撤消代理来实现上述巨大的加速;见this answer。
哦,还有here's 我的 50 倍来源。正如文章所详述的那样,代理在包装需要很长时间时不会受到明显的惩罚,但是如果你包装一个小方法,它们确实会有很大的痛苦开销。
【问题讨论】:
-
“我不记得确切的数字,但是当包装微小的方法时,代理需要的时间大约是包装方法的 50 倍。” 对不起,你会需要为此引用参考。听起来你在重复一些 Java 仇恨者的 FUD。
-
我在某处读到 Java 代理比本地代码快 50 倍。那里!问题解决了。
-
@Vuntic:尝试解决您提出的问题的人(显然是通过和大规模投票)是幼稚的,说得好听点。您采用了一个特定的代理并从中得出了完全错误的结论。如果您不喜欢被指出来,我很抱歉。
-
@vuntic:并且你歪曲了那篇文章所说的。注意:“在我们继续之前,让我们首先意识到这里添加的开销是固定的。如果 doIt() 方法本身需要 5 秒,则绝对不是的情况,代理调用需要 50 倍的时间。不,相反,调用需要 5 秒 + 约 500 纳秒。” (他的重点,不是我的)
-
T.J. 中的方法下面的克劳德的例子,是很小,几乎可以用任何你可以提供的“微小”定义。他的时间安排几乎说明了整个故事。
标签: java proxy-pattern