NEW: Added CMake option JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT, which activates several runtime-measurement guards of type JKQTPAutoOutputTimer (output via qDebug())

This commit is contained in:
jkriege2 2024-01-08 17:14:03 +01:00
parent b02db2eb93
commit 3fee9609fb
8 changed files with 67 additions and 7 deletions

View File

@ -25,6 +25,9 @@ endif()
if(NOT DEFINED JKQtPlotter_BUILD_WITH_PRECOMPILED_HEADERS)
option(JKQtPlotter_BUILD_WITH_PRECOMPILED_HEADERS "Build the library using precompiled headers to improve compile speed" ON)
endif()
if(NOT DEFINED JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT)
option(JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT "Build the library to output extra timing information using Debug()" OFF)
endif()
if(NOT DEFINED JKQtPlotter_ENABLED_CXX20)
option(JKQtPlotter_ENABLED_CXX20 "Build the library using C++20" OFF)
endif()

View File

@ -24,11 +24,21 @@ if(JKQtPlotter_BUILD_INCLUDE_XITS_FONTS)
else()
message( STATUS "XITS fonts: NOT AVAILABLE IN LIB" )
endif(JKQtPlotter_BUILD_INCLUDE_XITS_FONTS)
if(JKQtPlotter_BUILD_INCLUDE_FIRAMATH_FONTS)
message( STATUS "FIRA fonts: LINKED IN" )
else()
message( STATUS "FIRA fonts: NOT AVAILABLE IN LIB" )
endif(JKQtPlotter_BUILD_INCLUDE_FIRAMATH_FONTS)
if(${JKQtPlotter_HAS_NO_PRINTER_SUPPORT})
message( STATUS "Print support: OFF" )
else()
message( STATUS "Print support: ON" )
endif()
if(${JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT})
message( STATUS "Timing Info output: OFF" )
else()
message( STATUS "Timing Info output: ON" )
endif()
if (JKQtPlotter_BUILD_WITH_PRECOMPILED_HEADERS)
message( STATUS "Precompiled Header: ON" )
else()

View File

@ -81,6 +81,10 @@ function(JKQtCommon_setDefaultLibOptions TARGETNAME)
target_compile_options(${TARGETNAME} PUBLIC /EHsc)
target_compile_definitions(${TARGETNAME} PUBLIC NOMINMAX)
endif()
if(JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT)
target_compile_definitions(${TARGETNAME} PRIVATE JKQTBP_AUTOTIMER)
endif()
target_include_directories(${TARGETNAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/../>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>

View File

@ -148,6 +148,9 @@ function(JKQtMathText_setDefaultLibOptions TARGETNAME)
if(JKQtPlotter_BUILD_INCLUDE_FIRAMATH_FONTS)
target_compile_definitions(${TARGETNAME} PRIVATE JKQTMATHTEXT_COMPILED_WITH_FIRAMATH)
endif(JKQtPlotter_BUILD_INCLUDE_FIRAMATH_FONTS)
if(JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT)
target_compile_definitions(${TARGETNAME} PRIVATE JKQTBP_AUTOTIMER)
endif()
# precomiled headers to speed up compilation
if (JKQtPlotter_BUILD_WITH_PRECOMPILED_HEADERS)

View File

@ -23,6 +23,7 @@
#include "jkqtmathtext/nodes/jkqtmathtextnode.h"
#include "jkqtcommon/jkqtpcodestructuring.h"
#include "jkqtcommon/jkqtpstringtools.h"
#include "jkqtcommon/jkqtpdebuggingtools.h"
#include "jkqtmathtext/nodes/jkqtmathtextnodetools.h"
#include "jkqtmathtext/nodes/jkqtmathtexttextnode.h"
#include "jkqtmathtext/nodes/jkqtmathtextbracenode.h"
@ -297,6 +298,9 @@ void JKQTMathText::saveSettings(QSettings& settings, const QString& group) const
bool JKQTMathText::parse(const QString &markup, DefaultParserTypes markupType, ParseOptions options)
{
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTMathText[%1]::parse('%2')").arg(objectName()).arg(markup));
#endif
if (markupType==LatexParser) return parse<JKQTMathTextLatexParser>(markup, options);
return false;
}
@ -1250,6 +1254,9 @@ void JKQTMathText::modifyEnvironmentFromFontSettings(JKQTMathTextEnvironment &ev
JKQTMathTextNodeSize JKQTMathText::getSizeDetail(QPainter &painter)
{
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTMathText[%1]::getSizeDetail()").arg(objectName()));
#endif
JKQTMathTextNodeSize s;
if (getNodeTree()!=nullptr) {
JKQTMathTextEnvironment ev;
@ -1265,6 +1272,9 @@ void JKQTMathText::draw(QPainter &painter, QPointF x, bool drawBoxes)
}
double JKQTMathText::draw(QPainter& painter, double x, double y, bool drawBoxes){
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTMathText[%1]::draw(x,y)").arg(objectName()));
#endif
if (getNodeTree()!=nullptr) {
painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();});
painter.setPen(fontColor);
@ -1279,6 +1289,9 @@ double JKQTMathText::draw(QPainter& painter, double x, double y, bool drawBoxes)
}
void JKQTMathText::draw(QPainter& painter, unsigned int flags, QRectF rect, bool drawBoxes) {
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTMathText[%1]::draw(rect)").arg(objectName()));
#endif
if (getNodeTree()!=nullptr) {
painter.save(); auto __finalpaint=JKQTPFinally([&painter]() {painter.restore();});
painter.setPen(fontColor);
@ -1309,6 +1322,9 @@ void JKQTMathText::draw(QPainter& painter, unsigned int flags, QRectF rect, bool
QPixmap JKQTMathText::drawIntoPixmap(bool drawBoxes, QColor backgroundColor, int sizeincrease, qreal devicePixelRatio)
{
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTMathText[%1]::drawIntoPixmap()").arg(objectName()));
#endif
// 1. generate dummy QPixmap that is needed to use a QPainter
// we need the dummy, because we first need to determine the size of the render output
// for which we need a QPainter.
@ -1351,6 +1367,9 @@ QPixmap JKQTMathText::drawIntoPixmap(bool drawBoxes, QColor backgroundColor, int
QImage JKQTMathText::drawIntoImage(bool drawBoxes, QColor backgroundColor, int sizeincrease, qreal devicePixelRatio, unsigned int resolution_dpi)
{
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTMathText[%1]::drawIntoImage()").arg(objectName()));
#endif
// 1. generate dummy QPixmap that is needed to use a QPainter
// we need the dummy, because we first need to determine the size of the render output
// for which we need a QPainter.
@ -1397,6 +1416,9 @@ QImage JKQTMathText::drawIntoImage(bool drawBoxes, QColor backgroundColor, int s
QPicture JKQTMathText::drawIntoPicture(bool drawBoxes)
{
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTMathText[%1]::drawIntoPicture()").arg(objectName()));
#endif
// 1. generate dummy QPixmap that is needed to use a QPainter
// we need the dummy, because we first need to determine the size of the render output
// for which we need a QPainter.

View File

@ -208,7 +208,9 @@ function(JKQtPlottter_setDefaultLibOptions TARGETNAME)
set_property(TARGET ${TARGETNAME} PROPERTY CXX_STANDARD ${JKQtPlotter_QT_CXX_STANDARD})
set_property(TARGET ${TARGETNAME} PROPERTY CXX_STANDARD_REQUIRED ${JKQtPlotter_QT_CXX_STANDARD_REQUIRED})
target_compile_features(${TARGETNAME} PUBLIC ${JKQtPlotter_QT_CXX_COMPILE_FEATURE})
#target_compile_definitions(${TARGETNAME} PRIVATE JKQTBP_AUTOTIMER)
if(JKQtPlotter_BUILD_WITH_TIMING_INFO_OUTPUT)
target_compile_definitions(${TARGETNAME} PRIVATE JKQTBP_AUTOTIMER)
endif()
if(MINGW)
# COMPILER-SETTINGS FOR MINGW

View File

@ -127,8 +127,13 @@ JKQTMathTextNodeSize JKQTBasePlotter::getTextSizeDetail(const QFont &fm, const Q
JKQTMathTextNodeSize JKQTBasePlotter::getTextSizeDetail(const QString &fontName, double fontSize, const QString &text, QPainter& painter)
{
thread_local QHash<JKQTBasePlotter::textSizeKey, JKQTMathTextNodeSize> s_TextSizeDataCache;
JKQTBasePlotter::textSizeKey dh(fontName, fontSize, text, painter.device());
static QReadWriteLock s_TextSizeLock;
thread_local QHash<JKQTBasePlotter::textSizeKey, JKQTMathTextNodeSize> s_TextSizeDataCache;
QReadLocker lockR(&s_TextSizeLock);
if (s_TextSizeDataCache.contains(dh)) return s_TextSizeDataCache[dh];
lockR.unlock();
QWriteLocker lockW(&s_TextSizeLock);
if (s_TextSizeDataCache.contains(dh)) return s_TextSizeDataCache[dh];
mathText.setFontSpecial(fontName);
mathText.setFontSize(fontSize);
@ -863,6 +868,9 @@ void JKQTBasePlotter::calcPlotScaling(JKQTPEnhancedPainter& painter){
// this needs to be done twice, as the kay size calculation needs the internalPlotWidth and internalPlotHeight
// for a second step
for (int i=0; i<2; i++) {
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTBasePlotter[%1]::calcPlotScaling()::iteration%2").arg(objectName()).arg(i+1));
#endif
internalPlotMargins[PlotMarginUse::muKey]=PlotMargin();
switch(internalPlotKeyDescription.keyLocation) {
@ -1252,7 +1260,7 @@ void JKQTBasePlotter::drawPlotLabel(JKQTPEnhancedPainter& painter) {
void JKQTBasePlotter::drawPlot(JKQTPEnhancedPainter& painter) {
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaaot("JKQTBasePlotter::paintPlot");
JKQTPAutoOutputTimer jkaaot("JKQTBasePlotter::drawPlot()");
#endif
#if QT_VERSION<QT_VERSION_CHECK(6,0,0)
@ -3752,9 +3760,11 @@ bool JKQTBasePlotter::saveAsPixelImage(const QString& filename, bool displayPrev
}
if (!displayPreview || exportpreview(gridPrintingSize, false)) {
QElapsedTimer timer;
timer.start();
QImage png(QSizeF(double(printSizeX_Millimeter)+outputSizeIncrease.width(), double(printSizeY_Millimeter)+outputSizeIncrease.height()).toSize(), QImage::Format_ARGB32);
png.fill(Qt::transparent);
const double durPrepImage=timer.nsecsElapsed();
{
JKQTPEnhancedPainter painter;
painter.begin(&png);
@ -3772,8 +3782,14 @@ bool JKQTBasePlotter::saveAsPixelImage(const QString& filename, bool displayPrev
exportpreviewPaintRequested(painter, QSize(jkqtp_roundTo<int>(printSizeX_Millimeter), jkqtp_roundTo<int>(printSizeY_Millimeter)));
painter.end();
}
if (form=="NONE") return png.save(fn);
else return png.save(fn, form.toLatin1().data());
const double durPlot=timer.nsecsElapsed()-durPrepImage;
bool res=false;
if (form=="NONE") res= png.save(fn);
else res= png.save(fn, form.toLatin1().data());
const double durAll=timer.nsecsElapsed();
const double durSave=durAll-durPlot;
qDebug()<<"durPrepImage="<<durPrepImage/1e6<<"ms, durPlot="<<durPlot/1e6<<"ms, durSave="<<durSave/1e6<<"ms, durAll="<<durAll/1e6<<"ms";
return res;
}
}

View File

@ -542,7 +542,7 @@ int JKQTPCoordinateAxis::calcLinearUnitDigits() {
void JKQTPCoordinateAxis::calcPlotScaling(bool force) {
#ifdef JKQTBP_AUTOTIMER
JKQTPAutoOutputTimer jkaat(QString("JKQTBasePlotter[%1]::calcPlotScaling()").arg(objectName()));
JKQTPAutoOutputTimer jkaat(QString("JKQTPCoordinateAxis[%1]::calcPlotScaling()").arg(objectName()));
#endif
if (!doUpdateScaling) return;
if (!force && !paramsChanged) return;