Brad,
My opinion is that this has been an issue for many years, and that the cost
benefit is not worth trying to squeeze this into this release cycle. The
results are (or at least should be) the same both before and after this change.
The backlog of new features and other performance improvements are beginning to
back up on the gerrit dashboard, so I would definitely vote for cutting ITKv4.2
as soon as possible so that all other projects can start moving forward again.
My guess is that the main culprits of those failing tests are related to
following 15 lines of code.
==============================
johnsonhj@neuron$ git grep "\->GetInput()\->GetPixel"
Modules/Filtering/DistanceMap/include/itkSignedMaurerDistanceMapImageFilter.hxx:
if ( this->GetInput()->GetPixel(idx) != this->m_BackgroundValue )
Modules/Filtering/ImageGrid/include/itkCyclicShiftImageFilter.hxx:
outIt.Set( static_cast< OutputImagePixelType >( this->GetInput()->GetPixel(
index ) ) );
Modules/Filtering/MathematicalMorphology/include/itkGrayscaleConnectedClosingImageFilter.hxx:
seedValue = this->GetInput()->GetPixel(m_Seed);
Modules/Filtering/MathematicalMorphology/include/itkGrayscaleConnectedOpeningImageFilter.hxx:
seedValue = this->GetInput()->GetPixel(m_Seed);
Modules/Numerics/Statistics/include/itkScalarImageToRunLengthMatrixFilter.hxx:
pixelIntensity = this->GetInput()->GetPixel( index );
Modules/Numerics/Statistics/test/itkSubsampleTest.cxx:
ArrayPixelImageType::PixelType pixel = filter->GetInput()->GetPixel(index);
Modules/Segmentation/Voronoi/include/itkVoronoiPartitioningImageFilter.hxx:
getp = (double)( this->GetInput()->GetPixel(Plist[i]) );
Modules/Segmentation/Voronoi/include/itkVoronoiSegmentationImageFilter.hxx:
getp = (double)( this->GetInput()->GetPixel(Plist[i]) );
~/Dashboard/src/ITK (master)
johnsonhj@neuron$
~/Dashboard/src/ITK (master)
johnsonhj@neuron$ git grep "\->GetInput()\->Transform"
Modules/Core/Mesh/include/itkBinaryMask3DMeshSource.hxx:
this->GetInput()->TransformContinuousIndexToPhysicalPoint(indTemp,new_p);
Modules/Nonunit/Review/include/itkScalarChanAndVeseDenseLevelSetImageFilter.hxx:
this->GetInput()->TransformPhysicalPointToIndex(origin, start);
Modules/Nonunit/Review/include/itkScalarChanAndVeseSparseLevelSetImageFilter.hxx:
this->GetInput()->TransformPhysicalPointToIndex(origin, start);
Modules/Nonunit/Review/include/itkStochasticFractalDimensionImageFilter.hxx:
this->GetInput()->TransformIndexToPhysicalPoint(It.GetIndex(i), point1);
Modules/Nonunit/Review/include/itkStochasticFractalDimensionImageFilter.hxx:
this->GetInput()->TransformIndexToPhysicalPoint(It.GetIndex(j),
point2);
Modules/Numerics/Statistics/include/itkScalarImageToRunLengthMatrixFilter.hxx:
this->GetInput()->TransformIndexToPhysicalPoint(
Modules/Numerics/Statistics/include/itkScalarImageToRunLengthMatrixFilter.hxx:
this->GetInput()->TransformIndexToPhysicalPoint( lastGoodIndex, point );
==============================
Hans
--
Hans J. Johnson, Ph.D.
[email protected]<mailto:[email protected]>
Assistant Professor of Psychiatry
University of Iowa Carver College of Medicine
W278 GH, 200 Hawkins Drive
Iowa City, Iowa 52242
Phone: 319-353-8587
From: Bradley Lowekamp <[email protected]<mailto:[email protected]>>
Date: Tuesday, July 3, 2012 9:26 AM
To: ITK <[email protected]<mailto:[email protected]>>
Cc: "[email protected]<mailto:[email protected]>"
<[email protected]<mailto:[email protected]>>, Hans Johnson
<[email protected]<mailto:[email protected]>>, Luis Ibanez
<[email protected]<mailto:[email protected]>>
Subject: [Insight-developers] Performance Impact of using GetInput
Hello,
A user yesterday, was reporting that going from ITK 3.20 to ITK 4.1, the
SignedMaurerDistanceMapImageFilter was running more that 2x-3x the time. With a
little bit of poking around and sampling the run time, I was able to develop
the following patch:
http://review.source.kitware.com/#/c/6367/
I find that difference to be quite significant difference, and is on the level
of a bug.
The lead me to wonder how wide spread is this incorrect usage. So I added an
atomic counter to the GetInput, and GetOutput methods, and when they exceed a
threshold, an exception is throw. This is to detect when these methods may be
used in an inner loop.
http://review.source.kitware.com/#/c/6369/
I get the following test failure (where previously there was none):
97% tests passed, 71 tests failed out of 2382
The following tests FAILED:
160 - itkN4BiasFieldCorrectionImageFilterTest1 (Failed)
161 - itkN4BiasFieldCorrectionImageFilterTest2 (Failed)
311 - itkMultiThreaderEnvTest88 (Failed)
313 - itkMultiThreaderEnvTest123 (Failed)
398 - itkFFTConvolutionImageFilterTest4x4Mean (Failed)
399 - itkFFTConvolutionImageFilterTest4x5Mean (Failed)
400 - itkFFTConvolutionImageFilterTest5x5Mean (Failed)
401 - itkFFTConvolutionImageFilterTest4x4MeanValidRegion (Failed)
402 - itkFFTConvolutionImageFilterTest4x5MeanValidRegion (Failed)
403 - itkFFTConvolutionImageFilterTest5x5MeanValidRegion (Failed)
420 - itkRichardsonLucyDeconvolutionImageFilterGaussianKernelTest (Failed)
421 - itkRichardsonLucyDeconvolutionImageFilterIrregularKernelTest (Failed)
422 - itkLandweberDeconvolutionImageFilterGaussianKernelTest (Failed)
423 - itkLandweberDeconvolutionImageFilterIrregularKernelTest (Failed)
425 - itkProjectedLandweberDeconvolutionImageFilterGaussianKernelTest (Failed)
426 - itkProjectedLandweberDeconvolutionImageFilterIrregularKernelTest (Failed)
427 - itkInverseDeconvolutionImageFilterGaussianKernelTest (Failed)
428 - itkInverseDeconvolutionImageFilterIrregularKernelTest (Failed)
429 - itkTikhonovDeconvolutionImageFilterGaussianKernelTest (Failed)
430 - itkTikhonovDeconvolutionImageFilterIrregularKernelTest (Failed)
431 - itkWienerDeconvolutionImageFilterGaussianKernelTest (Failed)
432 - itkWienerDeconvolutionImageFilterIrregularKernelTest (Failed)
433 - itkParametricBlindLeastSquaresDeconvolutionImageFilterTest (Failed)
436 - itkDeformableSimplexMesh3DBalloonForceFilterTest (Failed)
440 - itkPatchBasedDenoisingImageFilterTest0 (Failed)
441 - itkPatchBasedDenoisingImageFilterTestGaussian (Failed)
442 - itkPatchBasedDenoisingImageFilterTestRician (Failed)
443 - itkPatchBasedDenoisingImageFilterTestPoisson (Failed)
521 - itkDisplacementFieldToBSplineImageFilterTest (Failed)
524 - itkContourMeanDistanceImageFilterTest (Failed)
525 - itkContourDirectedMeanDistanceImageFilterTest (Failed)
530 - itkHausdorffDistanceImageFilterTest (Failed)
532 - itkSignedMaurerDistanceMapImageFilterTest1 (Failed)
533 - itkSignedMaurerDistanceMapImageFilterTest2 (Failed)
656 - itkFastMarchingImageFilterTest_torus_multipleSeeds_NoTopo (Failed)
657 - itkFastMarchingImageFilterTest_torus_multipleSeeds_StrictTopo (Failed)
658 - itkFastMarchingImageFilterTest_torus_multipleSeeds_NoHandlesTopo (Failed)
659 - itkFastMarchingImageFilterTest_wm_multipleSeeds_NoTopo (Failed)
660 - itkFastMarchingImageFilterTest_wm_multipleSeeds_StrictTopo (Failed)
661 - itkFastMarchingImageFilterTest_wm_multipleSeeds_NoHandlesTopo (Failed)
1072 - itkBSplineControlPointImageFilterTest2 (Failed)
1079 - itkCyclicShiftImageFilterTest0 (Failed)
1080 - itkCyclicShiftImageFilterTest1 (Failed)
1081 - itkCyclicShiftImageFilterTest2 (Failed)
1082 - itkCyclicShiftImageFilterTest3 (Failed)
1083 - itkCyclicShiftImageFilterTest4 (Failed)
1084 - itkCyclicShiftImageFilterTest5 (Failed)
1085 - itkCyclicShiftImageFilterTest6 (Failed)
1195 - itkModulusImageFilterTest (Failed)
1377 - itkExtensionVelocitiesImageFilterTest (Failed)
1378 - itkCannySegmentationLevelSetImageFilterTest (Failed)
1412 - itkTwoLevelSetsv4DenseImage2DTest (Failed)
1471 - itkSimplexMeshVolumeCalculatorTest (Failed)
1659 - itkBinaryMask3DQuadEdgeMeshSourceTest (Failed)
1747 - itkPointSetToPointSetRegistrationTest (Failed)
1774 - itkDiffeomorphicDemonsRegistrationFilterTest01 (Failed)
1775 - itkDiffeomorphicDemonsRegistrationFilterTest02 (Failed)
1776 - itkDiffeomorphicDemonsRegistrationFilterTest03 (Failed)
1777 - itkDiffeomorphicDemonsRegistrationFilterTest04 (Failed)
1778 - itkDiffeomorphicDemonsRegistrationFilterTest05 (Failed)
1779 - itkDiffeomorphicDemonsRegistrationFilterTest06 (Failed)
1780 - itkDiffeomorphicDemonsRegistrationFilterTest07 (Failed)
1781 - itkDiffeomorphicDemonsRegistrationFilterTest08 (Failed)
1782 - itkDiffeomorphicDemonsRegistrationFilterTest09 (Failed)
1783 - itkDiffeomorphicDemonsRegistrationFilterTest10 (Failed)
1784 - itkDiffeomorphicDemonsRegistrationFilterTest11 (Failed)
1802 - itkFastSymmetricForcesDemonsRegistrationFilterTest (Failed)
2166 - itkVoronoiSegmentationImageFilterTest (Failed)
How big of a deal if most of the filters here are running 2x+ slower then what
they should be? Is it big enough to delay the Release and do another RC with
the fixes?
I have also been looking at the methods used in GetInput, specifically the
methods used to create the std::string... It seems to be if we change the
return value to a const std::string &, then we could keep a static internal
table of the common value and return reference to the static table to even,
references to what is in the std::map, the would reduce the need for mallocs
for std::string.
Thoughts on what to do?
Brad
========================================================
Bradley Lowekamp
Medical Science and Computing for
Office of High Performance Computing and Communications
National Library of Medicine
[email protected]<mailto:[email protected]>
________________________________
Notice: This UI Health Care e-mail (including attachments) is covered by the
Electronic Communications Privacy Act, 18 U.S.C. 2510-2521, is confidential and
may be legally privileged. If you are not the intended recipient, you are
hereby notified that any retention, dissemination, distribution, or copying of
this communication is strictly prohibited. Please reply to the sender that you
have received the message in error, then delete it. Thank you.
________________________________
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php
Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ
Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-developers