<div dir="ltr">Hi,<div><br></div><div>I have noticed a decrease in performance when switching from VTK5 to VTK6.</div><div>This is related to the number of actors in the scene and the pipeline updates.</div><div><br></div>
<div>Here I use VTK Rendering TimeRenderer test to compare the 2 versions. To average the timing, the render loop has been increased from 360 to 3600 iterations. Here are some results:</div><div> VTK 5: 100 actors: 13.5s</div>
<div> VTK 6: 100 actors: 13.5s (100%)</div><div> VTK 5: 300 actors: 13.1s</div><div> VTK 6: 300 actors: 15.6s (115%)</div><div> VTK 5: 600 actors: 13.1s</div><div> VTK 6: 600 actors: 21.3s (163%)</div><div> VTK 5: 1000 actors: 15.1s</div>
<div> VTK 6: 1000 actors: 33.5s (222%)</div><div><br></div><div>A simpler test that only calls GetBounds() multiple times on a vtkPolyDataMapper produces the following time-ordered-backtraces:</div><div>VTK 5:</div><div>
<div>
Running Time<span class="" style="white-space:pre"> </span>Self<span class="" style="white-space:pre"> </span>Symbol Name</div><div>221.5ms 100.0%<span class="" style="white-space:pre"> </span>0.6<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span>vtkPolyDataMapper::GetBounds()</div>
<div>122.0ms 55.0%<span class="" style="white-space:pre"> </span>0.6<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::Update(int)</div>
<div>090.0ms 40.6%<span class="" style="white-space:pre"> </span>0.4<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::UpdateInformation()</div>
<div>019.3ms 8.7%<span class="" style="white-space:pre"> </span>1.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::PropagateUpdateExtent(int)</div>
<div>009.6ms 4.3%<span class="" style="white-space:pre"> </span>1.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::ProcessRequest(vtkInformation*, vtkInformationVector**, vtkInformationVector*)</div>
<div>001.0ms 0.4%<span class="" style="white-space:pre"> </span>1.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutive::CheckAlgorithm(char const*, vtkInformation*)</div>
<div>000.4ms 0.1%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::UpdateData(int)</div>
<div>000.2ms 0.0%<span class="" style="white-space:pre"> </span>0.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkAlgorithm::GetNumberOfOutputPorts()</div>
<div>000.2ms 0.0%<span class="" style="white-space:pre"> </span>0.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformationIntegerKey::Set(vtkInformation*, int)</div>
<div>000.2ms 0.0%<span class="" style="white-space:pre"> </span>0.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformation::Has(vtkInformationRequestKey*)</div>
<div>000.1ms 0.0%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformationRequestKey::Has(vtkInformation*)</div>
<div>000.1ms 0.0%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutive::GetOutputInformation()</div>
<div>000.1ms 0.0%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::REQUEST_UPDATE_EXTENT()</div>
<div>000.0ms 0.0%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutiveInternals::GetInputInformation(int)</div>
<div>000.0ms 0.0%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::UpdateDataObject()</div>
<div>000.0ms 0.0%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::ProcessRequest(vtkInformation*, vtkInformationVector**, vtkInformationVector*)</div>
<div>000.0ms 0.0%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::REQUEST_DATA()</div>
<div>064.2ms 28.9%<span class="" style="white-space:pre"> </span>1.7<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkPolyDataMapper::Update()</div>
<div>027.5ms 12.4%<span class="" style="white-space:pre"> </span>1.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkPainterPolyDataMapper::ComputeBounds()</div>
<div>002.1ms 0.9%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutive::GetNumberOfInputConnections(int)</div>
<div>000.8ms 0.3%<span class="" style="white-space:pre"> </span>0.8<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkClipPlanesPainter::UpdateBounds(double*)</div>
<div>000.7ms 0.3%<span class="" style="white-space:pre"> </span>0.7<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkPainter::GetDelegatePainter()<br>
</div><div>000.6ms 0.2%<span class="" style="white-space:pre"> </span>0.6<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDataObject::SetUpdateExtent(int, int, int)</div>
<div>000.5ms 0.2%<span class="" style="white-space:pre"> </span>0.4<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkPainter::UpdateBounds(double*)</div>
</div><div><br></div><div>VTK 6:</div><div><div><div>Running Time<span class="" style="white-space:pre"> </span>Self<span class="" style="white-space:pre"> </span>Symbol Name</div><div>1077.5ms 100.0%<span class="" style="white-space:pre"> </span>2.6<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span>vtkPolyDataMapper::GetBounds()</div>
<div>846.6ms 78.5%<span class="" style="white-space:pre"> </span>0.7<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::Update(int)</div>
<div>335.7ms 31.1%<span class="" style="white-space:pre"> </span>2.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::PropagateTime(int)</div>
<div>298.3ms 27.6%<span class="" style="white-space:pre"> </span>1.3<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::UpdateTimeDependentInformation(int)</div>
<div>123.8ms 11.4%<span class="" style="white-space:pre"> </span>1.4<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::PropagateUpdateExtent(int)</div>
<div>068.4ms 6.3%<span class="" style="white-space:pre"> </span>0.4<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::UpdateInformation()</div>
<div>009.2ms 0.8%<span class="" style="white-space:pre"> </span>1.6<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::ProcessRequest(vtkInformation*, vtkInformationVector**, vtkInformationVector*)</div>
<div>000.6ms 0.0%<span class="" style="white-space:pre"> </span>0.6<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformationIntegerKey::Set(vtkInformation*, int)<br>
</div><div>000.5ms 0.0%<span class="" style="white-space:pre"> </span>0.5<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutive::GetOutputInformation()</div>
<div>000.4ms 0.0%<span class="" style="white-space:pre"> </span>0.4<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformation::Set(vtkInformationRequestKey*)</div>
<div>000.4ms 0.0%<span class="" style="white-space:pre"> </span>0.4<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformationRequestKey::Set(vtkInformation*)</div>
<div>000.3ms 0.0%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::UpdateData(int)</div>
<div>000.3ms 0.0%<span class="" style="white-space:pre"> </span>0.3<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformation::Set(vtkInformationIntegerKey*, int)</div>
<div>000.3ms 0.0%<span class="" style="white-space:pre"> </span>0.3<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkAlgorithm::GetNumberOfOutputPorts()</div>
<div>000.2ms 0.0%<span class="" style="white-space:pre"> </span>0.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformation::Has(vtkInformationRequestKey*)</div>
<div>000.2ms 0.0%<span class="" style="white-space:pre"> </span>0.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutiveInternals::GetInputInformation(int)</div>
<div>000.1ms 0.0%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutive::CheckAlgorithm(char const*, vtkInformation*)</div>
<div>000.1ms 0.0%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::UpdateDataObject()</div>
<div>000.1ms 0.0%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::ProcessRequest(vtkInformation*, vtkInformationVector**, vtkInformationVector*)</div>
<div>000.1ms 0.0%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkInformationRequestKey::Has(vtkInformation*)</div>
<div>000.0ms 0.0%<span class="" style="white-space:pre"> </span>0.0<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutive::GetInputInformation()</div>
<div>0080.8ms 7.4%<span class="" style="white-space:pre"> </span>0.8<span class="" style="white-space:pre"> </span> <span style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkDemandDrivenPipeline::UpdateInformation()</div>
<div>0048.6ms 4.5%<span class="" style="white-space:pre"> </span>1.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkPainterPolyDataMapper::ComputeBounds()</div>
<div>0030.5ms 2.8%<span class="" style="white-space:pre"> </span>1.9<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::SetUpdateExtent(vtkInformation*, int, int, int)</div>
<div>0021.7ms 2.0%<span class="" style="white-space:pre"> </span>0.6<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkAlgorithm::GetInputAlgorithm(int, int)</div>
<div>0010.3ms 0.9%<span class="" style="white-space:pre"> </span>2.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkStreamingDemandDrivenPipeline::ProcessRequest(vtkInformation*, vtkInformationVector**, vtkInformationVector*)</div>
<div>007.5ms 0.6%<span class="" style="white-space:pre"> </span>4.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkPainter::UpdateBounds(double*)</div>
<div>005.8ms 0.5%<span class="" style="white-space:pre"> </span>1.2<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkAlgorithm::GetInputInformation(int, int)</div>
<div>005.2ms 0.4%<span class="" style="white-space:pre"> </span>0.9<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkAlgorithm::UpdateInformation()</div>
<div>002.4ms 0.2%<span class="" style="white-space:pre"> </span>0.1<span class="" style="white-space:pre"> </span> <span class="" style="white-space:pre"> </span><span style="white-space:pre"> </span>vtkExecutive::GetNumberOfInputConnections(int)</div>
</div></div><div><br></div><div><br></div><div>Calling SetStatic() on all the mappers improve things:</div><div> VTK 5: 100 actors: 6.7s</div><div> VTK 6: 100 actors: 6.7s (100%)</div><div> VTK 5: 1000 actors: 6.7s</div>
<div>
VTK 6: 1000 actors: 8.4s (125%)</div><div>While the performance is still hit, it is more acceptable. However, for my use case, making my mappers static is not an option. </div><div><br></div><div>A hack to disable the time propagation also improve things a bit:</div>
<div><div> VTK 5: 100 actors: 6.7s</div><div> VTK 6: 100 actors: 6.7s (100%)</div><div> VTK 5: 1000 actors: 15.1s</div><div> VTK 6: 1000 actors: 20.0s (132%)</div></div><div>While time propagation is responsible for a large part of the slowness, it still does not explain 100% of the performance decrease.</div>
<div><br></div><div>Any suggestion ? </div><div>As a quick fix, we could improve the "Static" property of the mappers by specifying if the mapper input is "time static" (e.g. vtkMapper::SetStatic(2) or vtkMapper::SetTimeStatic(1)).</div>
<div><br></div><div>Thanks,</div><div>Julien.</div><div>p.s. TimeRenderer currently segfaults in VTK6 trunk due to a missing auto-initialization.</div></div>