1. 03 Feb, 2019 1 commit
  2. 19 Jan, 2019 1 commit
  3. 18 Jan, 2019 1 commit
  4. 05 Jan, 2019 1 commit
  5. 03 Jan, 2019 1 commit
  6. 02 Jan, 2019 2 commits
  7. 21 Dec, 2018 1 commit
  8. 20 Dec, 2018 1 commit
  9. 06 Dec, 2018 4 commits
  10. 11 Nov, 2018 2 commits
  11. 09 Nov, 2018 1 commit
  12. 29 Oct, 2018 1 commit
  13. 23 Oct, 2018 1 commit
  14. 21 Oct, 2018 1 commit
  15. 16 Oct, 2018 1 commit
  16. 12 Oct, 2018 3 commits
    • StefanBruens's avatar
      SplashXPathScanner: Force inlining of addIntersection · a32fb958
      StefanBruens authored
      The majority of the code in addIntersection can be optimized away for
      vertical (x0 == x1) and horizontal (count == 0) segments, thus the inlined
      code is less than the function call setup alone.
      This leaves diagonal segments as the only remaining call site, i.e.
      inlining here is a net win as well.
      
      Reduces runtime for #57 (fdo#96728, runsforever-poppler.pdf) from 1442 seconds
      to 1239 seconds (86%), and #24 (fdo#78728, surf-types.pdf) from ~ 5.0 seconds
      to 4.7 seconds.
      a32fb958
    • StefanBruens's avatar
      SplashXPathScanner: Move more invariant code out of the loop · 97f310b1
      StefanBruens authored
      "seg->x0 - seg->y0 * seg->dxdy" is constant and can be moved out of the
      loop.
      The next start point is the old end point. Thus, only the new x coordinate
      has to clamped (segXMin <= xx1 <= segXMax), also do the 'floor' operation
      just once per loop.
      
      According to valgrind/callgrind, this reduces instruction count in
      computeIntersections() for #24 (fdo#78728) by 6%. No change for fdo#96728.
      97f310b1
    • StefanBruens's avatar
      SplashXPathScanner: Move invariant checks out of addIntersection loop · d8ba50c6
      StefanBruens authored
      For horizontal segments, count is always 0. For vertical/diagonal segments,
      the count depends on the winding rule (EvenOdd/NonZero) and the direction,
      but is constant for each segment.
      
      Reduces runtime for #57 (fdo#96728) from 1773 seconds to 1442 seconds (81%).
      d8ba50c6
  17. 10 Oct, 2018 1 commit
    • Adam Reichold's avatar
      Remove usage of pragmas interface and implementation · 7f20ace4
      Adam Reichold authored
      GCC recommends not using them for a long time and its documentation says:
      > These #pragmas have been superceded as of GCC 2.7.2 by COMDAT support
      > and the “key method” heuristic mentioned in Vague Linkage.
      > Using them can actually cause your program to grow due to
      > unnecessary out-of-line copies of inline functions.
      
      Also nobody seems to set USE_GCC_PRAGMAS and sometimes they were
      guarded by just __GNUC__ which upsets Clang.
      7f20ace4
  18. 05 Oct, 2018 5 commits
    • StefanBruens's avatar
      SplashXPathScanner: Reduce complexity of sorting spans · 0118e221
      StefanBruens authored
      For complex paths, a significant amount of time is spent in
      SplashXPathScanner::computeIntersections, more specifically with
      sorting the spans in y/x order.
      
      Instead of using one large array for all spans, use a 2-dimensional
      structure.  As the number of y positions is known upfront, it is
      possible to create an array for the y dimension and insert the spans
      directly at the appropriate position.
      
      For Y rows with X spans per row, this reduces the complexity for sorting
      from O( Y*X log Y*X) to O( Y * X log X), i.e. a reduction by log Y.
      
      For the documents from #57 (fdo#96728) and #24 (fdo#78728), the
      runtime/memory is significantly reduced (according to /usr/bin/time -v):
      (1) $> pdftoppm -r 18 -aa no runsforever-poppler.pdf
      (2) $> pdftoppm surf-types.pdf
      
      Before/After
                                        runsforever-poppler |    surf-types
      User time (seconds):                2979.80 / 2348.08 |  9.45 /  7.76
      Maximum resident set size (kbytes):   51208 /   46288 | 18084 / 14076
      0118e221
    • StefanBruens's avatar
      SplashXPathScanner: Clamp y range to yMin/yMax outside the loop · 7ef04b56
      StefanBruens authored
      Instead of implicitly clamping by setting interIdx == interEnd, calculate
      the first and last y position outside the loop, and use these as loop
      bounds.
      7ef04b56
    • StefanBruens's avatar
      SplashXPathScanner: Move state out of SplashXPathScanner for iterating spans · 68fdbfd0
      StefanBruens authored
      Iterating through spans is independent of the spans itself. Moving the
      iteration to a seperate class allows to keep the iteration state out
      of SplashXPathScanner, and also allows to move invariant code out of
      getNextSpan(...).
      68fdbfd0
    • Adam Reichold's avatar
      Remove GooList::append since the single element variant is... · 101728e8
      Adam Reichold authored
      Remove GooList::append since the single element variant is std::vector::push_back and the list variant is used only once.
      101728e8
    • Adam Reichold's avatar
  19. 04 Oct, 2018 7 commits
  20. 23 Sep, 2018 1 commit
  21. 20 Sep, 2018 1 commit
  22. 31 Aug, 2018 2 commits