Optimize performance of ray/face intersection computation

Hello,

My application is performing ray/shape intersections computation using triangles and Octree to sort shape faces/triangles. It is pretty fast but I need to implement an alternative that provide more precision, so I try to use OpenCascade objects. TopoDS_Face bounds are stored in an Octree to quickly discriminate which face need to be tested and then I use IntCurvesFace_Intersector to get face intersections, it works well and the precision is good but it is much more slower than the triangle implementation.
My test case is composed by 91 shapes and there are 40000 ray/shape intersection tests performed. With triangle implementation it runs in ~2s, with the IntCurvesFace_Intersector implementation it runs in ~15s.
The profiler tells me that the performance bottleneck is with the classify test performed by BRepTopAdaptor_TopolTool class. All my objects are built once to avoid wasting time in object initialization.
Do you have any clue to optimize that process ? maybe some data structure can be introduced to pre-compute the classify test ?
I have to precise that I can't use multi-thread as the computation is already implementing it.

I don't know if it can help, but here is the pseudo code used :

std::vector<gp_Pnt> MyShapeIntersector::GetShapeIntersections(const TopoDS_Shape& pShape, const gp_Pnt& pStartPt, const gp_Dir& pDirection, double pDistanceMax)
{
	double lEpsilon = 1e-6;
	std::vector<gp_Pnt> lIntersections;
	// Create the ray
	gp_Lin lRay(pStartPt, pDirection);
	// Use octree to quickly discriminate which face bounds is intersected by ray
	std::vector<size_t> lIntersectedFaceList;
	this->GetOctreeRayIntersections(lIntersectedFaceList, &this->GetFacesOctree(pShape), lRay);

	for (size_t lFaceIndex : lIntersectedFaceList)
	{
		// Perform intersection on the intersected face using the dedicated intersector to this face
		Handle(IntCurvesFace_Intersector)    lFaceIntersector = this->GetFaceIntersector(pShape, pFaceIndex);
		lFaceIntersector->Perform(lRay, -lEpsilon, pDistanceMax);

		// Correctly done ?
		if (lFaceIntersector->IsDone())
		{
			// Iterate on each intersection found
			for (Standard_Integer j = 1 ; j <= lFaceIntersector->NbPnt() ; ++j)
			{
				gp_Pnt lOccInterPt = lFaceIntersector->Pnt(j);
				lIntersections.push_back(lOccInterPt);
			}
		}
	}
	return lIntersections;
}

Best regards,
Lucas