aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Document.cxx10
-rw-r--r--src/EditView.cxx49
-rw-r--r--src/ElapsedPeriod.h35
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