3

使用 Java 2.11 版本。我正在基于 CD 目录数据绑定示例构建一个 xml 绑定组件。我有一个相当复杂但相当小的文档,大约 2000 字节。而且 AutoPilot.bind() 似乎很慢......

int count = 10000;
long start = System.nanoTime();

for(int i = 0; i <= count; i++)
{
    //Init VTDGen, VTGNav here...

    AutoPilot ap0 = new Autopilot();
    AutoPilot ap1 = new Autopilot();
    AutoPilot ap2 = new Autopilot();
    AutoPilot ap3 = new Autopilot();
    AutoPilot ap4 = new Autopilot();

    // Set the XPAth for auto pilots here...
    // Read bytes and parse...

    // Bind autopilot to NAV.

    MyObj mine = new MyObj();

    // Do data binding here to My Object here...
}

long end = System.nanoTime();
long avgTime = (end - start) / count;

硬件 = 3GH 8 核英特尔

平均解析时间约为 80000 纳秒。

现在,如果您将 Autopilot 的创建移出循环,则平均解析时间为 10000 纳秒。

当然,这很有效,因为我们一遍又一遍地解析同一个文档。现在想象一下像 servlet 这样的服务器场景,其中每个请求都解析接收到的 XML 文档。如果我们可以重复使用自动驾驶仪而不是创建一个新的自动驾驶仪,那就太好了。

我记得在某个地方阅读过创建一个自动驾驶仪池,但这并不好玩,尤其是在您拥有十几个自动驾驶仪的情况下。

4

1 回答 1

1

我认为您可能想要做的是为每个线程创建一些包含 XPath 表达式的 autoPilot 对象。假设您必须创建 10 个线程都处理 XPath /a/b/c,那么您只需实例化 10 个线程,每个线程编译相同的表达式,从而避免共享问题。

另请注意,不要在任何类型的 XPath 评估 while 循环中编译 XPath 表达式,因为它会减慢您的速度。尽可能将其排除在循环之外。

管理线程池可能很有意义,因为您可以重用 AutoPilot 对象,并避免重复编译 XPath 表达式。拥有 AutoPilot 线程安全可能不是一个好主意,因为它会导致您的线程停止,等待另一个线程释放锁。

于 2013-05-26T20:08:40.223 回答