mirror of
https://github.com/wolfpld/tracy.git
synced 2025-03-20 07:40:02 +08:00
Consistently print fixed-width percentages.
This commit is contained in:
parent
f4581c398c
commit
a27d23524c
@ -26,6 +26,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
#include "../common/TracyForceInline.hpp"
|
#include "../common/TracyForceInline.hpp"
|
||||||
|
|
||||||
@ -77,6 +78,42 @@ static tracy_force_inline void RealToStringInteger( char* buf, char* end )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
int DigitsLeftOfDecimalPoint( T val ) {
|
||||||
|
int digits = 1;
|
||||||
|
T absVal = std::abs( val );
|
||||||
|
T maxAbsValForCurrentDigits = 10;
|
||||||
|
while( absVal >= maxAbsValForCurrentDigits ) {
|
||||||
|
++digits;
|
||||||
|
maxAbsValForCurrentDigits *= static_cast<T>( 10 );
|
||||||
|
}
|
||||||
|
return digits;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
int CharsLeftOfDecimalPoint( T val ) {
|
||||||
|
int extraChars = std::signbit( val ) ? 1 : 0;
|
||||||
|
return extraChars + DigitsLeftOfDecimalPoint( val );
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
int DigitsRightOfDecimalPoint( T val, int maxChars ) {
|
||||||
|
int charsLeftOfPoint = CharsLeftOfDecimalPoint( val );
|
||||||
|
if( charsLeftOfPoint > maxChars ) {
|
||||||
|
fprintf( stderr, "Maximum of %d chars is insufficient to print value %g\n",
|
||||||
|
maxChars, val );
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
if ( charsLeftOfPoint == maxChars ) {
|
||||||
|
// maxChars is just large enough for the integer part, no room left for
|
||||||
|
// a decimal point.
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
assert( charsLeftOfPoint < maxChars );
|
||||||
|
return maxChars - 1 - charsLeftOfPoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
@ -99,6 +136,28 @@ static inline char* PrintFloat( char* begin, char* end, T value )
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Similar to PrintFloat, but prints exactly `fixedWidth` characters,
|
||||||
|
// right-justified.
|
||||||
|
template<typename T>
|
||||||
|
char* PrintFloatFixedWidth( char* begin, char* end, T value, int fixedWidth ) {
|
||||||
|
int digitsRight = detail::DigitsRightOfDecimalPoint( value, fixedWidth );
|
||||||
|
char buf[32];
|
||||||
|
char* bufEnd = buf + sizeof buf;
|
||||||
|
char* printEnd = PrintFloat( buf, bufEnd, value, digitsRight );
|
||||||
|
int width = printEnd - buf;
|
||||||
|
assert( width <= fixedWidth );
|
||||||
|
char* dstPtr = begin;
|
||||||
|
for( int i = width; i < fixedWidth; ++i ) {
|
||||||
|
assert( end > begin );
|
||||||
|
*dstPtr++ = ' ';
|
||||||
|
}
|
||||||
|
assert( end > dstPtr + width );
|
||||||
|
memcpy( dstPtr, buf, width );
|
||||||
|
dstPtr += width;
|
||||||
|
assert(dstPtr == begin + fixedWidth);
|
||||||
|
return dstPtr;
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NO_CHARCONV
|
#ifndef NO_CHARCONV
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static inline const char* RealToString( T val )
|
static inline const char* RealToString( T val )
|
||||||
|
|||||||
@ -2873,6 +2873,14 @@ static bool PrintPercentage( float val, uint32_t col = 0xFFFFFFFF )
|
|||||||
return ImGui::IsWindowHovered() && ImGui::IsMouseHoveringRect( wpos, wpos + ImVec2( stw * 7, ty ) );
|
return ImGui::IsWindowHovered() && ImGui::IsMouseHoveringRect( wpos, wpos + ImVec2( stw * 7, ty ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void PrintPercentageUnformattedFixedWidth( float val, uint32_t col )
|
||||||
|
{
|
||||||
|
char buf[16];
|
||||||
|
char *afterFloat = PrintFloatFixedWidth( buf, buf + sizeof buf, val, 4 );
|
||||||
|
memcpy( afterFloat, "% ", 3 );
|
||||||
|
TextColoredUnformatted( col, buf );
|
||||||
|
}
|
||||||
|
|
||||||
void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const AddrStat& ipcnt, const AddrStatData& as, Worker* worker, const View* view )
|
void SourceView::RenderLine( const Tokenizer::Line& line, int lineNum, const AddrStat& ipcnt, const AddrStatData& as, Worker* worker, const View* view )
|
||||||
{
|
{
|
||||||
const auto scale = GetScale();
|
const auto scale = GetScale();
|
||||||
@ -4174,27 +4182,7 @@ void SourceView::RenderHwLinePart( size_t cycles, size_t retired, size_t branchR
|
|||||||
{
|
{
|
||||||
const float rate = float( branchRel ) / branchRelMax;
|
const float rate = float( branchRel ) / branchRelMax;
|
||||||
uint32_t col = GetGoodnessColor( 1.f - rate * 3.f );
|
uint32_t col = GetGoodnessColor( 1.f - rate * 3.f );
|
||||||
if( rate >= 1.f )
|
PrintPercentageUnformattedFixedWidth( rate * 100.f, col );
|
||||||
{
|
|
||||||
TextColoredUnformatted( col, " 100% " );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[16];
|
|
||||||
if( rate >= 0.1f )
|
|
||||||
{
|
|
||||||
const auto end = PrintFloat( buf, buf+16, rate * 100, 1 );
|
|
||||||
assert( end == buf+4 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*buf = ' ';
|
|
||||||
const auto end = PrintFloat( buf+1, buf+16, rate * 100, 1 );
|
|
||||||
assert( end == buf+4 );
|
|
||||||
}
|
|
||||||
memcpy( buf+4, "% ", 3 );
|
|
||||||
TextColoredUnformatted( col, buf );
|
|
||||||
}
|
|
||||||
if( ImGui::IsItemHovered() )
|
if( ImGui::IsItemHovered() )
|
||||||
{
|
{
|
||||||
UnsetFont();
|
UnsetFont();
|
||||||
@ -4218,25 +4206,7 @@ void SourceView::RenderHwLinePart( size_t cycles, size_t retired, size_t branchR
|
|||||||
{
|
{
|
||||||
const float rate = float( cacheRel ) / cacheRelMax;
|
const float rate = float( cacheRel ) / cacheRelMax;
|
||||||
uint32_t col = GetGoodnessColor( 1.f - rate * 3.f );
|
uint32_t col = GetGoodnessColor( 1.f - rate * 3.f );
|
||||||
if( rate >= 1.f )
|
PrintPercentageUnformattedFixedWidth( rate * 100.f, col );
|
||||||
{
|
|
||||||
TextColoredUnformatted( col, " 100%" );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[16];
|
|
||||||
const auto end = PrintFloat( buf, buf+16, rate * 100, 1 );
|
|
||||||
memcpy( end, "%", 2 );
|
|
||||||
if( end - buf == 4 )
|
|
||||||
{
|
|
||||||
TextColoredUnformatted( col, buf );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ImGui::SameLine( 0, ts.x );
|
|
||||||
TextColoredUnformatted( col, buf );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( ImGui::IsItemHovered() )
|
if( ImGui::IsItemHovered() )
|
||||||
{
|
{
|
||||||
UnsetFont();
|
UnsetFont();
|
||||||
@ -4263,31 +4233,7 @@ void SourceView::RenderHwLinePart( size_t cycles, size_t retired, size_t branchR
|
|||||||
const bool unreliable = branchRetired < 10;
|
const bool unreliable = branchRetired < 10;
|
||||||
const float rate = float( branchMiss ) / branchRetired;
|
const float rate = float( branchMiss ) / branchRetired;
|
||||||
uint32_t col = unreliable ? 0x44FFFFFF : GetGoodnessColor( 1.f - rate * 3.f );
|
uint32_t col = unreliable ? 0x44FFFFFF : GetGoodnessColor( 1.f - rate * 3.f );
|
||||||
if( branchMiss == 0 )
|
PrintPercentageUnformattedFixedWidth( rate * 100.f, col );
|
||||||
{
|
|
||||||
TextColoredUnformatted( col, " 0% " );
|
|
||||||
}
|
|
||||||
else if( rate >= 1.f )
|
|
||||||
{
|
|
||||||
TextColoredUnformatted( col, " 100% " );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[16];
|
|
||||||
if( rate >= 0.1f )
|
|
||||||
{
|
|
||||||
const auto end = PrintFloat( buf, buf+16, rate * 100, 1 );
|
|
||||||
assert( end == buf+4 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*buf = ' ';
|
|
||||||
const auto end = PrintFloat( buf+1, buf+16, rate * 100, 1 );
|
|
||||||
assert( end == buf+4 );
|
|
||||||
}
|
|
||||||
memcpy( buf+4, "% ", 3 );
|
|
||||||
TextColoredUnformatted( col, buf );
|
|
||||||
}
|
|
||||||
if( ImGui::IsItemHovered() )
|
if( ImGui::IsItemHovered() )
|
||||||
{
|
{
|
||||||
UnsetFont();
|
UnsetFont();
|
||||||
@ -4313,31 +4259,7 @@ void SourceView::RenderHwLinePart( size_t cycles, size_t retired, size_t branchR
|
|||||||
const bool unreliable = cacheRef < 10;
|
const bool unreliable = cacheRef < 10;
|
||||||
const float rate = float( cacheMiss ) / cacheRef;
|
const float rate = float( cacheMiss ) / cacheRef;
|
||||||
uint32_t col = unreliable ? 0x44FFFFFF : GetGoodnessColor( 1.f - rate * 3.f );
|
uint32_t col = unreliable ? 0x44FFFFFF : GetGoodnessColor( 1.f - rate * 3.f );
|
||||||
if( cacheMiss == 0 )
|
PrintPercentageUnformattedFixedWidth( rate * 100.f, col );
|
||||||
{
|
|
||||||
TextColoredUnformatted( col, " 0%" );
|
|
||||||
}
|
|
||||||
else if( rate >= 1.f )
|
|
||||||
{
|
|
||||||
TextColoredUnformatted( col, " 100%" );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[16];
|
|
||||||
if( rate >= 0.1f )
|
|
||||||
{
|
|
||||||
const auto end = PrintFloat( buf, buf+16, rate * 100, 1 );
|
|
||||||
assert( end == buf+4 );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*buf = ' ';
|
|
||||||
const auto end = PrintFloat( buf+1, buf+16, rate * 100, 1 );
|
|
||||||
assert( end == buf+4 );
|
|
||||||
}
|
|
||||||
memcpy( buf+4, "%", 2 );
|
|
||||||
TextColoredUnformatted( col, buf );
|
|
||||||
}
|
|
||||||
if( ImGui::IsItemHovered() )
|
if( ImGui::IsItemHovered() )
|
||||||
{
|
{
|
||||||
UnsetFont();
|
UnsetFont();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user