diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Document.cxx | 10 | ||||
-rw-r--r-- | src/EditView.cxx | 49 | ||||
-rw-r--r-- | src/ElapsedPeriod.h | 35 |
3 files changed, 71 insertions, 23 deletions
diff --git a/src/Document.cxx b/src/Document.cxx index e576c5db3..6efcb37fa 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -18,6 +18,7 @@ #include <forward_list> #include <algorithm> #include <memory> +#include <chrono> #ifndef NO_CXX11_REGEX #include <regex> @@ -43,6 +44,7 @@ #include "Document.h" #include "RESearch.h" #include "UniConversion.h" +#include "ElapsedPeriod.h" using namespace Scintilla; @@ -2108,9 +2110,9 @@ void Document::StyleToAdjustingLineDuration(Sci::Position pos) { const double alpha = 0.25; const Sci::Line lineFirst = SciLineFromPosition(GetEndStyled()); - ElapsedTime etStyling; + ElapsedPeriod epStyling; EnsureStyledTo(pos); - const double durationStyling = etStyling.Duration(); + const double durationStyling = epStyling.Duration(); const Sci::Line lineLast = SciLineFromPosition(GetEndStyled()); if (lineLast >= lineFirst + 8) { // Only adjust for styling multiple lines to avoid instability @@ -2924,7 +2926,7 @@ Sci::Position Cxx11RegexFindText(const Document *doc, Sci::Position minPos, Sci: bool caseSensitive, Sci::Position *length, RESearch &search) { const RESearchRange resr(doc, minPos, maxPos); try { - //ElapsedTime et; + //ElapsedPeriod ep; std::regex::flag_type flagsRe = std::regex::ECMAScript; // Flags that apper to have no effect: // | std::regex::collate | std::regex::extended; @@ -2969,7 +2971,7 @@ Sci::Position Cxx11RegexFindText(const Document *doc, Sci::Position minPos, Sci: // Example - search in doc/ScintillaHistory.html for // [[:upper:]]eta[[:space:]] // On MacBook, normally around 1 second but with locale imbued -> 14 seconds. - //double durSearch = et.Duration(true); + //const double durSearch = ep.Duration(true); //Platform::DebugPrintf("Search:%9.6g \n", durSearch); return posMatch; } catch (std::regex_error &) { diff --git a/src/EditView.cxx b/src/EditView.cxx index 8522ba419..5c9bb7ff4 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -21,6 +21,7 @@ #include <algorithm> #include <iterator> #include <memory> +#include <chrono> #include "Platform.h" @@ -53,6 +54,7 @@ #include "EditModel.h" #include "MarginView.h" #include "EditView.h" +#include "ElapsedPeriod.h" using namespace Scintilla; @@ -2010,11 +2012,12 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan } // Loop on visible lines - //double durLayout = 0.0; - //double durPaint = 0.0; - //double durCopy = 0.0; - //ElapsedTime etWhole; - +#if defined(TIME_PAINTING) + double durLayout = 0.0; + double durPaint = 0.0; + double durCopy = 0.0; + ElapsedPeriod epWhole; +#endif const bool bracesIgnoreStyle = ((vsDraw.braceHighlightIndicatorSet && (model.bracesMatchStyle == STYLE_BRACELIGHT)) || (vsDraw.braceBadLightIndicatorSet && (model.bracesMatchStyle == STYLE_BRACEBAD))); @@ -2044,15 +2047,18 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan // Copy this line and its styles from the document into local arrays // and determine the x position at which each character starts. - //ElapsedTime et; +#if defined(TIME_PAINTING) + ElapsedPeriod ep; +#endif if (lineDoc != lineDocPrevious) { ll.Set(0); ll.Set(RetrieveLineLayout(lineDoc, model)); LayoutLine(model, lineDoc, surface, vsDraw, ll, model.wrapWidth); lineDocPrevious = lineDoc; } - //durLayout += et.Duration(true); - +#if defined(TIME_PAINTING) + durLayout += ep.Duration(true); +#endif if (ll) { ll->containsCaret = !hideSelection && (lineDoc == lineCaret); ll->hotspot = model.GetHotSpotRange(); @@ -2077,8 +2083,9 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan } DrawLine(surface, model, vsDraw, ll, lineDoc, visibleLine, xStart, rcLine, subLine, phase); - //durPaint += et.Duration(true); - +#if defined(TIME_PAINTING) + durPaint += ep.Duration(true); +#endif // Restore the previous styles for the brace highlights in case layout is in cache. ll->RestoreBracesHighlight(rangeLine, model.braces, bracesIgnoreStyle); @@ -2100,7 +2107,9 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan lineWidthMaxSeen = std::max( lineWidthMaxSeen, static_cast<int>(ll->positions[ll->numCharsInLine])); - //durCopy += et.Duration(true); +#if defined(TIME_PAINTING) + durCopy += ep.Duration(true); +#endif } if (!bufferedDraw) { @@ -2112,9 +2121,10 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan } } ll.Set(0); - //if (durPaint < 0.00000001) - // durPaint = 0.00000001; - +#if defined(TIME_PAINTING) + if (durPaint < 0.00000001) + durPaint = 0.00000001; +#endif // Right column limit indicator PRectangle rcBeyondEOF = (vsDraw.marginInside) ? rcClient : rcArea; rcBeyondEOF.left = static_cast<XYPOSITION>(vsDraw.textStart); @@ -2138,11 +2148,12 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan } } } - //Platform::DebugPrintf("start display %d, offset = %d\n", pdoc->Length(), xOffset); - - //Platform::DebugPrintf( - //"Layout:%9.6g Paint:%9.6g Ratio:%9.6g Copy:%9.6g Total:%9.6g\n", - //durLayout, durPaint, durLayout / durPaint, durCopy, etWhole.Duration()); + //Platform::DebugPrintf("start display %d, offset = %d\n", model.pdoc->Length(), model.xOffset); +#if defined(TIME_PAINTING) + Platform::DebugPrintf( + "Layout:%9.6g Paint:%9.6g Ratio:%9.6g Copy:%9.6g Total:%9.6g\n", + durLayout, durPaint, durLayout / durPaint, durCopy, epWhole.Duration()); +#endif } } diff --git a/src/ElapsedPeriod.h b/src/ElapsedPeriod.h new file mode 100644 index 000000000..bbbc6d7fb --- /dev/null +++ b/src/ElapsedPeriod.h @@ -0,0 +1,35 @@ +// Scintilla source code edit control +/** @file ElapsedPeriod.h + ** Encapsulate C++ <chrono> to simplify use. + **/ +// Copyright 2018 by Neil Hodgson <neilh@scintilla.org> +// The License.txt file describes the conditions under which this software may be distributed. + +#ifndef ELAPSEDPERIOD_H +#define ELAPSEDPERIOD_H + +namespace Scintilla { + +// Simplified access to high precision timing. +class ElapsedPeriod { + std::chrono::high_resolution_clock::time_point tp; +public: + /// Capture the moment + ElapsedPeriod() : tp(std::chrono::high_resolution_clock::now()) { + } + /// Return duration as floating point seconds + double Duration(bool reset=false) { + std::chrono::high_resolution_clock::time_point tpNow = + std::chrono::high_resolution_clock::now(); + const std::chrono::duration<double> stylingDuration = + std::chrono::duration_cast<std::chrono::duration<double>>(tpNow - tp); + if (reset) { + tp = tpNow; + } + return stylingDuration.count(); + } +}; + +} + +#endif |