[vtkusers] vtkImageReader much faster than vtkImageReader2??

Marco Sambin m.sambin at gmail.com
Thu Jun 12 13:37:51 EDT 2014


Hi David,

first of all, thank you for your reply.
No, the difference is not related to disk caching issues. Here are two test
methods that I've written:


public static void testVTKImageReader()
  {
    long startTime = System.currentTimeMillis();

    vtkImageReader testReaderVTK =  new vtkImageReader();
    testReaderVTK.FileLowerLeftOn();
    testReaderVTK.SetFileDimensionality(3);
    testReaderVTK.SetFileName("C:\\Test\\SeriesVolume.raw");

    testReaderVTK.SetDataExtent(0, 511,
                          0, 511,
                          0, 520);
    testReaderVTK.SetDataSpacing(1.0, 1.0, 1.0);
    testReaderVTK.SetDataOrigin(0.0, 0.0, 0.0);
    testReaderVTK.SetDataScalarTypeToUnsignedShort();
    testReaderVTK.SetDataByteOrderToBigEndian();
    testReaderVTK.UpdateWholeExtent();

    long endTime = System.currentTimeMillis();

    System.out.println("Volume read by vtkImageReader. Total time millis =
" + (endTime - startTime));
  }

  public static void testVTKImageReader2()
  {
    long startTime = System.currentTimeMillis();

    vtkImageReader2 testReaderVTK =  new vtkImageReader2();
    testReaderVTK.FileLowerLeftOn();
    testReaderVTK.SetFileDimensionality(3);
    testReaderVTK.SetFileName("C:\\Test\\SeriesVolume.raw");

    testReaderVTK.SetDataExtent(0, 511,
                          0, 511,
                          0, 520);
    testReaderVTK.SetDataSpacing(1.0, 1.0, 1.0);
    testReaderVTK.SetDataOrigin(0.0, 0.0, 0.0);
    testReaderVTK.SetDataScalarTypeToUnsignedShort();
    testReaderVTK.SetDataByteOrderToBigEndian();
    testReaderVTK.UpdateWholeExtent();

    long endTime = System.currentTimeMillis();

    System.out.println("Volume read by vtkImageReader2. Total time millis =
" + (endTime - startTime));
  }

After doing a couple of "cold starts" in order to "warm up" disk caches, on
my test PC method "testVTKImageReader()" executes in around 2 seconds,
while method "testVTKImageReader2()" executes in around 10 seconds.
I've tried executing testVTKImageReader() before and testVTKImageReader2()
after or viceversa during the same execution session, but the result
doesn't change: testVTKImageReader() is always around 5 times faster than
testVTKImageReader2().

Can you guess why?
Thanks and best regards,

Marco Sambin



On Thu, Jun 12, 2014 at 7:12 PM, David Gobbi <david.gobbi at gmail.com> wrote:

> Hi Marco,
>
> When used the way they are in your example code, vtkImageReader and
> vtkImageReader2 should be exactly the same speed.
>
> Can you explain your testing methodology in more detail?  I suspect that
> when you tested vtkImageReader2, it was reading from disk, and when
> testing vtkImageReader, it was reading from disk cache.  The only part
> of the "read" operation that actually requires any CPU time is the byte
> swapping, but that should be identical for the two readers.
>
>  - David
>
>
> On Thu, Jun 12, 2014 at 11:00 AM, Marco Sambin <m.sambin at gmail.com> wrote:
> > Hi all.
> > I am reading a volume made up of a set of "slices" stored in a single
> large
> > raw file, containing just the raw pixels of each slice (unsigned short
> > values), one slice after the other. I know in advance image size,
> position,
> > orientation and spacing information related to each slice.
> > I used to read my input raw volume through the vtkImageReader2 class, as
> > documentation of vtkImageReader states:
> >
> > "vtkImageReader provides methods needed to read a region from a file. It
> > supports both transforms and masks on the input data, but as a result is
> > more complicated and slower than its parent class vtkImageReader2."
> >
> > so I always assumed vtkImageReader2 to be faster than vtkImageReader to
> read
> > a simple volume made up of a set of raw slices.
> > This until today, when I tried replacing my instance of vtkImageReader2
> with
> > an instance of vtkImageReader. Guess what? My volume reading code now
> > executes around 10 times faster!
> >
> > Is this expected? Can you guess what may be the reason for such a
> > significant difference in performance between vtkImageReader2 and
> > vtkImageReader, the latter being much faster in my scenario (despite what
> > the documentation states)?
> >
> > For completeness, I am using VTK 6.1 64-bit from Java 7 64-bit, under
> > Windows 7 Professional 64-bit. Here is a code fragment showing how I
> > configure my reader:
> >
> > [...]
> > imageReaderVTK =  new vtkImageReader(); // much slower if I use
> > "vtkImageReader2" here
> > imageReaderVTK.FileLowerLeftOn();
> > imageReaderVTK.SetFileDimensionality(3);
> > imageReaderVTK.SetFileName(curRawVolFile.getAbsolutePath());
> > imageReaderVTK.SetDataExtent(0, sliceCols - 1,
> >                       0, sliceRows - 1,
> >                       0, numOfUsedImages - 1);
> > imageReaderVTK.SetDataSpacing(xSpacing, ySpacing, zSpacing);
> > imageReaderVTK.SetDataOrigin(0.0, 0.0, 0.0);
> > imageReaderVTK.SetDataScalarTypeToUnsignedShort();
> > imageReaderVTK.SetDataByteOrderToBigEndian();
> > imageReaderVTK.UpdateWholeExtent();
> > [...]
> >
> > My typical input raw volume is made up of around 500 slices, each one
> > 512x512 pixels large.
> >
> > Thanks in advance for your feedback.
> > Best regards,
> >
> > Marco Sambin
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20140612/0df33c4c/attachment.html>


More information about the vtkusers mailing list