我不知道那个“50 倍”的数字是从哪里来的,但这很可疑。可能是一个特定的代理比它所代理的要慢得多,这取决于他们每个人在做什么,但是从这一点概括地说“代理模式如此缓慢”是采取一个非常戏剧性和高度质疑的方式逻辑上的飞跃。
尝试这个:
Thingy.java
:
public class Thingy
{
public int foo(int param1, int param2)
{
return param2 - param1;
}
}
ThingyProxy.java
:
public class ThingyProxy
{
Thingy thingy;
public ThingyProxy()
{
this.thingy = new Thingy();
}
public int foo(int param1, int param2)
{
return this.thingy.foo(param1, param2);
}
}
WithoutProxy.java
:
public class WithoutProxy
{
public static final void main(String[] args)
{
Thingy t;
int sum;
int counter;
int loops;
sum = 0;
t = new Thingy();
for (loops = 0; loops < 300000000; ++loops) {
sum = 0;
for (counter = 0; counter < 100000000; ++counter) {
sum += t.foo(1, 2);
}
if (sum != 100000000) {
System.out.println("ERROR");
return;
}
}
System.exit(0);
}
}
WithProxy.java
:
public class WithProxy
{
public static final void main(String[] args)
{
ThingyProxy t;
int sum;
int counter;
int loops;
sum = 0;
t = new ThingyProxy();
for (loops = 0; loops < 300000000; ++loops) {
sum = 0;
for (counter = 0; counter < 100000000; ++counter) {
sum += t.foo(1, 2);
}
if (sum != 100000000) {
System.out.println("ERROR");
return;
}
}
System.exit(0);
}
}
在我的机器上进行简单的试验:
$ time java withoutProxy
实际0m0.894s
用户 0m0.900s
系统 0m0.000s
$ 时间 java WithProxy
实际0m0.934s
用户 0m0.940s
系统 0m0.000s
$ time java withoutProxy
实际0m0.883s
用户 0m0.850s
系统 0m0.040s
$ 时间 java WithProxy
真正的 0m0.937s
用户 0m0.920s
系统 0m0.030s
$ time java withoutProxy
实际0m0.898s
用户 0m0.880s
系统 0m0.030s
$ 时间 java WithProxy
实际0m0.936s
用户 0m0.950s
系统 0m0.000s
稍微慢一点?是的。慢 50 倍?不。
现在,为 JVM 计时是出了名的困难,并且像上面这样的简单实验必然是值得怀疑的。但我认为可能会出现 50 倍的差异。
编辑:我应该提到上面有非常非常少的循环发布这样的数字:
实际0m0.058s
用户 0m0.040s
系统 0m0.020s
...这让您了解环境中的 VM 启动时间。例如,上面的时间主要不是虚拟机启动,实际执行时间只有一微秒的差异,它们主要是执行时间。