VTD自动驾驶仪可以线程安全吗?

时间:2013-05-24 05:22:27

标签: vtd-xml

使用Java 2.11版本。我正在构建一个基于CD Catalog数据绑定示例的xml绑定组件。我有一个相当复杂但相当小的doc 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文档。如果我们可以重复使用自动驾驶仪而不是创建新的飞行员,那将是很好的。

我记得在某个地方读书创建一个自动驾驶台,但这并不好玩,特别是在你有十几个自动驾驶仪的地方。

1 个答案:

答案 0 :(得分:1)

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

另请注意,不要在循环中的任何类型的XPath评估中编译XPath表达式,因为它会减慢你的速度。尽可能将它从循环中取出。

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